【模板】SPFA判負環
阿新 • • 發佈:2018-07-23
names break while define inf efi 負環 cos --
#include<bits/stdc++.h> #pragma GCC optimize(3) #define maxn 10000 #define maxm 10000 #define inf 2147483647 using namespace std; int m, n; int num = 0; struct eg { int to; int cost; int next; }; eg side[maxm]; int head[maxn], cnt[maxn], dis[maxn]; bool vis[maxn], flag = 0; void addeg(int f, int t, int cost) { side[++num].next = head[f]; side[num].to = t; side[num].cost = cost; head[f] = num; } void spfa(int g) { dis[g] = 0; vis[g] = 1; queue<int>q; q.push(g); int x; while(!q.empty()) { x = q.front(); q.pop(); vis[x] = 0; for(int i = head[x]; i != 0; i = side[i].next) { if(dis[x] + side[i].cost < dis[side[i].to]) { dis[side[i].to] = dis[x] + side[i].cost; cnt[side[i].to] = cnt[x] + 1; if(cnt[side[i].to] >= n) { flag = 1; return ; } if(!vis[side[i].to]) { q.push(side[i].to); vis[side[i].to] = 1; } } } } return ; } int main() { int T; int f, t, cost; scanf("%d", &T); while(T--) { num = 0; scanf("%d%d", &n, &m); // for(int i = 1; i <= m; i++) // side[i].to = 0, side[i].next = 0, side[i].cost = 0; for(int i = 0; i <= n; i++) dis[i] = 0, cnt[i] = 0, vis[i] = 0, head[i] = 0, dis[i] = 0; for(int i = 1; i <= m; i++) { scanf("%d%d%d", &f, &t, &cost); if(cost < 0) { addeg(f, t, cost); } else { addeg(f, t, cost); addeg(t, f, cost); } } flag = 0; for(int i = 1; i <= n; i++) { spfa(i); if(flag)break; } if(flag) puts("YE5"); else puts("N0"); } }
【模板】SPFA判負環