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

Bellman-ford

时间:2020-05-21 17:48:58      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:复杂度   cond   开始   mes   man   div   stream   names   second   

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 #define ll long long
 9 #define pb push_back
10 #define fi first
11 #define se second
12 
13 const int INF = 1e9;
14 struct node{
15     int u, v, w;
16 };
17 
18 //注意:bellman-ford算法能判负环,但可能存在一个负环,起点无法到达这个负环
19 //n = 4  m = 3
20 // 2 3 -1
21 // 3 4 -1
22 // 4 2 -1
23 //这个图有负环,但是如果从起点1出发,则没法到达这个负环,则代表没有负环
24 //复杂度: O(VE)
25 bool Bellman(int s, int n, vector<node >& E){
26     vector<int > d(n + 1, INF); //n个点初始化
27     d[s] = 0; //开始
28     for(int i = 1; i < n; ++i){  // n - 1次
29         for(auto e : E){ //遍历所有边
30             d[e.v] = min(d[e.v], d[e.u] + e.w);
31         }
32     }
33     for(auto e : E){
34         if(d[e.v] > d[e.u] + e.w) return true; //还可以松弛,有负环
35     }
36     return false;
37 }
38 
39 void solve(){
40     int T;
41     scanf("%d", &T);
42     while(T--){
43         int n, m;
44         scanf("%d%d", &n, &m); //点数   边数
45         vector<node > E;
46         int u, v, w;
47         for(int i = 0; i < m; ++i){
48             scanf("%d%d%d", &u, &v, &w);
49             E.pb({u, v, w});
50             if(w >= 0) E.pb({v, u, w});
51         }
52         //从1出发
53         if(Bellman(1, n, E)) printf("YES\n");
54         else printf("NO\n");
55     }
56 }
57 
58 int main(){
59 
60     solve();
61 
62     return 0;
63 }

 

Bellman-ford

标签:复杂度   cond   开始   mes   man   div   stream   names   second   

原文地址:https://www.cnblogs.com/SSummerZzz/p/12932156.html

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