• LOJ2436


    题目描述

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

    输入格式

    输入的第一行是两个整数 N ,K  。
    接下来  行,表示这些点需要满足的关系,每行  个数字,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  。

    样例
    输入复制
    5 7
    1 1 2
    2 3 2
    4 4 1
    3 4 5
    5 4 5
    2 3 5
    4 5 1
    输出复制
    11
     
    数据范围与提示

    对于 100% 的数据,保证 N,K<1E5  。

    _____________________________________________

    差分约束

    a==b 等价于 a>=b&&b>=a

    a<b   等价于 b-a>=1

    注意开LONG LONG

    _____________________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+10;
     4 int n,m;
     5 struct edge
     6 {
     7     int u,v,w,nxt;
     8 }e[maxn*5];
     9 int head[maxn],js;
    10 void addage(int u,int v,int w)
    11 {
    12     e[++js].u=u;e[js].v=v;e[js].w=w;
    13     e[js].nxt=head[u];head[u]=js;
    14 }
    15 int dis[maxn],cs[maxn];
    16 bool inq[maxn];
    17 deque<int>q;
    18 
    19 bool spfa(int u)
    20 {
    21     memset(dis,0xff,sizeof dis);
    22     dis[u]=0;cs[u]++;
    23     inq[u]=1;q.push_back(u);
    24     while(!q.empty())
    25     {
    26         int u=q.front();q.pop_front();inq[u]=0;
    27         for(int i=head[u];i;i=e[i].nxt)
    28         {
    29             int v=e[i].v,w=e[i].w;
    30             if(dis[v]<dis[u]+w)
    31             {
    32                 dis[v]=dis[u]+w;
    33                 if(!inq[v])
    34                 {
    35                     if(!q.empty() && dis[q.front()]<=dis[v])q.push_front(v);
    36                     else q.push_back(v);
    37                     ++cs[v];
    38                     if(cs[v]>n)return 0;
    39                     inq[v]=1;
    40                 }
    41             }
    42         }
    43     }
    44     return 1;
    45 }
    46 int main()
    47 {
    48     scanf("%d%d",&n,&m);
    49     for(int op,a,b,i=1;i<=m;++i)
    50     {
    51         scanf("%d%d%d",&op,&a,&b);
    52         if(op==1){addage(a,b,0);addage(b,a,0);}
    53         else if(op==2)addage(a,b,1);
    54         else if(op==3)addage(b,a,0);
    55         else if(op==4)addage(b,a,1);
    56         else addage(a,b,0);
    57     }
    58     for(int i=1;i<=n;++i)addage(0,i,1);
    59     bool bz=spfa(0);
    60     if(bz==0)
    61     {
    62         puts("-1");
    63         return 0;
    64     }
    65     long long ans=0;
    66     for(int i=1;i<=n;++i)ans+=dis[i];
    67     cout<<ans;
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    正则表达式--hdu2206ip匹配
    win7查看隐藏分区
    我购买byd的几点逻辑
    html5笔记
    机器学习
    Popular Cows
    武大OJ 574. K-th smallest
    武大OJ 622. Symmetrical
    [HAOI2011]防线修建
    1185: [HNOI2007]最小矩形覆盖
  • 原文地址:https://www.cnblogs.com/gryzy/p/14223297.html
Copyright © 2020-2023  润新知