前置:求解最长路
- 将边权取相反数,设此时图为 (G')。若 (G') 无负权环(即 (G) 无正权环),则有 (d'[v]le len'[v]),其中 (d'[v]) 为在图 (G') 上求得的最短路,(len'[v]) 为源点到 (v) 的任意路径权值和。同时可得 (-d'[v]ge len[v]),所以可以得到 (D[v]=-d'[v]),其中 (D[v]) 为原图源点到 (v) 的最长路。
- 实际上,由于最短路有:
if(d'[v]>d'[u]+w'(u,v)) d'[v]=d'[u]+w'(u,v)
,我们可以将其改写为if(D[v]<D[u]+w(u,v)) D[v]=D[u]+w(u,v)
。
差分约束系统
-
如果求最大值。
按小于等于建图求最短路。负环无解。
-
如果求最小值。
按大于等于建图求最长路。正环无解。
例题
例 1.
HDU - 3440 House Man
题意:
有 (n) 栋房子,给出每栋房子的高度和开始时的相对位置(相邻初始距离均为 (1)),可以移动一些房子。
现在从最矮的房子开始,每次跳至比它高的第一栋房子,而且每次跳跃的距离最大是 (D)。问跳到最高的房子的最大距离可以是多少?
注意房子不能在同一位置,房子的相对位置不能改变。
如果不能从最矮的房子到达最高的房子则输出 (-1)。
求最大值,则按小于等于建图求最短路。负环无解。
有两个限制:
- 相邻房子距离至少为 (1)。
- 相邻高度房子距离至多为 (D)。
最后需要注意,查询时应查询编号小的房子到编号大的房子的距离,如果反过来查根据我们的建图得到的值应该是负值。
例 2.
CF1450E Capitalism
求最大值,则按小于等于建图求最短路。负环无解。
对于限制 (|a_i-a_j|=1),可以拆成 (|a_i-a_j|le 1) 且 (|a_i-a_j|ge 1)。
继续拆成四个条件:(a_ile a_j+1) 或 (a_ige a_j+1),$a_jle a_i+1 $ 或 (a_jge a_i+1)。
选择最弱的一组条件:$a_ile a_j+1,a_jle a_i+1 $。
最后因为条件是等号,需要判断一下是否为二分图。
用 (mathtt{Floyd}) 找出最大值即可。