pku 3259 Wormholes

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

 

你可能感兴趣的:(orm)