1. 程式人生 > >[模板]負環

[模板]負環

truct add cst blog pac 分享 front pro ()

https://www.luogu.org/problemnew/show/P3385 //dfs SPFA做法 技術分享圖片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 500010;
 7 const int MAXN = 1 << 20;
 8 const int inf = 0x7f7f7f7f;
 9 #define lop(i,a,b) for(register int i = a; i <= b; ++i)
10
#define bl(i) for(register int i = head[u];i;i = G[i].next) 11 12 struct queue1{ 13 int l, r, q[MAXN]; 14 queue1(): l (1), r(0){} 15 inline void push(int x){q[++r & MAXN - 1] = x;} 16 inline int front(){return q[l & MAXN - 1];} 17 inline void pop(){++l;} 18 inline int
size(){return r - l + 1;} 19 inline bool empty(){return l > r;} 20 }q; 21 struct Edge{int v, w, next;}G[N];int head[N], dis[N], tot, n, m, s;bool inq[N], flag; 22 23 inline void addedge (int u, int v, int w){ 24 G[++tot].v=v;G[tot].w=w;G[tot].next=head[u];head[u]=tot; 25 } 26 inline int
read(){ 27 register int c = getchar(), x = 0, f = 1; 28 while (!isdigit(c)){if (c == -) f = -1; c = getchar();} 29 while (isdigit(c)){x = x * 10 + c - 0; c = getchar();} 30 return x * f; 31 } 32 inline void spfa(int u){ 33 if (flag) return ; 34 inq[u] = 1; 35 bl(i){ 36 int v = G[i].v, w = G[i].w; 37 if (dis[u] + w < dis[v]){ 38 dis[v] = dis[u] + w; 39 if (inq[v]){flag = 1; return ;} 40 spfa(v); 41 } 42 } 43 inq[u] = 0; 44 } 45 int main(void){ 46 int t = read(); 47 while (t--){ 48 memset(dis, 0, sizeof(dis)); 49 memset(head, 0, sizeof(head)); 50 memset(inq, 0, sizeof(inq)); 51 tot = 0; 52 flag = false; 53 n = read(), m = read(); 54 lop(i,1,m){ 55 int u = read(), v = read(), w = read(); 56 addedge(u, v, w); if (w >= 0) addedge (v, u, w); 57 } 58 lop(i,1,n){ 59 spfa(i);if (flag) break; 60 } 61 if (flag) cout << "YE5\n"; 62 else cout << "N0\n"; 63 } 64 return 0; 65 }
View Code

[模板]負環