LOJ2436
幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。
但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候, lxhgww 需要满足小朋友们的 K 个要求。
幼儿园的糖果总是有限的, lxhgww 想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。
输入的第一行是两个整数 N ,K 。
接下来 行,表示这些点需要满足的关系,每行 个数字,X ,A ,B 。
如果 X=1 .表示第 A 个小朋友分到的糖果必须和第 B 个小朋友分到的糖果一样多。
如果 X=2 ,表示第 A个小朋友分到的糖果必须少于第 B 个小朋友分到的糖果。
如果 X=3,表示第 A个小朋友分到的糖果必须不少于第 B 个小朋友分到的糖果。
如果 X=4 ,表示第 A个小朋友分到的糖果必须多于第 B 个小朋友分到的糖果。
如果 X=5 ,表示第 A个小朋友分到的糖果必须不多于第 B 个小朋友分到的糖果。
输出一行,表示 lxhgww 老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出 -1 。
对于 100% 的数据,保证 N,K<1E5 。
_____________________________________________
差分约束
a==b 等价于 a>=b&&b>=a
a<b 等价于 b-a>=1
注意开LONG LONG
_____________________________________________
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 int n,m; 5 struct edge 6 { 7 int u,v,w,nxt; 8 }e[maxn*5]; 9 int head[maxn],js; 10 void addage(int u,int v,int w) 11 { 12 e[++js].u=u;e[js].v=v;e[js].w=w; 13 e[js].nxt=head[u];head[u]=js; 14 } 15 int dis[maxn],cs[maxn]; 16 bool inq[maxn]; 17 deque<int>q; 18 19 bool spfa(int u) 20 { 21 memset(dis,0xff,sizeof dis); 22 dis[u]=0;cs[u]++; 23 inq[u]=1;q.push_back(u); 24 while(!q.empty()) 25 { 26 int u=q.front();q.pop_front();inq[u]=0; 27 for(int i=head[u];i;i=e[i].nxt) 28 { 29 int v=e[i].v,w=e[i].w; 30 if(dis[v]<dis[u]+w) 31 { 32 dis[v]=dis[u]+w; 33 if(!inq[v]) 34 { 35 if(!q.empty() && dis[q.front()]<=dis[v])q.push_front(v); 36 else q.push_back(v); 37 ++cs[v]; 38 if(cs[v]>n)return 0; 39 inq[v]=1; 40 } 41 } 42 } 43 } 44 return 1; 45 } 46 int main() 47 { 48 scanf("%d%d",&n,&m); 49 for(int op,a,b,i=1;i<=m;++i) 50 { 51 scanf("%d%d%d",&op,&a,&b); 52 if(op==1){addage(a,b,0);addage(b,a,0);} 53 else if(op==2)addage(a,b,1); 54 else if(op==3)addage(b,a,0); 55 else if(op==4)addage(b,a,1); 56 else addage(a,b,0); 57 } 58 for(int i=1;i<=n;++i)addage(0,i,1); 59 bool bz=spfa(0); 60 if(bz==0) 61 { 62 puts("-1"); 63 return 0; 64 } 65 long long ans=0; 66 for(int i=1;i<=n;++i)ans+=dis[i]; 67 cout<<ans; 68 return 0; 69 }