bzoj2330 糖果

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

 

根据提议理解

1:B-A=0 && A-b=0

2:B-A>=1

3:A-B>=0

4:A-B>=1

5:B-A>=0

然后根据不等式,用查分约束建图就可以了!

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define MAXN 500010
#define REP(i,k,n)  for(long long i=k;i<=n;i++)
#define in(a) a=read()
using namespace std;
long long read(){
    long long x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')
            f=-1;
    for(;isdigit(ch);ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
long long n,m,flag;
long long total=0,head[MAXN],to[MAXN<<2],val[MAXN<<2],nxt[MAXN<<2];
inline void adl(long long a,long long b,long long c){
    total++;
    to[total]=b;
    val[total]=c;
    nxt[total]=head[a];
    head[a]=total;
    return ;
}
long long dis[MAXN],num[MAXN];
long long vis[MAXN];
long long INF=1e6+7;
long long q[MAXN<<6];
deque <long long> Q;
inline void SPFA(){
    Q.push_back(0);
    memset(dis,-0x3f3f3f,sizeof (dis));
    //q[r]=0;
    dis[0]=0;
    while(/*r>=l*/!Q.empty()){
        long long u=Q.front();
        Q.pop_front();
        vis[u]=0;
        if(num[u]==n){
            cout<<-1;
            exit(0);
        }
       num[u]++;
        for(long long e=head[u];e;e=nxt[e])
            if(dis[to[e]]<dis[u]+val[e]){
                dis[to[e]]=dis[u]+val[e];
                if(!vis[to[e]]){
                    vis[to[e]]=1;
                    if(Q.empty()) Q.push_back(to[e]);
                    else  if(dis[to[e]]>=dis[Q.front()])
                        Q.push_front(to[e]);
                    else  Q.push_back(to[e]);
                }
            }
        }
    return ;
}
int main(){
    in(n);in(m);
    long long a,b,c;
    REP(i,1,m){
        in(a);in(b);in(c);
        if(a==1){
            adl(b,c,0);
            adl(c,b,0);
        }
        if(a==2){
            if(b==c){
              cout<<"-1"; 
              return 0;
            }
            adl(b,c,1);
        }
        if(a==3)  adl(c,b,0);
        if(a==4){
            if(c==b){
                cout<<-1;
                return 0;
            }
            adl(c,b,1);
        }
        if(a==5)  adl(b,c,0);
    }
    for(long long i=1;i<=n;i++)  adl(0,i,1);
    dis[0]=0;
    SPFA();
    long long ans=0;
    REP(i,1,n)
      ans+=dis[i];
    printf("%lld",ans);
    return 0;
}
/*
5 7
1 1 2
2 3 2
4 4 1
3 4 5
5 4 5
2 3 5
4 5 1
*/

 

 

 

posted @ 2019-01-31 09:09  Dijkstra·Liu  阅读(268)  评论(0编辑  收藏  举报