zoukankan      html  css  js  c++  java
  • 排队(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
  • 相关阅读:
    11111 Generalized Matrioshkas
    Uva 442 Matrix Chain Multiplication
    Uva 10815 Andy's First Dictionary
    Uva 537 Artificial Intelligence?
    Uva 340 MasterMind Hints
    SCAU 9508 诸葛给我牌(水泥题)
    Uva 10420 List of Conquests(排序水题)
    Uva 409 Excuses, Excuses!
    10/26
    11/2
  • 原文地址:https://www.cnblogs.com/wuminyan/p/4896087.html
Copyright © 2011-2022 走看看