zoukankan      html  css  js  c++  java
  • Johnson算法:多源最短路算法

    Johnson算法

    请不要轻易点击标题

    一个适用于求可含负边权的稀疏图的多源最短路算法

    时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\)

    空间复杂度\(O(n+m)\)

    该算法综合利用了Dijkstra算法和Bellman-Ford算法(不要慌,虽然有负边但Dijkstra可以跑!)

    在开始讲解之前,我们将其与floyd算法进行比较


    \(\text{floyd}\)算法

    ​ 时间复杂度\(O(n^3+m)\)

    ​ 空间复杂度\(O(n^2)\)

    ​ 可以看出,\(\text{floyd}\)复杂度与\(m\)无关 , 适用于稠密图的最短路,而\(Johnson\)算法则是适用于稀疏图最短路


    \[\ \]

    我对该算法的理解

    \(Johnson\)算法

    限制条件:没有负环即可

    在有负权边的图上,\(Dijkstra\)的转移受到限制,我们需要进行一定处理

    核心 : 将边权\(reweight\),保证边权非负后,即可跑\(n\)\(Dijkstra\),复杂度稳定\(n \cdot m \cdot log \ m\)(相较于SPFA来说稳定很多)

    \[\ \]


    Reweight过程

    ​1.建立超级源点0号节点,向\(1 - n\)号节点建立边权为0的有向边

    ​2.利用Bellman-Ford(或SPFA)求得\(dis[0][1..n]\)

    ​3.将边\((u,v,w)\)的边权\(w\)加上\(dis[0][u]-dis[0][v]\),使得边权非负

    ​4.在非负边权的图上,使用\(n\)次堆优化Dijkstra求得最短路

    ​5.将\(dis[u][v]\)加上\(dis[0][v]-dis[0][u]\)还原


    \[\ \]

    关于Reweight的正确性

    1.边权非负性:根据三角不等式\(dis[v]\leq dis[u]+w\),移项得到\(w+dis[u]-dis[v] \ge 0\),故Reweight后边权非负

    2.最短路的保留:对于一条最短路\(\lbrace p_1,p_2,..,p_k\rbrace\),Reweight后更改的权值即\(dis[p1]-dis[p2]+dis[p2]-dis[p3]...-dis[p_k]\)

    ​ 即\(dis[0][v]-dis[0][u]\),两点间最短路只会有常数修改,因此对于任意两点保留了最短路

    所以我们可以直接用这个算法解决一些特殊的问题

    当然这个也被应用于优化费用流,即Dijkstra费用流

  • 相关阅读:
    JavaScript递归方法 生成 json tree 树形结构数据
    分布式系统唯一ID生成方案汇总
    Twitter-Snowflake,64位自增ID算法详解
    手机端页面自适应解决方案—rem布局
    vue.js之路由
    kafka数据迁移实践
    mysql查询时强制区分大小写
    js加密参数传给后台,后台解密base64
    Target runtime com.genuitec.runtime.generic.jee60 is not defined
    怎么在点击浏览器前进、后退键时刷新页面而不读取缓存
  • 原文地址:https://www.cnblogs.com/chasedeath/p/11378943.html
Copyright © 2011-2022 走看看