码迷,mamicode.com
首页 > 其他好文 > 详细

[模板]负环

时间:2018-02-18 10:27:44      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:style   const   ==   struct   lin   cout   div   new   onclick   

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

 

[模板]负环

标签:style   const   ==   struct   lin   cout   div   new   onclick   

原文地址:https://www.cnblogs.com/Ycrpro/p/8452486.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!