📜  DAA |约翰逊算法

📅  最后修改于: 2020-12-10 07:06:45             🧑  作者: Mango

约翰逊算法

问题是要在给定的加权有向图中找到每对顶点之间的最短路径,并且权重可能为负。使用约翰逊算法,我们可以找到所有对以O(V 2 log?V + VE)时间最短的路径。约翰逊算法同时使用Dijkstra算法和Bellman-Ford算法。

约翰逊算法使用“重新加权”技术。如果图中G =(V,E)的所有边缘权重w为非负值,则可以通过从每个顶点运行一次Dijkstra算法来找到所有顶点对之间的最短路径。如果G具有负负权重边缘,我们将计算一组新的非负负权重,从而使我们可以使用相同的方法。新的边缘权重集w必须满足两个基本属性:

  • 对于所有的顶点对U,V∈V,从u到v使用加权函数w的最短路径是从也u到v使用加权函数w的最短路径。
  • 对于所有边(u,v),新的权重w(u,v)是非负的。

给定一个加权有向图G =(V,E),权重函数w:E→R,而h:v→R为将顶点映射为实数的任何函数。

对于每个边(u,v)∈E定义

其中h(u)= u的标签
h(v)= p="" v的标签<="">

例:

步骤1:将任何源顶点的'放在图形外,并使's'到每个顶点'0'的距离。

步骤2:应用Bellman-Ford算法并计算每个顶点的最小权重。

步骤3: w(a,b)= w(a,b)+ h(a)-h(b)
= -3 +(-1)-(-4)
= 0

w(b,a)= w(b,a)+ h(b)-h(a)
+="" +(-1)-(-1)
="1
" +(-1)-0="1="0
" 0-(-1)
="0
" 5="" =="" h(a)-h(d)
="" h(b)-h(c)
="" h(c)-h(a)
="" h(d)-h(a)
="" h(d)-h(c)
="" w(a,d)="2" w(b,c)="3" w(c,a)="1" w(d,a)="-1" w(d,c)="4">

步骤4:现在所有边缘权重均为正,现在我们可以在每个顶点上应用Dijkstra算法,并使矩阵与图中的每个顶点相对应

情况1: “ a”作为源顶点


情况2: “ b”作为源顶点


情况3: “ c”作为源顶点


案例4: “ d”作为源顶点



第五步:

d uv ←δ(u,v)+ h(v)-h(u)
d(a,a)= 0 +(-1)-(-1)= 0
d(a,b)= 0 +(-4)-(-1)= -3
d(a,c)= 0 +(-1)-(-1)= 0
d(a,d)= 1 +(0)-(-1)= 2
d(b,a)= 1 +(-1)-(-4)= 4
d(b,b)= 0 +(-4)-(-4)= 0
d(c,a)= 1 +(-1)-(-1)= 1
d(c,b)= 1 +(-4)-(-1)= -2
d(c,c)= 0
d(c,d)= 2 +(0)-(-1)= 3
d(d,a)= 0 +(-1)-(0)= -1
d(d,b)= 0 +(-4)-(0)= -4
d(d,c)= 0 +(-1)-(0)= -1
d(d,d)= 0


>


h(v)=>