差分约束求调
查看原帖
差分约束求调
925818
hjhAKIOI楼主2024/8/24 10:23

提交记录

#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#define int long long
using namespace std;
const int N=2e5+5,M=6e6+5,INF=0x3f3f3f3f;
int n,m,tot,ans,Add;
int head[N],ver[M],Next[M],edge[M],d[N],cnt[N];
bool v[N];

void add(int x,int y,int z){
	ver[++tot]=y;
	edge[tot]=z;
	Next[tot]=head[x];
	head[x]=tot;
}

queue<int> q;

bool spfa(){
	memset(d,INF,sizeof(d));
	q.push(0);
	d[0]=0;
	v[0]=1;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		v[x]=0;
		for(int i=head[x];i;i=Next[i]){
			int y=ver[i],z=edge[i];
			if(d[y]>d[x]+z){
				d[y]=d[x]+z;
				cnt[y]=cnt[x]+1;
				if(cnt[y]>=n){
					return false;
				}
				if(!v[y]){
					q.push(y);
					v[y]=1;
				}
			}
		}
	}
	return true;
}

signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1){
			add(y,x,0);
			add(x,y,0);
		}
		if(op==2){
			add(y,x,-1);
		}
		if(op==3){
			add(x,y,0);
		}
		if(op==4){
			add(x,y,-1);
		}
		if(op==5){
			add(y,x,0);
		}
	}
	for(int i=1;i<=n;i++){
		add(0,i,0);
	}
	if(!spfa()){
		cout<<-1;
	}
	else{
		for(int i=1;i<=n;i++){
			if(d[i]<0) Add=max(Add,abs(d[i]));
			ans=ans+d[i];
		}
		cout<<ans+(Add+1)*n;
	}
	return 0;
}
2024/8/24 10:23
加载中...