标签:复杂度 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 }
标签:复杂度 cond 开始 mes man div stream names second
原文地址:https://www.cnblogs.com/SSummerZzz/p/12932156.html