差分约束
差分约束是解决这样一类问题
给出\(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\)时必定出现负环
例题
几道水题
还有两道\(n\)年以前做的,没写题解