我们继续进行对spfa的讨论。
/*spfa 与 差分约束*/
有一种听起来很神奇的东东叫做“差分约束系统”。其实也是利用spfa实现的。
大概的问题是这样的:给定一些元素和关于他们的不等式,求解当某些元素值固定条件下,另外一些元素的最值。
我们一般将他们转化为最短路进行求解。
首先考察spfa进行松弛的原理:
松弛最大值:dis(a) >= dis(b) + len(b->a) (用b来松弛a保证达到这个条件)
因而在spfa时我们这样写:
if dis[a] < dis[b] + len[b - > a] then
dis[a] -> dis[b] + len[b - > a]
......
同理,松弛最小值:dis(a) <= dis(b) + len(b -> a)
(用b来松弛a保证达到这个条件)
spfa代码:
if dis[a] > dis[b] + len[b - > a] then
dis[a] -> dis[b] + len[b - > a]
......
这叫做神马“三角不等式”。。。
通过不等式建立差分约束系统时,需要把已知的不等式套入“三角不等式中”,决定如何连边。