zoukankan      html  css  js  c++  java
  • 数据结构》关于差分约束的两三事(BZOJ2330)

      差分约束,主要用来解决数学中的线性规划问题,通过差值与两个未知数可以转化为单源最长路问题(或负值最短路)。

      当有一个式子为x1-x2>=a时,我们可以建边,这条边设定为x1比x2大等a(或x2比x1小等a),并且全图统一为大等或统一为小等,因为条件相同可以进行条件传递,可以考虑用单源最短解决,然后可以直接用spfa解决就好辣。(事实上这就是一种思想,甚至可以用向量来考虑,重点是条件的传递性)。

      下面给一道裸题

    Description

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

    Input

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

    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

    裸题没什么好讲的

    然后愉快的给出代码

     1 #include<stdio.h>
     2 struct shit{
     3     long long aim;
     4     long long next;
     5     long long val;
     6 }e[501000];
     7 long long point,head[101000],quq[501000],d[101000],x,a,b,n,m,ass,star,ans,vis[101000];
     8 bool f[101000];
     9 void fuck(long long x,long long y,long long num)
    10 {
    11     e[++point].aim=y;
    12     e[point].val=num;
    13     e[point].next=head[x];
    14     head[x]=point;
    15 }
    16 bool spfa(int x)
    17 {
    18     quq[++star]=x;
    19     ass=1;
    20     f[quq[star]]=true;
    21     ++vis[quq[star]];
    22     while(star<=ass)
    23     {
    24         for(int i=head[quq[star]];i!=0;i=e[i].next)
    25         {
    26             int v=e[i].aim;
    27             if(d[quq[star]]+e[i].val>d[v])
    28             {
    29                 if(++vis[v]>=n)return true;
    30                 d[v]=d[quq[star]]+e[i].val;
    31                 if(f[v])continue;
    32                 quq[++ass]=v;
    33                 f[v]=true;
    34             }
    35         }
    36         f[quq[star++]]=false;
    37     }
    38     return false;
    39 }
    40 int main()
    41 {
    42     scanf("%lld%lld",&n,&m);
    43     for(int i=1;i<=m;i++)
    44     {
    45         scanf("%lld%lld%lld",&x,&a,&b);
    46         if(x==1){fuck(a,b,0);fuck(b,a,0);}
    47         else if(x==3)fuck(b,a,0);
    48         else if(x==2){
    49             if(a==b){printf("-1");return 0;}
    50             fuck(a,b,1);
    51         }
    52         else if(x==5)fuck(a,b,0);
    53         else if(x==4){
    54             if(a==b){printf("-1");return 0;}
    55             fuck(b,a,1);
    56         }
    57     }
    58     for(int i=n;i>=1;i--)fuck(0,i,1);
    59         if(spfa(0)){printf("-1");return 0;}
    60     for(int i=1;i<=n;i++)ans+=d[i];
    61     printf("%lld",ans);
    62     return 0;    
    63 }
    View Code
  • 相关阅读:
    [component]button skin–按钮组件外观
    as3 图片平滑方法
    SOLVED: Right Click in AS3
    一个超高效的不规则物体碰撞检测的类
    flex中的css应用
    控制时间间隔
    用flash cs3美化flex3之skin开发
    AS3实现RPG游戏鼠标8方向操作
    log4net basic example write to file
    观察者模式(C#实现 + eventhandler)
  • 原文地址:https://www.cnblogs.com/PencilWang/p/5869982.html
Copyright © 2011-2022 走看看