差分约束系统

前置:求解最长路

  1. 将边权取相反数,设此时图为 (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) 的最长路。
  2. 实际上,由于最短路有: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. 如果求最大值。

    按小于等于建图求最短路。负环无解。

  2. 如果求最小值。

    按大于等于建图求最长路。正环无解。

例题

例 1. HDU - 3440 House Man

题意:

(n) 栋房子,给出每栋房子的高度和开始时的相对位置(相邻初始距离均为 (1)),可以移动一些房子。

现在从最矮的房子开始,每次跳至比它高的第一栋房子,而且每次跳跃的距离最大是 (D)。问跳到最高的房子的最大距离可以是多少?

注意房子不能在同一位置,房子的相对位置不能改变。

如果不能从最矮的房子到达最高的房子则输出 (-1)

求最大值,则按小于等于建图求最短路。负环无解。

有两个限制:

  1. 相邻房子距离至少为 (1)
  2. 相邻高度房子距离至多为 (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}) 找出最大值即可。

原文地址:https://www.cnblogs.com/AWhiteWall/p/13747217.html