求助,蒟蒻刚学差分约束
查看原帖
求助,蒟蒻刚学差分约束
119638
xia0ji233楼主2022/2/22 02:25

如题,在学习过其它大佬文字写的博客之后大为震撼,决定自己不看任何代码的情况下自己思考然后写一下这个模板,但是结果还是差强人意。

就是说我想的是建图之后,入度为0的点没有约束条件,因此设置为0以它们为源点分别spfa,然后再判断一下负环为啥不行呢,就是大部分情况下负环都很难判出来,就想知道一下原因。

#include<bits/stdc++.h>
#define maxn 5005
using namespace std;
struct eee{
	int next;
	int to;
	int w;
}edge[maxn<<2];
int root[maxn],degree[maxn],dis[maxn],e_cnt[maxn],in_que[maxn],cnt,n,m;
void add(int x,int y,int w){
	edge[++cnt].next=root[x];
	edge[cnt].to=y;
	edge[cnt].w=w;
	degree[y]++;
	root[x]=cnt;
}
int spfa(){
	memset(dis,0x3f,sizeof(dis));
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(!degree[i]){
			q.push(i);
			dis[i]=0;
			e_cnt[i]=0;
			in_que[i]=1;
		}
	}
	if(q.empty()){
		q.push(1);
		dis[1]=0;
		e_cnt[1]=0;
		in_que[1]=1;
	}	
	while(q.size()){
		int u=q.front();
		q.pop();
		in_que[u]=0;
		for(int i=root[u];i;i=edge[i].next){
			int v=edge[i].to,w=edge[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				e_cnt[v]=e_cnt[u]+1;
				if(e_cnt[v]>n){
					return false;
				}
				if(!in_que[v]){
					in_que[v]=1;
					q.push(v);
				}
			}
		}
	}
	return true;
}
void sync(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
int main(){
	sync();
	cin>>n>>m; 
	while(m--){
		int x,y,w;
		cin>>x>>y>>w;
		add(x,y,-w);
	}
	if(spfa()){
		for(int i=1;i<=n;i++){
			printf("%d ",dis[i]);
		}
		putchar(10);
	}
	else{
		printf("NO\n");
	}
	
	
	return 0;
}
2022/2/22 02:25
加载中...