差分约束是解决这样一类问题
给出n个形如x[j]-x[i]<=k的式子,求x[n]-x[1]的最大/最小值
其实这个问题是挺套路的
我们把给出的式子变一下
x[j]-x[i]<=k
x[j]<=x[i]+k
我们不难联想到图论中最短路的性质
假设d[x]表示1到x的最短路
那么对于任意一条边(u,v)
有d[v]<=d[u]+k(k表示边权)
可能有些抽象,举个例子
经过计算不难得到三个不等式
1.(3) x3 - x0 <= 8
2.(2) + (5) x3 - x0 <= 9
3.(1) + (4) + (5) x3 - x0 <= 7
这样的话,我们在满足条件的情况下x[3]-x[0]最大为7
我们按上面的方法建出图
不难发现图中的最短路就是我们想要的答案!
难道这是巧合么?
肯定不是。仔细观察不难发现,我们连边的过程其实就是在转换不等式,求最短路其实就是求最小的限制条件。这样求出来的最短路即为满足条件的最大值
这玩意儿其实挺套路的
如果你找出了题目中的限制条件,直接建图就好
最大值—>把所有式子整理为x[j]-x[i]<=k,从i向j连一条边权为k的边,跑最短
路
最小值—>把所有式子整理为x[j]-x[i]>=k,从i向j连一条边权为k的边,跑最长
路
在求解的时,因为经常要判断负环,所以选用SPFA算法
当一个点的入队次数超过n时必定出现负环