zoukankan      html  css  js  c++  java
  • 如何判断图中存环(正&负)

    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都可以。

  • 相关阅读:
    无法加载 DLL“librdkafka”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)
    C#编码规范
    requests(五)
    python-requests(四):调用上传文件的接口的解决方案
    静态代码扫描工具
    推荐一款 python 管理工具:anaconda
    selenium 网页自动化-在访问一个网页时弹出的浏览器窗口,我该如何处理?
    静态代码扫描工具
    静态代码扫描工具
    静态代码扫描工具
  • 原文地址:https://www.cnblogs.com/Roni-i/p/9445634.html
Copyright © 2011-2022 走看看