2330: [SCOI2011]糖果

来源:互联网 发布:国内erp软件 编辑:程序博客网 时间:2024/05/15 04:41

差分约束系统。

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

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;}


0 0
原创粉丝点击