差分约束

差分约束

对于形如:

{xc1xc1y1xc2xc2y2...xcnxcnyn

对于单个式子而言xc1xc1y1,可转换为xc1xc1+y1,而在图论中的点与点的距离也可以表示成这种样子,也就是点c1c1有一条权值为y1的单向边

建图,用SPFA判断是否有负环即可判断是否有解,并且最后的dis就是一个可行解

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fo(i,n) for(int i = 1;i <= n;i++)
#define debug(i,x) cout << "case" << (i) << ":" << x << endl;
#define lson(x) (x << 1)
#define rson(x) (x << 1 | 1)
const int inf = 1e9;
const int MAXN = 5e3 + 10;
ll num[MAXN],dis[MAXN];
bool use[MAXN];
vector<pair<int,int>> ed[MAXN];
int n,m;
void init(){
	memset(dis,1e9,sizeof(dis));
}
bool spfa(){
	dis[1] = 0;
	queue<int> qu;
	fo(i,n){
		qu.push(i);
		use[i] = 1;
		num[i]++;
	}
	while(!qu.empty()){
		int u = qu.front();
		use[u] = 0;
		qu.pop();
		for(auto pa:ed[u]){
			int v = pa.first,ddis = pa.second;
			if(ddis + dis[u] < dis[v]){
				dis[v] = ddis + dis[u];
				if(!use[v]){
					num[v]++;
					use[v] = 1;
					qu.push(v);
					if(num[u] >= n)//出现负环
						return 0;
				}
			}
		}
	}
	return 1;
}
int main()
{
	cin >> n >> m;
	init();
	for(int i = 1;i <= m;i++){
		int u,v,dis;cin >> u >> v >> dis;
		ed[v].push_back({u,dis});
	}
	bool f = 1;
	if(!spfa()){
		f = 0;
	}
	if(f)
		fo(i,n)
			cout << dis[i] << ' ';
	else
		cout << "NO" << endl;
}
posted @   xxcdsg  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示