F - Wormholes

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 const int INF = 0x3f3f3f3f;
 7 const int maxn = 50005;
 8 int n, w, m, k, dis[maxn];
 9 
10 struct node
11 {
12     int u, v, w;
13     node() {}
14     node(int uu, int vv, int ww): u(uu), v(vv), w(ww) {}
15 }edge[maxn];
16 
17 bool Bellman_Ford(int s)
18 {
19     for(int i = 1; i <= n; i++) dis[i] = INF;
20     dis[s] = 0;
21     for(int i = 0; i < n; i++)
22     {
23         int flag = 1;
24         for(int j = 0; j < k; j++)
25         {
26             int u = edge[j].u;
27             int v = edge[j].v;
28             int w = edge[j].w;
29             if(dis[u] + w < dis[v])
30             {
31                 flag = 0;
32                 dis[v] = dis[u]+w;
33                 if(i == n-1)
34                     return true;
35                 //如果循环n-1次还能缩,就存在负环
36             }
37         }
38         if(flag) return false;
39     }
40     return false;
41 }
42 
43 int main()
44 {
45     ios::sync_with_stdio(false);
46     cin.tie(0);
47 
48     int t;
49     cin >> t;
50     while(t--)
51     {
52         k = 0;
53         scanf("%d%d%d", &n, &m, &w);
54         for(int i = 1; i <= m+w; i++)
55         {
56             int u, v, w;
57             scanf("%d%d%d", &u, &v, &w);
58             if(i <= m)
59             {
60                 edge[k++] = node(u, v, w);
61                 edge[k++] = node(v, u, w);
62             }
63             else edge[k++] = node(u, v, -w);
64         }
65         if(Bellman_Ford(1)){
66             cout << "YES" << endl;
67         }
68         else
69             cout << "NO" << endl;
70     }
71     return 0;
72 }

 

posted @ 2018-05-10 13:40  ouyang_wsgwz  阅读(161)  评论(0编辑  收藏  举报