差分约束
什么是差分约束 ? 差分约束是干什么的?? 我们这里就是围绕这两个问题去讲的
差分约束就是解决形如
xi <= xj + c
这样的不等式组,也就是求出一系列这样的不等式组的可行解
1. 求不等式组的可行解
首先源点要满足的条件 :从源点出发, 一定可以走到所有的边。
步骤:
1: 我们仔细观察不难发现 形如这样的不等式是不是很像求最短路里的那个不等式, dist[j] > dist[i] + w[i] 如果我们已经求完不这条路径上最短路的话 那么不等式就一定满足 dist[i] <= dist[j] + w[i] 因为每个dist[i] 这里面的值存的都是最小值 如果dist[i] 还是会大于dist[j] + w[i]话那么就会把dist[i] 给更新掉 使dist[i]变成最小的了是不是, 所以就会满足上面的不等式 , 然后上面的不等式 又和差分约束的不等式很像,也就是说 xi <= xj + c 就可以转化为 一条从j--->i 边权为c的路径 , 也就是说可以转为最短路的问题了是吧。
2: 我们经过上面的转化就变成了最短路的问题了, 我们要走到所以的边,所以就要建一个超级源点, 使这个超级源点一定可以遍历到所有的边 , 这是里和求最短里不同的地方, 求最短路 要求遍历到所有的点就行,但是这里是要经过所有的边 不然一旦没有走到一条边的话, 这组不等式就求不出可行解了。
3: 这里我们讨论有没有负环, 因为在最短路里就有可能会负环, 所有一旦有负环又是怎样的结果。
结果1:我们根据这个图的推导 就知道 如果存在负环的话,那么就一定无解, 反之也是一样的
结果2:如果没有负环的话,那么dist[i] 就是原不等式组的一个可行解
因为我们是把这个不等式组转化为了最短路是吧 所有求出的dist[i] 就是解
我们上面的是转化为最短路来做的 , 当然 我们也可以转化为最长路来做, 这样的话就要反过来了 因为最长路的不等式是这样的
dist[j] < dist[i] + w[i]
经过不断更新之后就变成了 dist[i] >= dist[j] + w[i] 然后这个不等式就对应着xi >= xj + c
就是说只要是形如这样不等式就可以转化为最长路来做, 负环的推导和上面是一样的
2. 如何求最大值和最小值
这个是差分约束的第二个问题, 一般是差分约束就是叫你求最大值或最小值,(这里的最大值和最小值是每个变量的最值)
我们先说下结论:1.如果是叫我们求最小值,那我们就用最长路来做, 2.如果是叫我们求最大值,那我们就用最短路来做
我们就以最大值为例:因为是计算最大值 所以不等式就是xi <= xj + c这样的形式是吧 只有这样才是最大值,这个就是最基本的数学知识了, 然后就把这样的不等式转化为 路径 就会 构成不等式链 xi <= xj +c1 <= xk + c1 + c2 <= …<= c1 + c2 这样可以求出每个xi的上界 就比如x1 <= 5, x2 <= 3, x3 <=2, 既然要满足这三个不等式 就只能求最小那个是吧,也就是取x3 <= 2, 也就是说最终xi的最大值就是所有上界的最小值
总结:
总的来说就是碰到 形如xi <= xj + c的 或者形如xi >= xj + c的就用差分约束, 差分约束还有难点就是如何 把问题里条件转化为 形如这样的不等式, 这是个难点, 还有就是这个不等式组的关系是要绝对的, 不能是相对的,如果题目没有给出那种绝对的关系的话, 我们通常的做法是 建一个超级源点(虚拟的), 超级源点到自己的边权就是0咯。