首页 > 其他 > 详细

P3385 【模板】负环

时间:2019-10-26 18:56:59      阅读:64      评论:0      收藏:0      [点我收藏+]

P3385 【模板】负环

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 2005, maxm = 3005;
 4 const int inf = 0x3f3f3f3f;
 5 struct edge {
 6     int v, w;
 7 };
 8 vector<edge> maps[maxn];
 9 int dis[maxn], n, m;
10 
11 bool BellmanFord(int s) {  // s为源点
12     fill(dis+1, dis+1+n, inf);
13     dis[s] = 0;
14     for (int i = 1; i <= n-1; i++) {
15         for (int u = 1; u <= n; u++) {
16             for (int j = 0; j < maps[u].size(); j++) {
17                 int v = maps[u][j].v;
18                 int w = maps[u][j].w;
19                 if (dis[u] + w < dis[v]) {
20                     dis[v] = dis[u] + w;
21                 }
22             }
23         }
24     }
25     
26     if (maps[s].size() == 0) return true;  // 如果s点没有和其他点相连,则没有负环 
27     for (int u = 1; u <= n; u++) {
28         for (int j = 0; j < maps[u].size(); j++) {
29             int v = maps[u][j].v;
30             int w = maps[u][j].w;
31             if (dis[u] + w < dis[v])
32                 return false;
33         }
34     }
35     return true;
36 }
37 int main() {
38     int t; scanf("%d",&t);
39     while (t--) {
40         scanf("%d%d",&n,&m);
41         for (int i = 1; i <= n; i++) maps[i].clear();
42 
43         for (int i = 1; i <= m; i++) {
44             int u, v, w; scanf("%d%d%d",&u,&v,&w);
45             if (w < 0) maps[u].push_back(edge{v,w});
46             else {
47                 maps[u].push_back(edge{v,w});
48                 maps[v].push_back(edge{u,w});
49             }
50         }
51         bool flag = BellmanFord(1);
52            if (flag) puts("N0");
53            else puts("YE5");
54     }
55 }

 

P3385 【模板】负环

原文:https://www.cnblogs.com/wstong/p/11744086.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!