差分约束算法

差分约束

差分约束的引入

假设现在有一组不等式方程组,求 x 3 − x 0 x_3 - x_0 x3x0 的最大值

  • $x_1-x_0 \leq 2 $ (1)
  • x 2 − x 0 ≤ 7 x_2-x_0 \leq 7 x2x07 (2)
  • x 3 − x 0 ≤ 8 x_3-x_0 \leq 8 x3x08 (3)
  • x 2 − x 1 ≤ 3 x_2-x_1 \leq 3 x2x13 (4)
  • x 3 − x 2 ≤ 2 x_3-x_2 \leq 2 x3x22 (5)

可整理到以下三个不等式:

  1. x 3 − x 0 ≤ 8 x_3-x_0 \leq 8 x3x08 (3)
  2. x 3 − x 0 ≤ 9 x_3-x_0 \leq 9 x3x09 (2)、(5)
  3. x 3 − x 0 ≤ 9 x_3-x_0 \leq 9 x3x09 (1)、(4)、(5)

如果一个系统由 n n n 个变量和 m m m 个不等式组成,并且这 m m m 个不等式均为 x i − x j ≤ a [ k ] x_i - x_j \leq a[k] xixja[k] 的形式,这样系统成为 差分约束


最短路问题中松弛操作的变形与扩展

现在看下面这张图,问从 0 0 0 号点到 3 3 3 号点的最短距离

1637245537433

每次松弛操作更新时的方程就像这样:

i f ( d i s [ t o ] > d i s [ n o w ] + m p [ n o w ] [ t o ] ) if(dis[to]>dis[now]+mp[now][to]) if(dis[to]>dis[now]+mp[now][to])

d i s [ t o ] = d i s [ n o w ] + m p [ n o w ] [ t o ] dis[to]=dis[now]+mp[now][to] dis[to]=dis[now]+mp[now][to]

容易思考出最短路已经求出后,任意的三角关系满足: d i s [ t o ] ≤ d i s [ n o w ] + m p [ n o w ] [ t o ] dis[to] \leq dis[now]+mp[now][to] dis[to]dis[now]+mp[now][to]

左右移项可以得出 d i s [ t o ] − d i s [ n o w ] ≤ m p [ n o w ] [ t o ] dis[to]-dis[now] \leq mp[now][to] dis[to]dis[now]mp[now][to]


差分约束和最短/长路的联系

发现与之前差分约束的不等式有点相似

分析:

对于任意一组不等式 x − y ≤ z x-y \leq z xyz x x x 可以理解为源点 s s s 到点 x x x 的最短路大小,同理 y y y 可以理解为源点 s s s 到点 y y y 的最短路大小, z z z 可以理解为 跑完最短路的图 后点 x x x y y y 的边的大小。

有了点权和边权我们就可以建图,这样差分约束就可以转化成 最短路问题 求解。

需要注意的是,有些问题求得是差值的 最大值 ,我们用最短路解决;有些问题求的是差值的 最小值 ,我们用最长路解决。

解释如下:

最短路求完后任意三角关系满足: d i s [ t o ] ≤ d i s [ n o w ] + m p [ n o w ] [ t o ] dis[to] \leq dis[now] + mp[now][to] dis[to]dis[now]+mp[now][to]

移项后得: d i s [ t o ] − d i s [ n o w ] ≤ m p [ n o w ] [ t o ] dis[to]-dis[now] \leq mp[now][to] dis[to]dis[now]mp[now][to] ,对应求差值的最大值

假设有 m m m 个这样的式子,如果最后要得到一个满足所有限制的值,必然是这 m m m 个上界中的最小值,也就是最短路。

同理,最长路求完后任意三角关系满足: d i s [ t o ] − d i s [ n o w ] ≥ m p [ n o w ] [ t o ] dis[to]-dis[now] \geq mp[now][to] dis[to]dis[now]mp[now][to] ,对应求差值的最小值

并且,需要提前通过乘以负号等操作使得所有不等式 符号相同 以进行最短/长路的进一步操作。

所以可能会有负权边的出现,迪杰斯特拉算法不一定适用。

一句话概括:求最大值,跑最短路;求最小值,跑最长路。

最长路有两种求法,如果没有负权边,一开始将 d i s [ i ] dis[i] dis[i] 全赋为0,松弛操作取最大;如果无法确定有没有负权边,那么就边权全部 取反 ,再用 S P F A SPFA SPFA 跑一遍最短路模板即可。


解的存在性

对于任意方程,无外乎三种情况,有唯一解、无解、有多解 ,考虑他们在图论中的意义。

有唯一解 是最简单的一种情况,源点 S S S 到终点 E E E 之间存在最短路。

进一步考虑,如果源点 S S S 到终点 E E E 不存在最短路,即存在 负环 ,就可以表示为方程的 无解情况

如果源点 S S S 根本无法到达终点 E E E ,即 d i s [ E ] = I N F dis[E]=INF dis[E]=INF,表示 S S S E E E 之前不存在约束关系,表示为方程的 多解情况

(下面为解释,有点绕,核心上文已给出,可以不看)

1637250174327

这是一个存在负环的图,我们将其转化为差分约束系统如下所示

  • x 2 − x 1 ≤ 3 x_2 - x_1 \leq 3 x2x13 (1)
  • x 3 − x 2 ≤ 1 x_3 -x_2 \leq 1 x3x21 (2)
  • x 4 − x 3 ≤ − 5 x_4 - x_3 \leq -5 x4x35 (3)
  • x 2 − x 4 ≤ 2 x_2 - x_4 \leq 2 x2x42 (4)
  • x 5 − x 4 ≤ 7 x_5 - x_4 \leq 7 x5x47 (5)

将(2)、(3)、(4)全部相加后我们可以发现出现了 0 ≤ − 2 0 \leq -2 02 这种自相矛盾的式子,说明方程组不可能有解。

最长路也是类似的理解,如果源点 S S S 到终点 E E E 根本没有任何连边,那么 E E E 取任何值都没有关系,说明方程组有多解。


不等式方程组的格式

  1. 求差值的最大值,全部转化为 x − y ≤ z x-y \leq z xyz 这种格式;求差值的最小值,全部转化为 x − y ≥ z x-y \geq z xyz 这种形式
  2. 如果有形如 x − y = z x-y=z xy=z 的形式,将其变化成两个不等式: x − y ≤ z x-y \leq z xyz x − y ≥ z x-y \geq z xyz
  3. 如果有形如 x − y < z x-y<z xy<z 的形式,将其变化为 x − y ≤ z − 1 x-y \leq z-1 xyz1 的形式

关于超级源点

为了得到正确的结果,我们必须保证至少存在一个点,通过这个点我们可以遍历所有的 。(注意不是点,下文会说明)。

边是我们在图论中的理解,回到求不等式解的问题当中。遍历不到某条边就相当于无法保证满足不等式组中的所有约束,答案就可能产生错误。

遍历不到某个点没有任何关系,说明其没有任何约束,随便取什么值都可以。

如果可以通过某个点走到任意点上,那么也可以通过该点走过任何边。(边是连接点和点的,必然可以通过所有边)

具体实现时,往往在原图上附加一个超级源点,这个顶点与每个顶点连上一条权值为 0 0 0 的边。以求差值的最大值(最短路为例),就是新加入一个未知数 x 0 x_0 x0 ,然后新增 n n n 个这样的不等式,对应 n n n 条新产生的权值为 0 0 0 的边:

  • x 1 − x 0 ≤ 0 x_1 - x_0\leq0 x1x00 0 → 1 0\rightarrow1 01
  • x 2 − x 0 ≤ 0 x_2 - x_0\leq0 x2x00 0 → 2 0\rightarrow2 02
  • x 3 − x 0 ≤ 0 x_3 - x_0\leq0 x3x00 0 → 3 0\rightarrow3 03
  • x n − x 0 ≤ 0 x_n - x_0\leq0 xnx00 0 → 0\rightarrow 0n
1637335987410

以该图为例。

现在以 x 0 x_0 x0 为源点,求单源最短路,最终得到的 x 0 x_0 x0 x i x_i xi 的最短路长度就是 x i x_i xi 的一个解。图中 x 0 x_0 x0 x i x_i xi 的最短路长度分别为 − 5 , − 3 , 0 , − 1 , − 4 {-5,-3,0,-1,-4} 5,3,0,1,4 ,因此这五个数就是满足上述不等式的一组解。当然,把每个数都加上 10 10 10 也是一组解,因为他照样满足原先的差分约束系统。虽然他不满足我们后来新加的一些约束,但都没关系,因为 x 0 x_0 x0局外人nobody cares QAQ

这里有一个有趣的结论,我们从 0 0 0 i i i 加了一条边,转化成不等式就相当于 x i ≤ x 0 x_i\leq x_0 xix0 x i x_i xi 在图里又相当于从源点到 i i i 的最短路大小, x 0 x_0 x0 在图中又意味着源点。也就是说,当我们一开始就把 x 0 x_0 x0 的解定为X时,所有未知数的解都不会大于X(dis[0]=X)

这应该很好理解,毕竟是从源点走出来的,从源点到其他点的最短路必然不会比源点自身的值大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值