• BZOJ2330: [SCOI2011]糖果


    BZOJ2330: [SCOI2011]糖果

    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

    Sample Input

    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

    11

    HINT

    【数据范围】

    对于30%的数据,保证 N<=100

    对于100%的数据,保证 N<=100000

    对于所有的数据,保证 K<=100000,1<=X<=5,1<=A, B<=N

    题解Here!

    这个是差分约束的裸题了吧。。。

    操作一:$A == B$,从A连向B,长度为0的双向边。

    操作二:A < B => B - A >= 1,从A连向B,长度为1的边。

    操作三:A >= B => A - B >=0,从A连向B,长度为0的边。

    操作四:A > B => A - B <= 1,从B连向A,长度为1的边。

    操作五:A <= B => B - A >= 0,从B连向A,长度为0的边。

    然后SPFA最长路判负环,有负环为无解,无负环输出总路程。

    注:这题有毒,卡建图顺序。。。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #define MAXN 100010
    #define MAX 999999999
    using namespace std;
    int n,m,s,c=1;
    int head[MAXN],path[MAXN];
    bool flag=false,vis[MAXN];
    struct Graph{
        int next,to,w;
    }a[MAXN<<2];
    inline int read(){
        int date=0,w=1;char c=0;
        while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
        while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
        return date*w;
    }
    inline int relax(int u,int v,int w){
        if(path[v]<path[u]+w){
            path[v]=path[u]+w;
            return 1;
        }
        return 0;
    }
    inline void add(int u,int v,int w){
        a[c].to=v;a[c].w=w;a[c].next=head[u];head[u]=c++;
    }
    void spfa(int u){
        if(flag)return;
        vis[u]=true;
        for(int i=head[u];i;i=a[i].next){
            int v=a[i].to;
            if(relax(u,v,a[i].w)){
                if(vis[v]){
                    flag=true;
                    return;
                }
                else spfa(v);
            }
        }
        vis[u]=false;
    }
    void work(){
        for(int i=0;i<=n;i++){path[i]=0;vis[i]=false;}
        spfa(s);
        if(flag)printf("-1
    ");
        else{
            long long ans=0;
            for(int i=1;i<=n;i++)ans+=path[i];
            printf("%lld
    ",ans);
        }
    }
    int main(){
        int f,u,v,w;
        n=read();m=read();
        s=0;
        for(int i=1;i<=m;i++){
            f=read();u=read();v=read();
            switch(f){
                case 1:add(u,v,0);add(v,u,0);break;
                case 2:if(u==v){printf("-1
    ");return 0;}add(u,v,1);break;
                case 3:add(v,u,0);break;
                case 4:if(u==v){printf("-1
    ");return 0;}add(v,u,1);break;
                case 5:add(u,v,0);break;
            }
        }
        for(int i=n;i>=1;i--)add(s,i,1);
        work();
        return 0;
    }
    
  • 相关阅读:
    聊天界面的实现
    继续,迫不及待想学数据库
    今天休息,我来研究上次的代码了
    项目导入
    命令行常用的一下命令
    svn的安装和基本操作,及常见问题
    maven项目里写测试
    Eclipse里新建maven项目
    maven简介
    重装win7,没有管理员权限,没有以管理员身份运行
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9420652.html
Copyright © 2020-2023  润新知