BZOJ 2330: [SCOI2011]糖果
Description
幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。
Input
输入的第一行是两个整数N,K。
接下来K行,表示这些点需要满足的关系,每行3个数字,X,A,B。
如果X=1, 表示第A个小朋友分到的糖果必须和第B个小朋友分到的糖果一样多;
如果X=2, 表示第A个小朋友分到的糖果必须少于第B个小朋友分到的糖果;
如果X=3, 表示第A个小朋友分到的糖果必须不少于第B个小朋友分到的糖果;
如果X=4, 表示第A个小朋友分到的糖果必须多于第B个小朋友分到的糖果;
如果X=5, 表示第A个小朋友分到的糖果必须不多于第B个小朋友分到的糖果;
Output
输出一行,表示lxhgww老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出-1。
Sample Input
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
Sample Output
11
HINT
【数据范围】
对于30%的数据,保证 N<=100
对于100%的数据,保证 N<=100000
对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N
1 /************************************************************** 2 Problem: 2330 3 User: Hammer_cwz_77 4 Language: C++ 5 Result: Accepted 6 Time:348 ms 7 Memory:46376 kb 8 ****************************************************************/ 9 10 // luogu-judger-enable-o2 11 #include<bits/stdc++.h> 12 using namespace std; 13 typedef long long ll; 14 const int maxn=1000000+5; 15 16 inline void read(int& x) 17 { 18 x=0; 19 register char f=getchar(),c=0; 20 while(!isdigit(f)&&f!='-')f=getchar();if(f=='-')c=1,f=getchar(); 21 while(isdigit(f))x=x*10+(f^48),f=getchar();if(c)x=~x+1; 22 } 23 24 struct node{ 25 int net; 26 int to; 27 int w; 28 }a[maxn*3]; 29 int head[maxn],dis[maxn],cnt,n,k; 30 bool vis[maxn]; 31 ll ans; 32 33 inline void add(int i,int j,int w) 34 { 35 a[++cnt].to=j; 36 a[cnt].net=head[i]; 37 a[cnt].w=w; 38 head[i]=cnt; 39 } 40 41 inline bool spfa(int s) 42 { 43 vis[s]=true; 44 for(int i=head[s];i;i=a[i].net) 45 { 46 int v=a[i].to; 47 if(dis[v]>dis[s]+a[i].w) 48 { 49 dis[v]=dis[s]+a[i].w; 50 if(vis[v]||!spfa(v)) 51 { 52 return false; 53 } 54 } 55 } 56 vis[s]=false; 57 return true; 58 } 59 60 int main() 61 { 62 memset(dis,0x3f,sizeof(dis)); 63 read(n); 64 read(k); 65 dis[0]=0; 66 for(int i=n;i>=1;--i) 67 add(0,i,-1); 68 for(int i=1;i<=k;i++) 69 { 70 int aa,b,c; 71 read(aa); 72 read(b); 73 read(c); 74 if(aa==1) 75 { 76 add(b,c,0); 77 add(c,b,0); 78 } 79 if(aa==2) 80 { 81 add(b,c,-1); 82 } 83 if(aa==3) 84 { 85 add(c,b,0); 86 } 87 if(aa==4) 88 { 89 add(c,b,-1); 90 } 91 if(aa==5) 92 { 93 add(b,c,0); 94 } 95 if(aa%2==0&&b==c) 96 { 97 printf("-1\n"); 98 return 0; 99 } 100 } 101 if(spfa(0)) 102 { 103 for(int i=1;i<=n;i++) 104 { 105 ans-=dis[i]; 106 } 107 printf("%lld\n",ans); 108 return 0; 109 } 110 cout<<-1<<endl; 111 return 0; 112 }