nyoj 天下第一 (spfa)

要求路径长度大于一,判断出环即可结束。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<string>
 6 #include<queue>
 7 #include<algorithm>
 8 #include<map>
 9 #include<iomanip>
10 #include<climits>
11 #include<string.h>
12 #include<cmath>
13 #include<stdlib.h>
14 #include<vector>
15 #include<set>
16 #define INF 1e7
17 #define MAXN 100010
18 #define maxn 1000010
19 #define Mod 1000007
20 #define N 1010
21 using namespace std;
22 typedef long long LL;
23 
24 struct node{ int x; double w; };
25 vector<node> G[1010];
26 int u, v;
27 double w;
28 int n, m;
29 int T;
30 int cnt[555];
31 int vis[555];
32 double dis[555];
33 
34 bool  spfa()
35 {
36     queue<node> q;
37     q.push({ 1, 0 });
38     vis[1] = 1;
39     dis[1] = 1;
40     while (!q.empty()){
41         node now = q.front();
42         q.pop();
43         vis[now.x] = 0;
44         for (int i = 0; i < G[now.x].size(); ++i) {
45             node v = G[now.x][i];
46             if (dis[now.x] * v.w > dis[v.x]) {
47                 dis[v.x] = dis[now.x] * v.w;
48                 if (!vis[v.x]) {
49                     vis[v.x] = 1;
50                     cnt[v.x]++;
51                     q.push({ v.x, dis[v.x] });
52                     if (cnt[v.x] >= n) return true;
53                 }
54             }
55         }
56     }
57     return false;
58 }
59 
60 void init()
61 {
62     memset(dis,0,sizeof(dis));
63     memset(vis,0,sizeof(vis));
64     memset(cnt,0,sizeof(cnt));
65     for (int i = 0; i <= n; ++i)
66         G[i].clear();
67 }
68 
69 void run()
70 {
71     cin >> n >> m;
72     init();
73     for (int i = 0; i < m; ++i) {
74         cin >> u >> w >> v;
75         G[u].push_back({v,w});
76     }
77     if (spfa()) puts("Yes");
78     else puts("No");
79 }
80 
81 int main()
82 {
83     cin >> T;
84     while (T--)
85         run();
86     //system("pause");
87     return 0;
88 }
原文地址:https://www.cnblogs.com/usedrosee/p/4337250.html