Wormholes (spfa)
一种路是双向的,路的长度是正值;另一种路是单向的,路的长度是负值; 如果有负环输出YES;否则输出NO;不同的路可能有相同的起点和终点:必须用邻接表
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.
Sponsor
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<string> 11 #define LL long long 12 #define eps 1e-8 13 using namespace std; 14 const int inf = 0x3f3f3f3f; 15 int n,m,w,a,b,c,t,tot,ans; 16 struct node{ 17 int l,r,num,nex; 18 }e[10010]; 19 int head[550],vis[550],dis[550],sum[550]; 20 21 void init() 22 { 23 24 memset(head,-1,sizeof(head)); 25 tot=0; 26 ans=0; 27 } 28 29 void add(int l,int r,int num) 30 { 31 e[tot].l=l,e[tot].r=r,e[tot].num=num; 32 e[tot].nex=head[l]; 33 head[l]=tot++; 34 } 35 36 int spfa(int x) 37 { 38 queue<int >q; 39 while(!q.empty()) 40 q.pop(); 41 memset(dis,inf,sizeof(dis)); 42 memset(vis,0,sizeof(vis)); 43 memset(sum,0,sizeof(sum)); 44 q.push(x); 45 vis[x]=1; 46 dis[x]=0; 47 sum[x]=1; 48 while(!q.empty()) 49 { 50 int now=q.front(); q.pop(); 51 vis[now]=0; 52 for(int i=head[now];i!=-1;i=e[i].nex) 53 { 54 int to=e[i].r; 55 if(dis[to]>dis[now]+e[i].num) 56 { 57 dis[to]=dis[now]+e[i].num; 58 if(!vis[to]) 59 { 60 sum[to]++; 61 if(sum[to]>n) return 1; 62 q.push(to); 63 vis[to]=1; 64 } 65 } 66 } 67 } 68 return 0; 69 } 70 int main() 71 { 72 scanf("%d",&t); 73 while(t--) 74 { 75 scanf("%d%d%d",&n,&m,&w); 76 init(); 77 while(m--) 78 { 79 scanf("%d%d%d",&a,&b,&c); 80 add(a,b,c); 81 add(b,a,c); 82 } 83 while(w--) 84 { 85 scanf("%d%d%d",&a,&b,&c); 86 add(a,b,-c); 87 } 88 for(int i=1;i<=n;i++) 89 { 90 if(spfa(i)){ 91 ans=1; 92 break;//否则超时 93 } 94 } 95 if(ans) printf("YES\n"); 96 else printf("NO\n"); 97 } 98 }
浙公网安备 33010602011771号