• bzoj2330: [SCOI2011]糖果


    //b>a b>=a+1 a-b<=-1 b-a>=1
    //a>b a>=b+1 b-a<=-1 a-b>=1
    //a>=b b-a<=0 a-b>=0
    //a<=b a-b<=0  b-a>=0
    /*>=,求最小值,做最长路;
    <=,求最大值,做最短路。
    边都是从后往前~~~
    <=构图。
    有负环说明无解。
    求不出最短路(为Inf)为任意解。
    >=构图时类似。
    */
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define rep(i,s,t) for(int i=s;i<=t;i++)
    #define dwn(i,s,t) for(int i=s;i>=t;i--)
    #define clr(x,c) memset(x,c,sizeof(x))
    #define qwq(x) for(edge *o=head[x];o;o=o->next)
    int read(){
        int x=0,f=1;char c=getchar();
        while(!isdigit(c)) {
            if(c=='-') f=-1;c=getchar();
        }
        while(isdigit(c)) x=x*10+c-'0',c=getchar();
        return x*f;
    }
    const int nmax=1e5+5;
    const int maxn=nmax<<2;
    const int inf=0x7f7f7f7f;
    struct edge{
        int to,dist;edge *next;
    };
    edge es[maxn],*pt=es,*head[nmax];
    void add(int u,int v,int d){
        pt->to=v;pt->dist=d,pt->next=head[u],head[u]=pt++;
    }
    int dist[nmax],cnt[nmax],n,m;bool inq[nmax];
    queue<int>q;
    bool spfa(){
        clr(inq,0);inq[0]=1;cnt[0]=1;
        q.push(0);
        while(!q.empty()){
            int x=q.front(),td=dist[x];q.pop();inq[x]=0;
            qwq(x) if(dist[o->to]<td+o->dist){
                dist[o->to]=td+o->dist;
                if(++cnt[o->to]>n) return 0;
                if(!inq[o->to]) {
                    q.push(o->to),inq[o->to]=1;
                }
            }
        }
        return 1;
    }
    int main(){
        n=read(),m=read();int u,v,d;
        rep(i,1,m){
            d=read(),u=read(),v=read();
            if(d==1) add(u,v,0),add(v,u,0);
            else if(d==2) add(u,v,1);
            else if(d==3) add(v,u,0);
            else if(d==4) add(v,u,1);
            else add(u,v,0);
        }
        dwn(i,n,1) add(0,i,1);
        if(spfa()){
            long long ans=0;
            //rep(i,0,n) printf("%d ",dist[i]);printf("
    ");
            rep(i,1,n) ans+=dist[i];
            printf("%lld
    ",ans);
        }else printf("-1
    ");
        return 0;
    }
    
    

      

    2330: [SCOI2011]糖果

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 4741  Solved: 1481
    [Submit][Status][Discuss]

    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

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    【刷题】BZOJ 3626 [LNOI2014]LCA
    【刷题】UOJ #207 共价大爷游长沙
    【刷题】COGS 2701 动态树
    【刷题】BZOJ 4530 [Bjoi2014]大融合
    【刷题】BZOJ 2959 长跑
    【刷题】BZOJ 1969 [Ahoi2005]LANE 航线规划
    【刷题】BZOJ 4998 星球联盟
    【刷题】BZOJ 1977 [BeiJing2010组队]次小生成树 Tree
    【刷题】BZOJ 4817 [Sdoi2017]树点涂色
    获取元素 在网页中的 坐标
  • 原文地址:https://www.cnblogs.com/fighting-to-the-end/p/5859378.html
Copyright © 2020-2023  润新知