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

    Description

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

    输入的第一行是两个整数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个小朋友分到的糖果;

    Solution

    从0到所有点顺序加边就会T,改成倒序就AC是什么鬼

    要开long longQvQ

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<queue>
    #define MAXN 100005
    typedef long long LL;
    using namespace std;
    int n,k,head[MAXN],dis[MAXN],vis[MAXN],cnt=0;
    bool inq[MAXN];
    struct Node{
        int next,to,w;
    }Edges[MAXN*4];
    void addedge(int u,int v,int w)
    {
        Edges[++cnt].next=head[u];
        head[u]=cnt;
        Edges[cnt].to=v;
        Edges[cnt].w=w;
    }
    int read()
    {
        int x=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-')f=-1;c=getchar();
        }
        while(c>='0'&&c<='9'){
            x=x*10+c-'0';c=getchar();
        }
        return x*f;
    }
    bool spfa()
    {
        queue<int>q;
        q.push(0);
        inq[0]=1,vis[0]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop(),inq[u]=0;
            for(int i=head[u];~i;i=Edges[i].next)
            {
                int v=Edges[i].to;
                if(dis[v]<dis[u]+Edges[i].w)
                {
                    dis[v]=dis[u]+Edges[i].w;
                    ++vis[v];
                    if(vis[v]>n)return false;
                    if(!inq[v])
                    inq[v]=1,q.push(v);
                }
            }
        }
        return true;
    }
    int main()
    {
        memset(head,-1,sizeof(head));
        n=read(),k=read();
        for(int i=1;i<=k;i++)
        {
            int x,a,b;
            x=read(),a=read(),b=read();
            switch(x)
            {
                case 1:
                    addedge(a,b,0);addedge(b,a,0);break;
                case 2:
                    addedge(a,b,1);break;
                case 3:
                    addedge(b,a,0);break;
                case 4:
                    addedge(b,a,1);break;
                case 5:
                    addedge(a,b,0);break;
            }
        }
        for(int i=n;i>0;i--)
        addedge(0,i,1);
        if(!spfa()){
            printf("-1");return 0;
        }
        LL sum=0;
        for(int i=1;i<=n;i++)sum+=dis[i];
        printf("%lld
    ",sum);
        return 0;
    }
  • 相关阅读:
    CoreSeek Sphinx 安装
    【Asp.net入门2-01】C#基本功能
    【Asp.net入门16】第一个ASP.NET 应用程序-总结
    【Asp.net入门15】第一个Asp.net应用程序-输入验证
    【Asp.net入门11】第一个ASP.NET 应用程序-创建摘要视图
    【Asp.net入门09】第一个ASP.NET 应用程序-处理窗体(1)
    【Asp.net入门08】第一个Asp.net应用程序-创建窗体并设置其样式
    【Asp.net入门07】第一个ASP.NET 应用程序-创建数据模型和存储库
    【Asp.net入门06】第一个ASP.NET 应用程序-案例说明
    【Asp.net入门05】第一个ASP.NET 应用程序-测试Asp.net程序
  • 原文地址:https://www.cnblogs.com/Zars19/p/6711510.html
Copyright © 2011-2022 走看看