pku 3013

题目连接:http://acm.pku.edu.cn/JudgeOnline/problem?id=3013

神题。。。。。。。我wa了n次。。。TLE 了n次!

一开始看题,简单推导一下认为最短路径 Dijkstra就解决了,没想到一交就TLE,然后看了discuss说要用heap维护才能过,晕。。。heap是什么我都不知道、、然后开始学heap维护,网上没什么好的资料。。。。。我就 值学到一种用STL中proirty_queue的方法。。。。、、、以后要好好看看heap维护Dijkstra。。。。

代码:

#include <iostream> #include <algorithm> #include <queue> #include <stdio.h> using namespace std; typedef unsigned long long u64_T; const int MAX=50010; const u64_T INF=(u64_T)(1)<<63; struct Graph { int id; u64_T dist; Graph *next; }*G[MAX],area[4*MAX]; struct node { int id; u64_T len; bool operator<(const node &a)const { return len>a.len; } }; u64_T value[MAX]; int n,m,k; void addedge(int s,int e,u64_T w) { Graph *ptr=&area[k++]; ptr->id=e; ptr->dist=w; ptr->next=G[s]; G[s]=ptr; } u64_T Dijkstra() { priority_queue<node>Q; u64_T D[MAX]; for(int i=0;i<=n;i++){D[i]=INF;} D[1]=0; node cur; cur.id=1; cur.len=0; Q.push(cur); while(!Q.empty()) { int v=Q.top().id; u64_T len=Q.top().len; Q.pop(); if(len!=D[v]) continue; for(Graph *ptr=G[v];ptr;ptr=ptr->next) { int id=ptr->id; u64_T a=ptr->dist; if(D[id]>D[v]+a) { D[id]=D[v]+a; node rr; rr.id=id; rr.len=D[id]; Q.push(rr); } } } for(int i=1;i<=n;i++) { if(D[i]==INF) return INF; } u64_T ans=0; for(int i=1;i<=n;i++) ans+=value[i]*D[i]; return ans; } int main() { int T; scanf("%d",&T); while(T--) { k=0; scanf("%d %d",&n,&m); int a,b; u64_T v; for(int i=1;i<=n;i++) { scanf("%I64u",&value[i]); G[i]=NULL; } for(int i=0;i<m;i++) { scanf("%d %d %I64u",&a,&b,&v); addedge(a,b,v); addedge(b,a,v); } u64_T ans=Dijkstra(); if(!ans) printf("No Answer/n"); else printf("%I64u/n",ans); } return 0; }

 

你可能感兴趣的:(struct,null,Graph)