0
点赞
收藏
分享

微信扫一扫

基于最短路的差分约束模型


1. 差分约束的功能

  • 求​不等式组​的可行解
  • 求​满足不等式组​的​每一个变量的最值

不等式组中每一个不等式形式如下:

\[x_i ≤ x_j + c_k \]

其中,\(x_i\) 和 \(x_j\) 是自变量, \(c_k\)是因变量。

我们可以​类比​一下之前的​最短路问题​,假设存在一条从 \(j\)走到 \(i\),边权为 \(c\)的边。在进行最短路计算时,只要遇到 \(dist[j] > dist[i] + c\),我们就将 \(dist[j]\)更新为 \(dist[i] + c\)。因此,当做完最短路之后,对于所有的 \(j\),都有 \(dist[j] ≤ dist[i] + c\)。

如果给我们一个图,我们可以​把每条边看成一个不等式​,那么我们在这个图上​求一遍起点到所有点的最短距离​(注意从起点出发,一定能走到所有的边,因为如果走不到所有的点,就不可能完成求单源最短路的任务,就有个别点走不到嘛),求完之后每个边的不等式都是满足的。那么,​任何一个最短路问题,都可以换为一个不等式组​。那么反过来也一样,​一个不等式组也可以转换为一个最短路问题​。

数缺形时少直观,形少数时难入微-华罗庚

因此,我们在解不等式组问题的时候,遇到一个不等关系,就将它处理成为 \(x_i ≤ x_j + c_k\)的格式,然后建立 \(j → i\) 权值为 \(c_k\)的一条边。之后我们在这个图上,​随便选择起点​(该起点需要满足从该点出发,一定可以走遍所有的边,所以有时需要找一个超级源点,找不到一个可以能够到达所有点的起点,就没法按差分约束的方法来计算啦),求一下每个点到起点的最短距离,求完之后,所有的不等关系都会满足。

2.求不等式的可行解

综上所述,我们可以总结出差分约束求不等式可行解的做法:

源点需要满足的条件:从源点出发,一定可以走到所有边(某个点走不到没有关系,因为从数学的角度,某个点就是某一个变量,既然没有边与它相连,它就没有任何约束)。

步骤:

【1】先将每个不等式 \(x_i ≤ x_j + c\) 换成一条 \(j → i\) 长度为 \(c\) 的一条边

【2】找一个虚拟源点,使得该源点​一定​可以遍历到​所有边

【3】从虚拟源点求一遍 ​单源最短路

注意​:

并不是所有图都存在最短路,​图中可能存在负环​,如果​存在负环对应到不等式中就是无解​。

因此,建图完毕以后,做一次​最短路​,只有两个结果:

  • 如果存在负环,那么该不等式组一定无解
  • 如果不存在负环,则 \(dist[i]\)就是原不等式组中 \(x_i\)的​一个可行解

3. 求满足不等式组中每一个变量的最值

只记结论​: 如果求的是最小值,则应该求最长路;如果求的是最大值,则应该求最短路。为什么呢?

以求\(x_i\)的最大值为例:求所有从\(x_i\)出发,构成不等式链 \(x_i ≤ x_j + c_1 ≤ x_k + c_2 + c_1 ≤ . . . ≤ c_1 + c_2 + . . . + c_k\),通过做最短路以后可以确定 \(x_i\)的一系列上界,最终 \(x_i\)的最大值就等于所有上界中的最小值。

最长路的建图方式和\(2\)节中最短路的建图方式一样,把不等式换成 \(x_i ≥ x_j + c\), 建立一条 \(j → i\) 长度为 \(c\) 的一条边(最短路只看\(≤\),最长路只看\(≥\))。

我们知道,如果不等式组中仅仅包含不同变量之间的大小关系,那么我们求出的可行解一定是一个​包含变量的相对关系​,它不存在一个极值的概念。

因此,一旦题目让我们求满足不等式关系的极值,那么​一定​会在不等式组中加入形如 \(x_i ≤ c\) 或 \(x_i ≥ c\) 这样的条件(​小于还是大于看求最短路还是最长路​),​这样才能确定最后不等式组的边界,得到极值​。那么,如何处理形如这种单变量常数关系呢?

【问题】如何化形如 \(x_i ≤ c\),其中 \(c\)是一个常数的这类关系?

答:建立一个虚拟源点 \(0\),换为 \(x_i ≤ x_0 + c\),然后建立 \(0 → i\),长度是 \(c\)的边。



举报

相关推荐

0 条评论