bzoj2330 糖果

Description

 

幼兒園裏有N個小朋友,lxhgww老師如今想要給這些小朋友們分配糖果,要求每一個小朋友都要分到糖果。可是小朋友們也有嫉妒心,老是會提出一些要求,好比小明不但願小紅分到的糖果比他的多,因而在分配糖果的時候,lxhgww須要知足小朋友們的K個要求。幼兒園的糖果老是有限的,lxhgww想知道他至少須要準備多少個糖果,才能使得每一個小朋友都可以分到糖果,而且知足小朋友們全部的要求。ios

 

Input

輸入的第一行是兩個整數NKgit

接下來K行,表示這些點須要知足的關係,每行3個數字,XABspa

若是X=1, 表示第A個小朋友分到的糖果必須和第B個小朋友分到的糖果同樣多;code

若是X=2, 表示第A個小朋友分到的糖果必須少於第B個小朋友分到的糖果;blog

若是X=3, 表示第A個小朋友分到的糖果必須很多於第B個小朋友分到的糖果;ip

若是X=4, 表示第A個小朋友分到的糖果必須多於第B個小朋友分到的糖果;get

若是X=5, 表示第A個小朋友分到的糖果必須很少於第B個小朋友分到的糖果;string

 

Output

輸出一行,表示lxhgww老師至少須要準備的糖果數,若是不能知足小朋友們的全部要求,就輸出-1it

 

根據提議理解io

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
*/
相關文章
相關標籤/搜索