程帅霞

不断受挫,不停起身,不断追寻,不止AC~~

导航

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..NM (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: A single integer, FF farm descriptions follow. 
Line 1 of each farm: Three space-separated integers respectively: NM, and W 
Lines 2..M+1 of each farm: Three space-separated numbers (SET) 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 (SET) that describe, respectively: A one way path from S to E that also moves the traveler back T seconds.

Output

Lines 1..F: For each farm, output "YES" if FJ can achieve his goal, otherwise output "NO" (do not include the quotes).

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 1, FJ cannot travel back in time. 
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 }

 

posted on 2020-09-22 20:38  程帅霞  阅读(162)  评论(0)    收藏  举报