#include<bits/stdc++.h>
using namespace std;
const int maxn = 50005;
const int inf = 2147483647;
int n, m, p;
int dis[maxn], vis[maxn], head[maxn], cnt[maxn];
struct Edge {
int nxt, to, dis;
} edge[maxn];
//链式向前星加边函数
void add(int u, int v, int w) {
edge[++p].nxt = head[u];
edge[p].to = v;
edge[p].dis = w;
head[u] = p;
}
//SPFA判断负环
bool SPFA() {
queue<int> q;
for (int i = 1; i <= n; i++) {
dis[i] = inf;
vis[i] = 0;
}
q.push(0);
dis[0] = 0;
vis[0] = 1;
cnt[0] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i; i = edge[i].nxt) {
int v = edge[i].to;
if (dis[v] > (long long)dis[u] + edge[i].dis) {
dis[v] = dis[u] + edge[i].dis;
if (vis[v] == 0) {
vis[v] = 1;
q.push(v);
cnt[v]++;
if (cnt[v] > n + 1)
return 1;
}
}
}
}
return 0;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
add(v, u, w);//转化为图论题目
}
for (int i = 1; i <= n; i++) {
add(0, i, 0);//添加源点0
}
if (!SPFA()) {
for (int i = 1; i <= n; i++) {
printf("%d ", dis[i]);
}
} else cout << "NO" << endl;
return 0;
}
样例本地输出为:
0 -2 0
明显与样例不符,洛谷在线 IDE 也给出了一样的结果,所以是为什么?