差分约束系统总体来说就是元素之间有多个大小的限制关系所约束,最后可以类似线性规划的得出一系列可行解集或者解的范围域。

 

约束关系就是这类的不等式: d[3] - d[1] ≤ 10

其实这个关系式的含义就是3号点和1号点的距离可以小于等于10,但是如果距离超过10了,至少可以缩小到距离为10。

将式子移项之后,我们可以得到如下式子:d[3] ≤ d[1] + 10即当:d[3] > d[1] + 10的时候,我们可以将d[3] 更新为 d[1] + 10。

这时我们就发现这样的式子其实就是最短路径松弛中的三角不等式松弛原则。

那么我们就得到了结论:当我们有不等式:d[v] - d[u] ≤ w即:d[v] ≤ d[u] + w时,我们可以在 d[v] > d[u] + w时用d[u] + w 松弛 d[v]

也就相当于在u、v点间加入了一条边权为w的有向边e(u,v),在满足上述三角不等式的时候可以用e通过u松弛v。

 

那么还有d[v] - d[u] ≥ w的情况呢?

现在就很简单了,这个式子就可以转换成:d[u] - d[v] ≤ -w 也就是在v、u间建立边权为-w的有向边e(v,u)

其几何含义也就是:由于u编号比v小,u在v前面,那么d[v]必然大于等于d[u],d[u] - d[v]的值也就小于等于0;

若d[u] - d[v] > -w 也就是u、v距离小于w时,我们至少可以用这个边松弛u的位置,使其距离为w。

 

有的时候我们还需要建立超级源点s来方便我们解题,由于一开始各个点的关系都是不确定的,所以可以将所有点先安排在0点,就是用超级源点向所有点建权为0的边,然后在根据约束条件来确定各点的具体位置。

 

为什么最大值是求最短路而不是求最长路呢?

其实我们可以这样考虑:

首先,我们定的所有点的dis值均为INF(极大值),也就是说一开始我们认为n点距离1点是无穷大的。

而对于某一条边 d[v] ≤ d[u] + w(即使≥的也是从这个式子转化而成的),也就是u和v之间距离不能超过w这个条件,只会在d[v] > d[u] + w的时候即u和v之间距离超过w时才会被用来松弛,而松弛的结果也是使两点距离变成可接受范围内的最大值w,也就是每个边只是松弛到可接受范围内的最大值的。

如果u和v之间的距离已经被其他约束条件限制而小于w了,那么这个条件也就不会起作用也不会使其值更小了,因此最短路求的就是可接受范围内1到n距离的最大值了。

 

如果是 d[u] - d[v] < w,一般利用整数的情况,就是 d[u] - d[v] ≤ w - 1,也可以顺利建图。

如果是 d[u] - d[v] > w,则建立 d[v] - d[u] ≤ -w-1。

 

建图之后最大值求最短路,最小值求最长路即可。