关于差分约束系统中跑最长路还是最短路的澄清
关于差分约束系统中跑最长路还是最短路的澄清
0x01 前置知识
差分约束系统基础【原理、建图】
最短路及负环【主要掌握SPFA】
大家应该都会吧
0x02 错误示范
现在我们需要利用差分约束系统求解 最小解集
注意到,由于最短路跑出来一定满足
故用最短路跑最小解集,同理用最长路跑最大解集
0x03 错误原因
要想知道它为什么不对,我们需要深刻理解差分约束系统的原理
事实上,最短路/最长路求解出的看上去是最小/最大的解,实际只是真实解集的必要区间
众所周知,为了使每个未知量满足题设线性不等式,我们需要利用到最短路/最长路的松弛操作(下面以最短路的松弛为例)
if (dis[v] > dis[u] + w) dis[v] = dis[u] + w;
松弛操作本质上的结果就是使
举个栗子,我们可以把最短路的松弛过程简化成 找一个
反而,我们会发现最短路求出来的居然其实是最大值:考虑如果
因此,最短路跑出来的是满足题设条件的最大的解集!
同理,最长路跑出来的是满足题设条件的最小的解集!
0x03 总结一下
差分约束系统所利用的最短路松弛来求解,一定程度上是有缺陷的——解出来的值仅限于题设给定的所有约束中(毕竟你一个最短路它每个节点的距离肯定是实际可到的),故一定要理性分析
再强调一下:
要想求最小解集跑最长路;要想求最大解集跑最短路