初探Floyd和Dijkstra
Posted zhhhb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探Floyd和Dijkstra相关的知识,希望对你有一定的参考价值。
Floyd:
问题:Floyd算法求解下图各个顶点的最短距离
解析:
从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,算法假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,算法检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离
核心代码:
for(u = 0; u < G.vexnum; ++ u) for(v = 0; v < G.vexnum; ++ v) for(w = 0; w < G.vexnum; ++ w) if(D[v][u] + D[u][w] < D[v][w])// 从v经u到w的一条路径更短 D[v][w] = D[v][u] + D[u][w];
Dijkstra:
问题:用Dijkstra算法求由顶点a到顶点b的最短路径
解析:
① 不断运行广度优先算法找可见点,计算可见点到源点的距离长度
② 从当前已知的路径中选择长度最短的将其顶点加入S作为确定找到的最短路径的顶点。
|
a |
b |
c |
d |
e |
f |
g |
h |
A |
0 |
1 |
2 |
∞ |
∞ |
∞ |
∞ |
∞ |
B |
∞ |
0 |
∞ |
2 |
∞ |
∞ |
∞ |
∞ |
C |
2 |
∞ |
0 |
∞ |
∞ |
∞ |
∞ |
∞ |
D |
∞ |
∞ |
1 |
0 |
∞ |
8 |
∞ |
∞ |
E |
∞ |
∞ |
∞ |
2 |
0 |
∞ |
2 |
∞ |
F |
∞ |
∞ |
∞ |
∞ |
2 |
0 |
∞ |
∞ |
G |
∞ |
∞ |
∞ |
∞ |
∞ |
3 |
0 |
3 |
h |
∞ |
∞ |
∞ |
∞ |
∞ |
2 |
∞ |
0 |
以上是关于初探Floyd和Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章
hdoj2544 最短路(Dijkstra || Floyd || SPFA)