2330: [SCOI2011]糖果

差分约束系统。

特殊数据害人不浅。。。。。。。。

Spfa可能TLE,最好用Dijkstra。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct Edge{int to,next,v;}e[400005];
int head[100005],d[100005],cnt[100005],edge,n,k;
bool inq[100005];
void ins(int u,int v,int w){
	edge++;
	e[edge].to=v;e[edge].next=head[u];e[edge].v=w;head[u]=edge;
}
bool spfa(int s){
	queue<int>q;q.push(s);inq[s]=true;
	cnt[s]=1;
	while(!q.empty()){
		int u=q.front();q.pop();
		inq[u]=false;
		for(int i=head[u];i;i=e[i].next)
		if(d[e[i].to]<d[u]+e[i].v){
			d[e[i].to]=d[u]+e[i].v;
			if(++cnt[e[i].to]>=n)return true;
			if(!inq[e[i].to]){
				inq[e[i].to]=true;q.push(e[i].to);
			}
		}
	}
	return false;
}
bool init(){
	scanf("%d%d",&n,&k);int x,a,b;
	for(int i=1;i<=k;i++){
		scanf("%d%d%d",&x,&a,&b);
		switch(x){
			case 1:ins(a,b,0);ins(b,a,0);break;
			case 2:if(a==b)return false;ins(a,b,1);break;
			case 3:ins(b,a,0);break;
			case 4:if(a==b)return false;ins(b,a,1);break;
			case 5:ins(a,b,0);break;
		}
	}
	return true;
}
int main(){
	if(!init()){
		printf("-1");
		return 0;
	}
	int S=n+1;
	for(int i=n;i>=1;i--)
	ins(S,i,1);
	if(spfa(S)){
		printf("-1");
		return 0;
	}
	long long ans=0;
	for(int i=1;i<=n;i++)
	ans+=d[i];
	printf("%lld",ans);
	return 0;
}


你可能感兴趣的:(2330: [SCOI2011]糖果)