如何判断图中存环(正&负)
1.正环
用 SPFA不断的进行松弛操作,发现当前金额可以比本身大就更新,同时记录更新次数。如果更新次数超过n次,说明存在”正“环。
2.负环
这里先说明下负环。(求最短距离的时候)
在我们用SPFA求最短路径的时候,如果存在负环,在松弛操作的时候总会加入队列 因为最小距离会越来越小,同样这里如果经过一次次的转换,如果可以使本金增大,那么松弛操作也会无限进行下去,我们以n为界限,超过n就说明存在正环,也就说明可以使本金增大。
用spfa算法。经验证:当一个点重复进入队列n次以上,就存在负环。
题目大意:
有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加?
货币的交换是可以重复多次的,所以我们需要找出是否存在正权回路,且最后得到的s金额是增加的
怎么找正权回路呢?(正权回路:在这一回路上,顶点的权值能不断增加即能一直进行松弛)
解题思路:单源最短路径算法,因为题目可能存在负边,所以用Bellman Ford算法,
原始Bellman Ford可以用来求负环,这题需要改进一下用来求正环
本题是“求最大路径”,之所以被归类为“求最小路径”是因为本题题恰恰与bellman-Ford算法的松弛条件相反,
求的是能无限松弛的最大正权路径,但是依然能够利用bellman-Ford的思想去解题。
因此初始化dis(S)=V 而源点到其他点的距离(权值)初始化为无穷小(0),当s到其他某点的距离能不断变大时,
说明存在最大路径;如果可以一直变大,说明存在正环。判断是否存在环路,用Bellman-Ford和spfa都可以。