刚学OI 114514s,萌新求助
查看原帖
刚学OI 114514s,萌新求助
278259
RemiliaScar1et楼主2020/9/4 17:19

刚学差分约束,求助QAQ

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=200010,M=400010;

ll n,m;
ll head[M],nxt[M],ver[M],edg[M],tot=0;
ll dis[N],cnt[N];
queue<int> q;
bool vis[N];

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

bool spfa()
{
	memset(dis,-0x3f,sizeof dis);
	dis[0]=0,vis[0]=1;
	q.push(0);
	
	while(q.size())
	{
		int x=q.front();
		q.pop();
		vis[x]=0;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=ver[i];
			if(dis[y]<dis[x]+edg[i])
			{
				dis[y]=dis[x]+edg[i];
				if(!vis[y])
				{
					cnt[y]++;
					vis[y]=1;
					q.push(y);
					if(cnt[y]>n) return 0;//判正环
				}
			}
		}
	}
	return 1;
}


int main()
{
	scanf("%lld%lld",&n,&m);
//	memset(head,-1,sizeof head);
	bool flag=0;
	for(int i=1;i<=m;i++)
	{
		int x,a,b;
		scanf("%d%d%d",&x,&a,&b);
		if(x==1) add(a,b,0),add(b,a,0);
		if(x==2) add(a,b,1),flag=(a==b?1:flag);
		if(x==3) add(b,a,0);
		if(x==4) add(b,a,1),flag=(a==b?1:flag);
		else add(a,b,0);
	}
	if(flag==1)
	{
		cout<<-1;
		return 0;
	}
	
	for(int i=n;i>=1;i--)
		add(0,i,1);
	flag=spfa();
	ll ans=0;
	for(int i=1;i<=n;i++)
		ans+=dis[i];
	if(flag==0) printf("-1");
	else printf("%lld",ans);
	return 0;
}
2020/9/4 17:19
加载中...