http://poj.org/problem?id=3259
看了好久才知道那个虫洞 是可以把人带回去 而且时间也会回到过去 判断是否有负权回路 spfa看是否有一个点进入队列等于n次
bell-ford
1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<queue> 5 #define INF 0x3f3f3f 6 using namespace std; 7 struct node 8 { 9 int u,v,t; 10 }q[5000]; 11 int dis[501]; 12 int bellford(int n,int m) 13 { 14 int i,j; 15 memset(dis,0,sizeof(0)); 16 for(i = 1; i <= n ; i++) 17 { 18 int flag = 0; 19 for(j = 1 ; j <= m ; j++) 20 if(dis[q[j].v]>dis[q[j].u]+q[j].t) 21 { 22 dis[q[j].v] = dis[q[j].u]+q[j].t; 23 flag = 1; 24 } 25 if(!flag) 26 break; 27 } 28 for(j = 1; j <= m ; j++) 29 { 30 if(dis[q[j].v]>dis[q[j].u]+q[j].t) 31 return 1; 32 } 33 return 0; 34 } 35 int main() 36 { 37 int i,j,k,n,m,t,w1,o,a,b,c; 38 scanf("%d",&t); 39 while(t--) 40 { 41 scanf("%d%d%d",&n,&m,&w1); 42 o = 0; 43 for(i = 1 ; i <= m ; i++) 44 { 45 scanf("%d%d%d",&a,&b,&c); 46 o++; 47 q[o].u = a; 48 q[o].v = b; 49 q[o].t = c; 50 o++; 51 q[o].u = b; 52 q[o].v = a; 53 q[o].t = c; 54 } 55 for(i = 1 ; i <= w1 ; i++) 56 { 57 scanf("%d%d%d",&a,&b,&c); 58 o++; 59 q[o].u = a; 60 q[o].v = b; 61 q[o].t = -c; 62 } 63 if(bellford(n,o)) 64 printf("YES\n"); 65 else 66 printf("NO\n"); 67 } 68 return 0; 69 }
1 #include <iostream> 2 #include<cstdio> 3 #include<string.h> 4 #include<queue> 5 #define INF 0x3f3f3f 6 using namespace std; 7 struct node 8 { 9 int v,w,next; 10 }men[30000]; 11 int first[501],t,f[501],dis[501],c[501]; 12 void init() 13 { 14 t = 0; 15 memset(first,-1,sizeof(first)); 16 } 17 void add(int u,int v,int w) 18 { 19 men[t].v = v; 20 men[t].w = w; 21 men[t].next = first[u]; 22 first[u] = t; 23 t++; 24 } 25 void spfa(int n) 26 { 27 int i,j,k,flag = 1; 28 memset(f,0,sizeof(f)); 29 memset(c,0,sizeof(c)); 30 queue<int>q; 31 for(i = 1; i <= n ; i++) 32 dis[i] = INF; 33 dis[1] = 0; 34 q.push(1); 35 f[1] = 1; 36 c[1] = 1; 37 while(!q.empty()) 38 { 39 k = q.front(); 40 if(c[k]==n) 41 { 42 flag = 0; 43 break; 44 } 45 46 q.pop(); 47 f[k] = 0; 48 for(i = first[k];i!=-1 ; i = men[i].next) 49 { 50 if(dis[k]+men[i].w<dis[men[i].v]) 51 { 52 dis[men[i].v]=dis[k]+men[i].w; 53 if(!f[men[i].v]) 54 { 55 f[men[i].v] = 1; 56 q.push(men[i].v); 57 c[men[i].v]++; 58 } 59 } 60 } 61 } 62 if(!flag) 63 printf("YES\n"); 64 else 65 printf("NO\n"); 66 } 67 int main() 68 { 69 int i,j,k,n,m,a,b,c,w,p; 70 scanf("%d",&p); 71 while(p--) 72 { 73 scanf("%d%d%d",&n,&m,&w); 74 init(); 75 for(i = 1; i <= m ; i++) 76 { 77 scanf("%d%d%d",&a,&b,&c); 78 add(a,b,c); 79 add(b,a,c); 80 } 81 for(i = 1; i <= w ; i++) 82 { 83 scanf("%d%d%d",&a,&b,&c); 84 add(a,b,-c); 85 } 86 spfa(n); 87 } 88 return 0; 89 }
spfa