概念:差分约束比较偏数学,一般问题都是关于不等式组:xi <= xj + ck,其中ck为常数,对于这样类型的不等式我们可以联系图论中的三角不等式:dis[i] <= dis[j] + c,我们可以将每一个这样的不等式看成是图论中从j-->i的边,求解从每个点到源点的最短路径,任何一个最短路问题都可以转化为差分约束的问题,反过来也一样,所以每一个差分问题都可以等价为图论中的单源最短路问题,当我们要求解一个可行解的时候把不等式转化为一条边,在图中求某一个点的单源最短路径问题即可,求解完成之后是满足所有限制条件的,这里需要解决两个问题:
1. 求解不等式的可行解
源点需要满足的条件:源点是不能够随便取的,从源点出发一定要到达所有边,求解的步骤:
(1)先将每一个不等式xi <= xj + ck, 转化为一条从xj到xi,长度为ck的一条边;
(2)找一个超级源点,使得该源点一定可以遍历所有的边;
(3)从源点出发求解单源最短路径;
求解的结果:结果1:如果存在负环,则原不等式组一定无解;结果2:如果没有负环则dis[i]就是原不等式组的一个可行解; 可以使用spfa算法找正环或者负环,如果存在正环或者负环那么一定可以推出类似于xi < xi的不等式关系,存在矛盾所以是无解的。
由于最短路与最长路是相对的,所以求解最短路的时候:j->i中的边满足dis(i) <= dis(j) + ck,xi <= xj + ck==>xj >= xi - ck也即从i到j连一条-ck的边,所以也可以转化为最长路来求解。
2. 如何求解可行的最小值与可行的最大值,这里的最值指的是每一个变量的最值,每一个最值相加那么就等于总体的最值,结论:如果求解的是最小值那么求解的是最长路,如果求解的是最大值那么求解的是最短路
我们在求解最值的时候一定有一个前提是必然会有一种类似于这样的不等式:xi >= 0,因为如果所有的不等式的都是类似于xi <= xj + c那么肯定不能够求解出最值,因为他们之间表示的其实是一种相对的关系,没有绝对的关系是不能够求最值的,当我们求解出xi <= xj + ck的一组可行解{x1,x2,....xk},则{x1 + d,x2 + d...xk + d}也是一组可行解,所以求解最值必然题目中有一个约束条件使其限制在一个范围之内,这里有一个问题是:如何转化xi <=c不等式,其中c是一个常数,方法:我们可以建立一个编号为0的虚拟源点,其中xi <= c等价于xi <= x0 + c,其中x0 = 0,然后建立从0-->i的边权为c的边,在求解最值的时候我们肯定是通过不等于链找到一个上限最终肯定是与x0相关的,因为右边只有是常量的时候才可以求解上限:xi <= xj + c1 <= xk + c1 + c2 <= ....x0 + x1 + x2 + ... xk,而x0 = 0。所以我们在求xi上限的时候枚举所有由xi构成的不等式链xi <= xj + ck....所计算出的上界,最终xi的最大值为所有不等式上界的最小值,对于每一个不等式链在图论中是什么问题呢?===>每一个不等式链都是从0号点出发走到i的一条路径,对于任何一条这样的路径都对应一个不等式链,右边的常数恰好等于最短路径的长度,所以求上界的最小值等价于求解从0-->i路径的最小值,也即求解单源最短路径,求解的是每一个dis[i]的最大值,最长路其实与最短路是对称的,单源最长路径求解的是下界的最大值,也即求解的是每一个dis[i]的最小值。
差分约束题目的理论基础是非常重要的,理解之后需要记住结论,这样做题目会比较快。
3. 建图
建图的时候都是不等号右边的节点向左边节点连一条边