• 洛谷P3275 [SCOI2011]糖果


    题目描述

    幼儿园里有(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)个小朋友分到的糖果;

    输出格式:

    输出一行,表示(lxhgww)老师至少需要准备的糖果数,如果不能满足小朋友们的所有要求,就输出(-1)

    输入输出样例

    输入样例#1:

    5 7
    1 1 2
    2 3 2
    4 4 1
    3 4 5
    5 4 5
    2 3 5
    4 5 1
    

    输出样例#1:

    11
    

    说明

    【数据范围】

    对于(30\%)的数据,保证 (N leq 100)

    对于(100\%)的数据,保证 (N leq 100000)

    对于所有的数据,保证 (K leq 100000)(1 leq X leq 5)(1 leq A, B leq N)

    思路:考虑差分约束,对于给出的第一种关系,我们就建一条双向的边权为(0)的边,然后第二种情况,(A)(B)小,而且要严格小于,那就相当于是(d[B]-d[A]>=1),然后剩余的三种就跟前两种类似了,就不必多说了,然后跑最短路的时候,我们以(0)为起点,向其它的点建一条权值为(0)的边,然后无解就是存在负环或建边的时候起点等于终点。

    代码:

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    #include<queue>
    #define ll long long
    #define maxn 100007
    using namespace std;
    int num,n,k,head[maxn],dis[maxn],vis[maxn],in[maxn];
    ll ans;
    inline int qread() {
      char c=getchar();int num=0,f=1;
      for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
      for(;isdigit(c);c=getchar()) num=num*10+c-'0';
      return num*f;
    }
    struct node {
      int v,w,nxt;
    }e[300007];
    inline void ct(int u, int v, int w) {
      e[++num].v=v;
      e[num].w=w;
      e[num].nxt=head[u];
      head[u]=num;
    }
    inline int spfa() {
      memset(dis,-0x3f,sizeof(dis));
      queue<int>q;
      q.push(0),dis[0]=0,vis[0]=1,in[0]=1;
      while(!q.empty()) {
        int u=q.front();q.pop();
        vis[u]=0;
        for(int i=head[u];i;i=e[i].nxt) {
          int v=e[i].v;
          if(dis[v]<dis[u]+e[i].w) {
            dis[v]=dis[u]+e[i].w;
            if(!vis[v]) {
              vis[v]=1;
              in[v]++;
              if(in[v]>n) return -1;
              q.push(v);
            }
          }
        }
      }
      return 0;
    }
    int main() {
      n=qread(),k=qread();
      for(int i=1,p,u,v;i<=k;++i) {
        p=qread(),u=qread(),v=qread();
        if(p==1) ct(u,v,0),ct(v,u,0);
        if(p==2) {
          if(u==v) {
            printf("-1
    ");
            return 0;
          }
          ct(u,v,1);
        }
        if(p==3) ct(v,u,0);
        if(p==4) {
          if(u==v) {
            printf("-1
    ");
            return 0;
          }
          ct(v,u,1);
        }
        if(p==5) ct(u,v,0);
      }
      for(int i=n;i>=1;--i) ct(0,i,1);
      if(spfa()) {
        printf("-1
    ");
        return 0;
      }
      for(int i=1;i<=n;++i) ans+=dis[i];
      printf("%lld
    ",ans);
      return 0;
    }
    
  • 相关阅读:
    安卓逆向5.Android Studio JNI静态注册(C++和Java互操作)
    安卓逆向二
    ASP.Net Core Web 在IIS下的发布流程
    Android Studio安装记录
    Vistual studio智能提示不显示或者显示为英文的解决办法
    (转)程序语言理论的学习对于程序员教育的作用
    普通用户ssh无密码登录设置
    (转)完全用GNU/Linux工作 by 王珢
    (转)谁是真正的程序语言专家
    java操作XML
  • 原文地址:https://www.cnblogs.com/grcyh/p/10201641.html
Copyright © 2020-2023  润新知