基于最短路的差分约束模型
1. 差分约束的功能
- 求不等式组的可行解
- 求满足不等式组的每一个变量的最值
不等式组中每一个不等式形式如下:
其中,\(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\)的边。