这个题目真是伤透脑筋了,一直RE,连着改了好几个版本,又是spfa,又是单调队列dijkstra+单调队列,总是不过,后来发现M开小了,双向边应该开m的两倍,悲剧啊!!!以后不管怎样,数组一定要尽量开大点。
折磨的真是痛苦,不过发现了一样好东西,http://uvatoolkit.com/problemssolve.php
uva一个测试工具,输入数据能够给出正确结果,以后不用辛苦到网上找AC代码了,直接输入结果。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #include <cstdlib> 5 #define N 20010 6 #define M 100010 7 #define INF 0x0f0f0f0f 8 9 using namespace std; 10 typedef pair<int,int> pii; 11 12 int next[M],first[M],to[M],w[M]; 13 int d[N],p; 14 15 void add(int u,int v,int t) 16 { 17 to[p] = v; 18 w[p] = t; 19 next[p] = first[u]; 20 first[u] = p++; 21 } 22 23 int main(void) 24 { 25 int T; 26 for(int t = scanf("%d",&T); t <= T; t++) 27 { 28 priority_queue <pii, vector<pii>, greater<pii> > q; 29 p = 0; 30 memset(first,-1,sizeof(first)); 31 int sr,ta,n,m,u,v,c; 32 scanf("%d%d%d%d",&n,&m,&sr,&ta); 33 for(int i=0;i<m;i++) 34 { 35 scanf("%d%d%d",&u,&v,&c); 36 add(u,v,c); 37 add(v,u,c); 38 } 39 memset(d,0x0f,sizeof(d)); 40 d[sr] = 0; 41 q.push(make_pair(d[sr],sr)); 42 while(!q.empty()) 43 { 44 pii u = q.top();q.pop(); 45 int x = u.second; 46 if(u.first != d[x]) 47 continue; 48 for(int e = first[x]; e != -1; e = next[e]) 49 if(d[to[e]] > d[x]+w[e]) 50 { 51 d[to[e]] = d[x] + w[e]; 52 q.push(make_pair(d[to[e]],to[e])); 53 } 54 } 55 printf("Case #%d: ",t); 56 if(d[ta]==INF) 57 puts("unreachable"); 58 else printf("%d ",d[ta]); 59 } 60 return 0; 61 }