差分约束
https://www.luogu.com.cn/problem/P5960
对于不等式 \(u-v \ge w\),连 \(u\rightarrow v\),权为 \(-w\) 的边,用 \(spfa\) 跑最短路判断负环.
//author:kzssCCC
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6;
void solve(){
int n,m;
cin >> n >> m;
vector<vector<pair<int,int>>> adj(n+1);
for (int i=0;i<m;i++){
int u,v,w;
cin >> u >> v >> w;
adj[v].emplace_back(w,u);
}
vector<bool> vis(n+1,true);
vector<int> dis(n+1),cnt(n+1);
queue<int> q;
for (int i=1;i<=n;i++){
q.push(i);
}
while (!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for (auto& [w,v]:adj[u]){
if (dis[u]+w<dis[v]){
dis[v] = dis[u]+w;
if (!vis[v]){
q.push(v);
vis[v] = true;
}
if (++cnt[v]>=n){
cout << "NO" << '\n';
return;
}
}
}
}
for (int i=1;i<=n;i++){
cout << N+dis[i] << ' ';
}
cout << '\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}

浙公网安备 33010602011771号