BZOJ 2330: [SCOI2011]糖果

Description

 

幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果。但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖果的时候,lxhgww需要满足小朋友们的K个要求。幼儿园的糖果总是有限的,lxhgww想知道他至少需要准备多少个糖果,才能使得每个小朋友都能够分到糖果,并且满足小朋友们所有的要求。

 

Input

输入的第一行是两个整数NK

接下来K行,表示这些点需要满足的关系,每行3个数字,XAB

如果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

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 }

 

posted @ 2018-03-05 20:57  Hammer_cwz_77  阅读(271)  评论(0编辑  收藏  举报