首页 > 代码库 > 差分约束系统--详讲
差分约束系统--详讲
------------差分约束题目请戳:差分约束题集暨报告
总的开说差分约束问题就是给出一系列不等式然后求问某一式子的最大值或者最小值。
差分约束问题具体解释:
比方有这样一组不等式:
X1 - X2 <= 0
X1 - X5 <= -1
X2 - X5 <= 1
X3 - X1 <= 5 不等式组(1)
X4 - X1 <= 4
X4 - X3 <= -1
X5 - X3 <= -3
X5 - X4 <= -3
全都是两个未知数的差小于等于某个常数(大于等于也能够,由于左右乘以-1就能够化成小于等于)。这种不等式组就称作差分约束系统。
这个不等式组要么无解,要么就有无数组解。
由于假设有一组解{X1, X2, ..., Xn}的话,那么对于不论什么一个常数k。{X1 + k, X2 + k, ..., Xn + k}肯定也是一组解,由于不论什么两个数同一时候加一个数之后。它们的差是不变的,那么这个差分约束系统中的全部不等式都不会被破坏。
差分约束系统的解法利用到了单源最短路径问题中的三角形不等式。
即对于不论什么一条边u -> v。都有:
d(v) <= d(u) + w(u, v)
当中d(u)和d(v)是从源点分别到点u和点v的最短路径的权值,w(u, v)是边u -> v的权值。
显然以上不等式就是d(v) - d(u) <= w(u, v)。这个形式正好和差分约束系统中的不等式形式同样。于是我们就能够把一个差分约束系统转化成一张图,每一个未知数Xi相应图中的一个顶点Vi,把全部不等式都化成图中的一条边。对于不等式Xi - Xj <= c。把它化成三角形不等式:Xi <= Xj + c,就能够化成边Vj -> Vi。权值为c。
在建立图的时候应该与目标函数的符号同样。即目标函数为>=,不等式的符号也应该变为>=,再依据不等式建立图。
相反,假设是<=,不等式也应该所有变为<=,再建立图;
(一致性)符号是>=或者<=,并不是<和>
上文就讲了怎样依据不等式建立图,哪究竟和问题的不等式的最大值或者最小值有什么关联呢?
如题目要求d(v) - d(u)的最小值,能够转换成d(v) - d(u) >=M,而依据上文得知M为u->v的权值。
要想上式子成立,则应有min(d(v) - d(u))>=max(M),即转成了求u->v最长的路径即式子的最小值
同样,假设求d(v) - d(u)的最大值。这应该求u->v的最小路径
对于差分不等式。a - b <= c 。求的是最短路,得到的是最大值;
对于差分不等式, a - b >= c ,求的是最长路。得到的是最小值。
关于补不补充源点:
事实上差分约束并不须要附加源点。附加源点的唯一作用是连接 整个图(保证图的连通),不让你有负环判不到的情况。
(超级源点)
当然解决问题的最佳途径是初始把全部的顶点都增加队列,并将全部的dist置0。
这就相当于从每个顶点開始遍历。也就不用附加源点了。
假设图中存在负权值回路。则求出来的最短路径没有意义。
也就是说不等式无解。所以要从是否有负权值回路进而推断有无解。
------------差分约束题目请戳:差分约束题集暨报告
差分约束系统--详讲