Wormholes 最短路判断有无负权值
Description
While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of FJ's farms comprises N (1 ≤ N ≤ 500) fields conveniently numbered 1..N, M (1 ≤ M ≤ 2500) paths, and W (1 ≤ W ≤ 200) wormholes.
As FJ is an avid time-traveling fan, he wants to do the following: start at some field, travel through some paths and wormholes, and return to the starting field a time before his initial departure. Perhaps he will be able to meet himself :) .
To help FJ find out whether this is possible or not, he will supply you with complete maps to F (1 ≤ F ≤ 5) of his farms. No paths will take longer than 10,000 seconds to travel and no wormhole can bring FJ back in time by more than 10,000 seconds.
Input
Line 1 of each farm: Three space-separated integers respectively: N, M, and W
Lines 2..M+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: a bidirectional path between S and E that requires T seconds to traverse. Two fields might be connected by more than one path.
Lines M+2..M+W+1 of each farm: Three space-separated numbers (S, E, T) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.
Output
Sample Input
2 3 3 1 1 2 2 1 3 4 2 3 1 3 1 3 3 2 1 1 2 3 2 3 4 3 1 8
Sample Output
NO YES
Hint
For farm 2, FJ could travel back in time by the cycle 1->2->3->1, arriving back at his starting location 1 second before he leaves. He could start from anywhere on the cycle to accomplish this.
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 const int EM = 10000; 6 const int VM = 600; 7 const int INF = 999999; 8 struct node 9 { 10 int u,v,w; 11 }map[EM]; 12 13 int cnt,dis[VM]; 14 int n,m,k; 15 16 void addedge(int au,int av,int aw) 17 { 18 map[cnt].u = au; 19 map[cnt].v = av; 20 map[cnt].w = aw; 21 cnt++; 22 } 23 24 int Bellman_ford() 25 { 26 int flag ,i; 27 //初始化 28 for( i = 1; i <= n; i++) 29 { 30 dis[i] = INF; 31 } 32 dis[1] =0; 33 34 for( i = 1; i <= n; i++) 35 { 36 flag = 0; 37 for(int j = 0; j < cnt; j++) 38 { 39 if(dis[map[j].v] > dis[map[j].u]+map[j].w) 40 { 41 dis[map[j].v] = dis[map[j].u]+map[j].w; 42 flag = 1; 43 } 44 } 45 if(flag== 0) break; 46 } 47 if(i == n+1) return 1;//若第n次还可以松弛说明存在负环 48 else return 0; 49 } 50 51 int main() 52 { 53 int t,u,v,w,ans; 54 scanf("%d",&t); 55 while(t--) 56 { 57 cnt = 0; 58 scanf("%d %d %d",&n,&m,&k); 59 while(m--) 60 { 61 scanf("%d %d %d",&u,&v,&w); 62 //添加双向边 63 addedge(u,v,w); 64 addedge(v,u,w); 65 } 66 while(k--) 67 { 68 scanf("%d %d %d",&u,&v,&w); 69 //添加单向边 70 addedge(u,v,-w); 71 } 72 ans = Bellman_ford(); 73 if(ans == 1) 74 printf("YES\n"); 75 else printf("NO\n"); 76 } 77 return 0; 78 }
1 //spfa判断有无负环 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<iostream> 6 #include<queue> 7 using namespace std; 8 9 const int MAX = 510; 10 const int INF = 999999; 11 int n,m,w; 12 int map[MAX][MAX]; 13 queue<int>que; 14 int inque[MAX]; 15 int vexcnt[MAX]; 16 int dis[MAX]; 17 18 bool spfa() 19 { 20 memset(inque,0,sizeof(inque)); 21 memset(vexcnt,0,sizeof(vexcnt)); 22 for(int i = 1; i <= n; i++) 23 dis[i] = INF; 24 dis[1] = 0; 25 que.push(1); 26 inque[1] = 1; 27 vexcnt[1]++; 28 while(!que.empty()) 29 { 30 int tmp = que.front(); 31 que.pop(); 32 inque[tmp] = 0; 33 for(int i = 1; i <= n; i++) 34 { 35 if(dis[tmp] < INF && dis[i] > dis[tmp] + map[tmp][i]) 36 { 37 dis[i] = dis[tmp] + map[tmp][i]; 38 if(inque[i] == 0) 39 { 40 inque[i] = 1; 41 vexcnt[i]++; 42 que.push(i); 43 if(vexcnt[i] >= n) 44 { 45 return false; 46 } 47 } 48 } 49 } 50 } 51 return true; 52 } 53 int main() 54 { 55 int t; 56 int x,y,z; 57 scanf("%d",&t); 58 while(t--) 59 { 60 while(!que.empty())que.pop(); 61 scanf("%d %d %d",&n,&m,&w); 62 for(int i = 1; i <= n; i++) 63 for(int j = 1; j <= n; j++) 64 { 65 if(i == j) map[i][j] = 0; 66 else map[i][j] = INF; 67 } 68 for(int i = 1; i <= m; i++) 69 { 70 scanf("%d %d %d",&x,&y,&z); 71 if(map[x][y] > z) 72 { 73 map[x][y] = z; 74 map[y][x] = z; 75 } 76 } 77 for(int i = 1; i <= w; i++) 78 { 79 scanf("%d %d %d",&x,&y,&z); 80 if(map[x][y] > -z) 81 map[x][y] = -z; 82 } 83 if(spfa()) 84 printf("NO\n"); 85 else printf("YES\n"); 86 } 87 return 0; 88 }