关于差分约束系统中跑最长路还是最短路的澄清

3 篇文章 0 订阅
3 篇文章 0 订阅

关于差分约束系统中跑最长路还是最短路的澄清

0x01 前置知识

差分约束系统基础【原理、建图】
最短路及负环【主要掌握SPFA】

大家应该都会吧

0x02 错误示范

现在我们需要利用差分约束系统求解 最小解集

注意到,由于最短路跑出来一定满足 d v < = d u + w u , v d_v <= d_u + w_{u,v} dv<=du+wu,v ,这里 d v d_v dv 必然是所有可行的入边中距离最小的(在最短路求解过程中会被不断松弛成最短),即满足条件的理论最小值

故用最短路跑最小解集,同理用最长路跑最大解集

0x03 错误原因

要想知道它为什么不对,我们需要深刻理解差分约束系统的原理

事实上,最短路/最长路求解出的看上去是最小/最大的解,实际只是真实解集的必要区间

众所周知,为了使每个未知量满足题设线性不等式,我们需要利用到最短路/最长路的松弛操作(下面以最短路的松弛为例)

if (dis[v] > dis[u] + w) dis[v] = dis[u] + w;

松弛操作本质上的结果就是使 d v d_v dv 满足所有线性不等式 d u + w > = d v d_u + w >= d_v du+w>=dv ,这显然可以满足题设的约束。但考虑这个 d v d_v dv 理论可以更小吗?答案是肯定的,因为根据题设只需要 d u + w > = d v d_u + w >= d_v du+w>=dv 即可,这里的 d v d_v dv (至少在这里)是无下界的;但在最短路里可以更小吗?答案是否定的,因为最短路一定是要找到一个确切的 d u + w = = d v d_u + w == d_v du+w==dv 才作更新,而需要用来更新的更小的 d v d_v dv 的边在图中并不存在(实际显然无法做到全部存在)

举个栗子,我们可以把最短路的松弛过程简化成 找一个 x x x 使 x < = x <= x<= { 5 , 2 , 3 , 1 , 4 } \{ 5, 2, 3, 1, 4 \} {5,2,3,1,4} 中的任一元素。最短路找到的一定是 1 1 1,因为在这个已知的有限集合里没有元素比 1 1 1 还小了。但实际上 x x x 可以取 ( − ∞ , 1 ] ( -\infty,1 ] (,1] 中的任何一个数。

反而,我们会发现最短路求出来的居然其实是最大值:考虑如果 d v d_v dv 大一点,那就一定不满足所有的约束条件 d u + w > = d v d_u + w >= d_v du+w>=dv,所以这里的 d v d_v dv 是最大的解。

因此,最短路跑出来的是满足题设条件的最大的解集!

同理,最长路跑出来的是满足题设条件的最小的解集!

0x03 总结一下

差分约束系统所利用的最短路松弛来求解,一定程度上是有缺陷的——解出来的值仅限于题设给定的所有约束中(毕竟你一个最短路它每个节点的距离肯定是实际可到的),故一定要理性分析

再强调一下:

要想求最小解集跑最长路;要想求最大解集跑最短路

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值