差分约束

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;
}
posted @ 2026-07-17 10:01  kzssCCC  阅读(4)  评论(0)    收藏  举报