差分约束
差分约束
开头小结:差分约束是一类系统,我们称之为差分约束系统,他其实是一种模型,而最难的是如何根据题目给出的调节来构建出这个模型,大家可以多去联系联系,看看别人给出的思考方式并加以总结(如果我有时间,也会做个专栏来聊一下),如果你们很喜欢这种含沙射影的算法的话,可以去挑战一下网络流,感受一下快乐......
差分约束难点:
- 建图(建模)。
- 它单纯只是作为一个工具,和其他各种算法联用。
引入
假设给定n个变量和m个不等式(形如\(x_i-x_j<=a_x,0<=i,j<n\)),要求快速求出\(x_{n-1}-x_0\)的最大值。
for example: n=4
那么显然,我们可以进行一些数学变换(相信您可以完成,如果不可以,请转入少儿频道重修一下......)
So:\(x_3-x_0<=3\) 当然,这个例子不太好,我们要取所有式子中右边\(a_i\)最小中最大的。
那么如何让计算机来进行化简呢?(它脑子不太灵光的样子)
那么很显然(其实一点也不显然),我们对于每个不等式可以把它变成一个图,然后最短路就是答案了。
考虑:
第一:我们将所有不等式按有向图建立,方向就是减号的方向(从被减数到减数),大小为题目给定的右项的值。
第二:短路。
那么很好理解:我们从第一个起点\(x_{n-1}\)到终点\(x_0\),一直把一条路径走完,那么是不是我们根据上述例子,我们合并了可以变成\(x_{n-1}-x_0<=k\)的式子,所以就可以解决这个问题。
差分约束
我们一般喜欢从正面来做这个问题(从\(x_0\)做到\(x_{n-1}\)),那么我们就可以把不式改变一下:
那么,\(cost_{i,j}=a_{i,j}\),最短路通过上述描述也就很好解决,(其实和上面没区别(我个人感觉......))。
那么相应的,我们得考虑下面这个大问题:
解之有无
很显然,出现负环我们就没有最大值,因为我们会无限跑圈......
这时候想到环,那我们作为一个有向图,是不是还有另一种情况:
-
C可以直接到A
-
C经过B到A
那么我们看到这种类似环的三角结构应该很显然就可以想到数学上的三角不等式(用来进行松弛操作)。由此类推,将问题的规模递推到n,m,那就变味了最短路问题,也就是上文利用最短路进行差分约束问题求解的例证。(并不那么严谨)
1、 x[t]-x[s]不存在最大值(负环)
2、x[t]和x[s]不连通导致无法求解(无限多的解。。。)