Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 8968 Accepted: 3171

      本题的意思是说在农场里有wormhole可以是时光倒流,现在给你一个地图,问是否能够运用这些wormhole从而使得当FJ回到原处发点的时候比第一次出发的时候要早。

代码:

 

1 #include<stdio.h>
2  struct node
3 {
4 int a,b,t;
5 }s[6000];
6  int dist[505],n,m,w;
7 int relax(int u,int v,int t)
8 {
9 if(dist[v]>dist[u]+t)
10 {
11 dist[v]=dist[u]+t;
12 return 1;
13 }
14 return 0;
15 }
16 int bellman(int v0)
17 {
18 int i,j;
19 for(i=1;i<=n;i++)
20 dist[i]=0xfffffff;
21 dist[v0]=0;
22 int flag;
23 for(i=1;i<n;i++)
24 {
25 flag=0;
26 for(j=1;j<=2*m+w;j++)
27 {
28 if(relax(s[j].a,s[j].b,s[j].t))
29 {
30 flag=1;
31 }
32 }
33 if(!flag)
34 break;
35 }
36 for(j=1;j<=2*m+w;j++)
37 if(relax(s[j].a,s[j].b,s[j].t))
38 return 1;
39 return 0;
40 }
41 int main()
42 {
43 int f,i,a,b,t;
44 scanf("%d",&f);
45 while(f--)
46 {
47 scanf("%d%d%d",&n,&m,&w);
48 for(i=1;i<=m;i++)
49 {
50 scanf("%d%d%d",&a,&b,&t);
51 s[i].a=a;
52 s[i].b=b;
53 s[i].t=t;
54 s[i+m].a=b;
55 s[i+m].b=a;
56 s[i+m].t=t;
57 }
58 for(i=1;i<=w;i++)
59 {
60 scanf("%d%d%d",&a,&b,&t);
61 s[m*2+i].a=a;
62 s[m*2+i].b=b;
63 s[m*2+i].t=-t;
64 }
65 if(bellman(1))
66 printf("YES\n");
67 else
68 printf("NO\n");
69 }
70 return 0;
71 }
72
73