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 }