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  。

样例
输入复制
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
输出复制
11
 
数据范围与提示

对于 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 }
View Code
原文地址:https://www.cnblogs.com/gryzy/p/14223297.html