最短路径算法dijkstra
该算法的核心就是从当前节点的邻居节点中找到距离起始节点的最近那个节点,作为下步迭代的节点。
一 算法步骤
- 给定起始节点 s ( v 0 ) s(v_0) s(v0)、邻接矩阵 A A A[定义待补充];
- 初始化 n n n维零标记向量 l a b e l label label, n n n维 i n f inf inf距离向量 d i s t a n c e distance distance;
- s ( v 0 ) s(v_0) s(v0)开始,更新 l a b e l [ 0 ] = 1 label[0] = 1 label[0]=1, d i s t a n c e [ 0 ] = 0 distance[0] = 0 distance[0]=0;
- 遍历搜索,更新 l a b e l label label、 d i s t a n c e distance distance,记当前搜索节点 v i v_i vi,如果 l a b e l [ j ] ! = 1 且 A [ i , j ] + d i s t a n c e [ i ] < d i s t i n c e [ j ] label[j] != 1且A[i,j] + distance[i] < distince[j] label[j]!=1且A[i,j]+distance[i]<distince[j],更新 d i s t i n c e [ j ] = A [ i , j ] + d i s t a n c e [ i ] distince[j] = A[i,j] + distance[i] distince[j]=A[i,j]+distance[i], j 为 m i n ( A [ i , j ] + d i s t a n c e [ i ] ) j 为 min(A[i,j] + distance[i]) j为min(A[i,j]+distance[i])时的下次搜索节点,更新 l a b e l [ j ] = 1 label[j] = 1 label[j]=1。
二 例子
- 邻接矩阵A
v0 | v1 | v2 | v3 | v4 | v5 | |
---|---|---|---|---|---|---|
v0 | 0 | 1 | 12 | inf | inf | inf |
v1 | inf | 0 | 9 | 3 | inf | inf |
v2 | inf | inf | 0 | inf | 5 | inf |
v3 | inf | inf | 4 | 0 | 13 | 15 |
v4 | inf | inf | inf | inf | 0 | 4 |
v5 | inf | inf | inf | inf | inf | 0 |
- 示例图
- 过程
3.1
v
0
v_0
v0,
A
A
A;
3.2 标记向量
l
a
b
e
l
=
[
0
,
0
,
0
,
0
,
0
,
0
]
label = [0, 0, 0, 0, 0, 0]
label=[0,0,0,0,0,0]、
距离向量
d
i
s
t
a
n
c
e
=
[
i
n
f
,
i
n
f
,
i
n
f
,
i
n
f
,
i
n
f
,
i
n
f
]
distance = [inf, inf, inf, inf, inf, inf]
distance=[inf,inf,inf,inf,inf,inf];
3.3
v
0
v_0
v0开始,所以更新
l
a
b
e
l
=
[
1
,
0
,
0
,
0
,
0
,
0
]
label = [1, 0, 0, 0, 0, 0]
label=[1,0,0,0,0,0],
d
i
s
t
a
n
c
e
=
[
0
,
i
n
f
,
i
n
f
,
i
n
f
,
i
n
f
,
i
n
f
]
distance = [0, inf, inf, inf, inf, inf]
distance=[0,inf,inf,inf,inf,inf];
3.4 更新
l
a
b
e
l
、
d
i
s
t
a
n
c
e
label、distance
label、distance
因为
l
a
b
e
l
[
1
]
!
=
1
且
A
[
0
,
1
]
+
d
i
s
t
a
n
c
e
[
0
]
<
d
i
s
t
i
n
c
e
[
1
]
label[1] != 1且A[0,1] + distance[0] < distince[1]
label[1]!=1且A[0,1]+distance[0]<distince[1],所以更新
d
i
s
t
i
n
c
e
[
1
]
=
1
distince[1] = 1
distince[1]=1,
因为
l
a
b
e
l
[
1
]
!
=
1
且
A
[
0
,
2
]
+
d
i
s
t
a
n
c
e
[
0
]
<
d
i
s
t
i
n
c
e
[
2
]
label[1] != 1且A[0,2] + distance[0] < distince[2]
label[1]!=1且A[0,2]+distance[0]<distince[2],所以更新
d
i
s
t
i
n
c
e
[
2
]
=
12
distince[2] = 12
distince[2]=12,
1
为
m
i
n
(
A
[
i
,
j
]
+
d
i
s
t
a
n
c
e
[
i
]
)
1 为 min(A[i,j] + distance[i])
1为min(A[i,j]+distance[i])时的下次搜索节点
v
1
v_1
v1,
此时
l
a
b
e
l
=
[
1
,
1
,
0
,
0
,
0
,
0
]
label = [1, 1, 0, 0, 0, 0]
label=[1,1,0,0,0,0]
d
i
s
t
a
n
c
e
=
[
0
,
1
,
12
,
i
n
f
,
i
n
f
,
i
n
f
]
distance = [0, 1, 12, inf, inf, inf]
distance=[0,1,12,inf,inf,inf]
最终得到
d
i
s
t
a
n
c
e
=
[
0
,
1
,
8
,
4
,
13
,
17
]
distance = [0, 1, 8,4,13, 17]
distance=[0,1,8,4,13,17]。