【问题描述】
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的其他约束条件
为了使这个式子取到最大值,我们必须找到其他约束条件的最小值(跑最短路),才能找到最小值,求最大值就是求最长路
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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.