zoukankan      html  css  js  c++  java
  • BZOJ 2330: [SCOI2011]糖果(差分约束系统)


    2330: [SCOI2011] 糖果

      Time Limit: 10 Sec
      Memory Limit: 128 MB

    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 1###

      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 1###

      11

    HINT###

      【数据范围】
      对于30%的数据,保证 N<=100
      对于100%的数据,保证 N<=100000
      对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N
      

    题目地址: BZOJ 2330: [SCOI2011]糖果

    题解:

         
      差分约束系统模板题
      新建一个点,来约束每个人至少分到一个糖果
      对于操作2和4,如果a=b,特判掉,不然会SPFA一直卡在一个点上
      如果有个点被松弛点数(n+1) 次,则不能满足所有要求
    www.cnblogs.com/AGFghy/


    AC代码

    #include<cstdio>
    #include<queue>
    using namespace std;
    typedef long long ll;
    int n,k,op,u,v,num,flag;
    int head[100005],point[300005],len[300005],Next[300005];
    int inq[100005],T[100005];
    ll ans,dis[100005];
    void add(int u,int v,int l)
    {
        point[++num]=v;
        len[num]=l;
        Next[num]=head[u];
        head[u]=num;
    }
    void SPFA()
    {
        queue<int> q;
        for (int i=1; i<=n; i++)
            dis[i]=-(ll)1e19,inq[i]=0;
        dis[0]=0ll; inq[0]=1; T[0]++;
        q.push(0);
        while (!q.empty())
        {
            int now=q.front(); 
            inq[now]=0;
            q.pop();
            for (int i=head[now]; i; i=Next[i])
            {
                int v=point[i];
                if (dis[v]<dis[now]+len[i])
                {
                    dis[v]=dis[now]+len[i];
                    if (!inq[v]) 
                    {
                        inq[v]=1;
                        q.push(v);
                    }
                    ++T[v];
                    if (T[v]>n+1) 
                    {
                        flag=0;
                        return;
                    }
                }
                
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&k);
        num=k;
        flag=1;
        for (int i=1; i<=k; i++)
        {
            scanf("%d%d%d",&op,&u,&v);
            if (op==1) {add(u,v,0);add(v,u,0);}
            if (op==2) {if (u==v) flag=0; add(u,v,1);}
            if (op==3) {add(v,u,0);}
            if (op==4) {if (u==v) flag=0; add(v,u,1);}
            if (op==5) {add(u,v,0);}
        }
        for (int i=n; i>=1; i--)               //这样会快一些。。。
            add(0,i,1);
        if (flag) SPFA();
        if (!flag) printf("-1
    ");
        else
        {
            ans=0;
            for (int i=1; i<=n; i++)
                ans+=dis[i];
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    机器学习书籍推荐
    25个机器学习面试题,期待你来解答
    观点 | 如何优雅地从四个方面加深对深度学习的理解
    Azure Public IP DNS域名
    SSH不允许Root登陆的方法
    MySQL on Azure高可用性设计 DRBD
    Linux ssh 不需要输入密码的方法
    MySQL on Azure高可用性设计 DRBD
    Express Route的配置
    Azure PIP (Instance Level Public IP)
  • 原文地址:https://www.cnblogs.com/AGFghy/p/9800229.html
Copyright © 2011-2022 走看看