最近好久沒怎麼寫最短路的題致使這個題交了好多遍node
AC率是怎麼下來的本身內心沒點數ios
SPFA雖然臭名昭著可是他能夠用來判負環git
若是一個點進隊的次數大於等於n說明存在負環spa
這道題一開始memset我給dis賦了零3d
在SPFA廚師第一個點的時候根本就忘了還要初始化discode
菜死了blog
還有這題變態沒讓着輸出YES或者NOget
他讓着輸出YE5和N0......雖然我一眼就看出來了可是我仍是把E寫成了小寫的....string
Code:it
//SPFA判斷負環 #include <queue> #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 250000; int head[N << 1], n, m, cnt, tim[N], T, dis[N]; struct node { int nxt, to, w; }e[N << 1]; bool vis[N]; int read() { int s = 0, w = 1; char ch = getchar(); while(!isdigit(ch)) {if(ch == '-') w = -1; ch = getchar();} while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();} return s * w; } void add(int x, int y, int z) { e[++cnt].nxt = head[x]; e[cnt].to = y; e[cnt].w = z; head[x] = cnt; } bool spfa() { queue<int> q; q.push(1); vis[1] = 1; dis[1] = 0; while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if(dis[v] > dis[u] + e[i].w) { dis[v] = dis[u] + e[i].w; if(!vis[v]) { tim[v]++; q.push(v); vis[v] = 1; if(tim[v] >= n) return 1; } } } } return 0; } int main() { T = read(); while(T--) { memset(vis, 0, sizeof(vis)); memset(head, 0, sizeof(head)); memset(tim, 0, sizeof(tim)); memset(dis, 0x3f3f3f3f, sizeof(dis)); n = read(), m = read(); for(int i = 1, x, y, z; i <= m; i++) { x = read(), y = read(), z = read(); if(z < 0) add(x, y, z); else add(x, y, z), add(y, x, z); } if(spfa()) printf("YE5\n"); else printf("N0\n"); } return 0; }