概念
差分约束系统是一种特殊的N元一次不等式组。它包含N个变量x1~XN以及M个约束条件,每个约束条件均形如xi-xj<=ck,其中ck是常数,i,j∈[1,N],k∈[1,M]。
检索
应用一
首先xi - xj <= ck可以转化成xi <= xj + ck。观察这个式子,不难发现其与最短路中dis[y] <= dis[x] + w极为相似。因此可以将每个约束条件看成从节点j连向节点i的一条权值为ck的有向边,那么求解一组可行解只需要跑一遍单源最短路即可。
注意:
单源最短路的源点必须满足能够遍历到所有边。因为要满足一共M个约束条件,我们便会建立M条有向边,能够遍历到其中一条边就相当于考虑了该边对应的约束条件。边集与所有约束条件是一一映射的关系。
单源最短路会出现两种结果:若图中存在负环,则无解;若不存在负环,则dis数组即为答案。下面证明若存在负环则必然无解。
证明:
假设所有约束条件为:x1<=x2+c2,x2<=x3+c3,x3<=x4+c4,……,xk<=x1+c1,显然满足图中存在环。
则必然满足x1<=x2+c2<=x3+c3+c2<=x4+c4+c3+c2<=……<=xk+ck+……+c2<=x1+c1+ck+……+c2,即∑ci>=0。故若∑ci<0,即图中存在负环,则必然无解。
应用二
首先,若{a1,a2,a3,……,aN}是一组解,那么对于任意的常数d,{a1+d,a2+d,a3+d,……,aN+d}必然也是一组解。因为所有的约束条件都是描述变量x之间的相对关系的,并没有数值的界限,故而无法找到最值。
所以,要求最值,则必然会有形如xi<=c(c为任意常数)这样绝对性的条件以提供边界。
考虑此类条件在图上的转化:建立虚拟源点,设为节点0,满足x0=0。则xi<=c <=> xi<=x0+c,也就是从节点0向节点i连一条长度为c的有向边。
以求xi最大值为例,要求xi最大值,则需计算出从xi开始构成的所有不等式链xi<=xj+c1<=xk+c2+c1<=……<=c1+c2+……+ck的上界。
简单来看,所有上界构成xi<=t1,xi<=t2,……,xi<=ts的不等式组,故最终xi的最大值就是所有上界t中的最小值。
而每个上界t=c1+c2+……+ck,即为节点0到节点i的一条路径的长度,故而答案就是节点0到节点i的最短路。
对于上界t即为0到i一条路径长度的证明:
假设约束条件如下:x1<=x0+c0,x2<=x1+c1,x3<=x2+c2,……,xi<=xi-1+ci-1。即相当于0→1→2→3→……→i,其中各边长分别为c0,c1,c2,……,ci-1。
故xi<=xi-1+ci-1<=xi-2+ci-2+ci-1<=……<=x1+c1+……+ci-1<=x0+c0+c1+……+ci-1=x0+c0+c1+……+ci-1。
该上界∑ci即为这条路径的长度。
同理,要求最小值,就需在所有下界中找最大值,即应求最长路长度。则约束条件应形如xi>=xj+ck,图中有正环则无解。当然也可以将约束条件转化为xj<=xi-ck,那么方法就与求最大值相同了。