• 排队(BZOJ1731:[Usaco2005 dec]Layout 排队布局)


    【问题描述】

    Czy喜欢将他的妹子们排成一队。假设他拥有N只妹纸,编号为1至N。Czy让他们站成一行,等待自己来派送营养餐。这些妹纸按照编号大小排列,并且由于它们都很想早点吃饭,于是就很可能出现多只妹纸挤在同一位置的情况(也就是说,如果我们认为妹纸位于数轴上,那么多只妹纸的位置坐标可能相同)。

    因为众所周知的原因,某些妹纸之间互相喜欢,他们希望互相之间的距离至多为一个定值。但某些妹纸之间互相厌恶,他们希望互相之间的距离至少为一个定值。现在给定ML个互相喜爱的妹纸对以及他们之间距离的最大值,MD个互相厌恶的妹纸对以及他们之间距离的最小值。

    你的任务是计算在满足以上条件的前提下,帮助Czy计算出编号为1和编号为N的妹纸之间距离的最大可能值。

    【输入】

    输入文件为 layout.in。

    第一行有 3 个整数,每两个整数之间用一个空格隔开,依次表示 n,ML和DL ;

    此后ML行,每行包含三个用空格分开的整数A,B和D,其中A,B满足1<=A<=B<=N。表示编号为A和B的妹纸之间的距离至多为D。

    此后MD行,每行包含三个用空格分开的整数A,B和D,其中A,B满足1<=A<=B<=N。表示编号为A和B的妹纸之间的距离至少为D。

    【输出】

    输出文件名为 layout.out。

    输出文件仅包含一个整数。如果不存在任何合法的排队方式,就输出-1。如果编号1和编号N的妹纸间距离可以任意,就输出-2 。否则输出他们之间的最大可能距离。

    【输入输出样例】

     

    layout.in

    layout.out

    4 2 1

    1 3 10

    2 4 20

    2 3 3

    27

    【数据范围】

    对于40%的数据,N<=100;

    对于100%的数据,N<=1000;ML,MN<=10000;D<=1000000。

    【解题思路】

    看到这个题之后我果断敲了一个贪心,然后骗到了三十分

    题目的正解

    很明显可以看出是差分约束系统的题目,如果A和B距离至多为D则建边A->B权值为D,距离至少为D则建边B->A权值为-D。然后最短路。若有负权环则输出-1,若无法到达点N则输出-2,否则直接输出1~N的距离即可。

    这是我第一次做到关于差分约束系统的题目,并不是很懂。

    http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 讲的比较详细,然而我还不是很懂

    个人见解如下

    对于一个标准的式子 x-y<=d 这是第一个约束条件

    在其他约束条件下我们会间接得到有关x-y的其他约束条件

    为了使这个式子取到最大值,我们必须找到其他约束条件的最小值(跑最短路),才能找到最小值,求最大值就是求最长路

     1 procedure open;
     2 begin
     3     assign(input,'layout.in');
     4     assign(output,'layout.out');
     5     reset(input);
     6     rewrite(output);
     7 end;
     8 
     9 procedure closs;
    10 begin
    11     close(input);
    12     close(output);
    13 end;
    14 var t,h,u,v,d,n,ml,mn,i:longint;
    15     b,dt:array[0..1000,0..1000] of longint;
    16     dl:array[0..4000] of longint;
    17     dis,cs:array[0..1000] of longint;
    18     pd:array[1..1000] of boolean;
    19 function spfa:longint;
    20 var now,i:longint;
    21 begin
    22     filldword(dis,sizeof(dis)div 4,maxlongint div 2);
    23     inc(t);
    24     dis[1]:=0;
    25     dl[t]:=1;
    26     while h<t do
    27     begin
    28         inc(h);
    29         now:=dl[h];
    30         for i:=1 to b[now,0] do
    31         begin
    32             if dis[now]+dt[now,b[now,i]]<dis[b[now,i]] then
    33             begin
    34                 inc(cs[b[now,i]]);
    35                 if cs[b[now,i]]>n-1 then exit(-1);
    36                 dis[b[now,i]]:=dis[now]+dt[now,b[now,i]];
    37                 if not pd[b[now,i]] then
    38                 begin
    39                     inc(t);
    40                     dl[t]:=b[now,i];
    41                     pd[b[now,i]]:=true;
    42                 end;
    43             end; 
    44         end;
    45         pd[now]:=false;
    46     end;
    47     if dis[n]=maxlongint div 2 then exit(-2) else exit(dis[n]);
    48 end;
    49 
    50 begin
    51     open;
    52     read(n,ml,mn);
    53     for i:=1 to ml do
    54     begin
    55         read(u,v,d);
    56         inc(b[u,0]);
    57         b[u,b[u,0]]:=v;
    58         dt[u,v]:=d;
    59     end;
    60     for i:=1 to mn do
    61     begin
    62         read(u,v,d);
    63         inc(b[v,0]);
    64         b[v,b[v,0]]:=u;
    65         dt[v,u]:=-d;
    66     end;
    67     writeln(spfa);
    68     closs;
    69 end.
    View Code
  • 相关阅读:
    C/C++打印堆栈信息
    adb shell input keyevent值所对应的字符
    Nautilus-Share-Message: Called "net usershare info" but it failed: Failed to
    ubuntu 安装lua错误
    ubuntu 16.04 安装jdk9错误
    国家统计信息查询网址
    Spring ApplicationListener配合-D实现参数初始化
    Feign Form表单POST提交
    window下绝对路径
    SpringBoot中使用配置文件
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4896087.html
Copyright © 2020-2023  润新知