[SCOI2011]糖果
作者:互联网
差分约束的题
不多说
#include<bits/stdc++.h> using namespace std; const int N=1e5+7; int n,m; int head[N],nxt[N<<2],to[N<<2],edge[N<<2]; int d[N],flag[N],num[N]; long long sum; int _; void add(int x,int y,int z) { _++; to[_]=y; edge[_]=z; nxt[_]=head[x]; head[x]=_; return ; } queue<int > q; void Spfa(int x) {//跑个最长路 d[x]=0; q.push(x); flag[x]=1; num[x]++; while(!q.empty()) { int u=q.front(); q.pop(); flag[u]=0; for(int i=head[u];i;i=nxt[i]) { int v=to[i],z=edge[i]; if(d[v]<d[u]+z) {//最长路松弛 d[v]=d[u]+z; if(!flag[v]) { q.push(v); flag[v]=1; num[v]++; if(num[v]>=n+1) {//判断负环 cout<<"-1"; exit(0); } } } } } return ; } int main() { ios::sync_with_stdio(false); cin>>n>>m; memset(d,-1,sizeof(d)); while(m--) { int flag,q,w; cin>>flag>>q>>w; if(flag==1) {//一样多 add(q,w,0); add(w,q,0); } else if(flag==2) { if(q==w) {//由于q的糖要<w的,所以二者不可相等 cout<<"-1"; return 0; } else add(q,w,1); } else if(flag==3) {//>=,最小=它既可 add(w,q,0); } else if(flag==4) {//必需多余 if(q==w) { cout<<"-1"; return 0; } add(w,q,1); } else if(flag==5) { add(q,w,0);//不多于 } } //有数据卡正序 for(int i=n;i>=1;i--) add(0,i,1); //必须要比起始虚拟源点要大(题面要求每个人都有糖 Spfa(0); for(int i=n;i>=1;i--) sum+=d[i]; cout<<sum; return 0; }
标签:head,cout,int,add,--,flag,糖果,SCOI2011 来源: https://www.cnblogs.com/Hehe-0/p/15022865.html