您的位置:首页 > 其它

2330: [SCOI2011]糖果

2015-12-10 11:54 381 查看
差分约束系统。

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: