zoukankan      html  css  js  c++  java
  • 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
    */

     

     

  • 相关阅读:
    sun.misc.BASE64Encoder----》找不到jar包的解决方法
    javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint-实体报错
    避免MQ消息重发的简单实现思路
    使用Spring的@Scheduled实现定时任务参数详解
    重置密码解决MySQL for Linux错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
    安装mysql zip5.7版--安裝
    bzoj3983
    bzoj4044
    bzoj1064
    bzoj4042
  • 原文地址:https://www.cnblogs.com/jason2003/p/10340500.html
Copyright © 2011-2022 走看看