差分约束详解

差分约束

什么是差分约束 ? 差分约束是干什么的?? 我们这里就是围绕这两个问题去讲的

差分约束就是解决形如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咯。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值