最短路径图算法(shortest path dijkstra)

算法

1)新建一个集合sptSet(shortest path tree set)用来记录最短路径树上的节点。初始状态sptSet为空

2)给图中的节点赋上一个距离值。初始状态所有节点的距离值为INFINITE.将源节点的距离值赋值为0.

3)while sptSet没有包含所有节点:

...a)从图中距离值最小的节点u放入集合sptSet中

...b)更新节点u的所有邻居节点的距离值。更新规则:如果从源节点到u的邻居结点v的距离和小于当前v的距离值,那么更新更新之,否则不更新。

下面举例说明:

最短路径图算法(shortest path dijkstra)_第1张图片

初始状态sptSet为空,图的所有节点的距离值为{0,INF,INF,INF,INF,INF,INF,INF}。现在选择图中距离值最小的放入集合sptSet中。节点0被选中。所以sptSet为{0}。接下来更新节点0的邻居结点的距离值。邻居节点1和7的距离值更新为4和8.下面这个子图显示了被更新的距离值,只有有限距离的节点才在子图中。最小生成树的节点用绿色表示。


从子图中的节点(不包含已经在sptSet中的节点)选择最小距离值的节点。节点1被选中,加入集合sptSet中。sptSet变为{0,1}。更新节点1的所有邻居节点的距离值,节点2的距离值变为12.邻居节点7的距离值不更新是因为当前距离值比较小。

最短路径图算法(shortest path dijkstra)_第2张图片

从子图中的节点(不包含已经在sptSet中的节点)选择最小距离值的节点。节点7被选中。sptSet变为{0,1,7}。更新7的邻居节点的距离值,结点6和8的距离值分别变为9和15.

最短路径图算法(shortest path dijkstra)_第3张图片

从子图中的节点(不包含已经在sptSet中的节点)选择最小距离值的节点。节点6被选中。sptSet变为{0,1,7,6}。更新6的邻居节点的距离值,结点5和8的距离值分别变为15和11.

最短路径图算法(shortest path dijkstra)_第4张图片

按照以上步骤重复执行,最终会得到一个最小生成树:

最短路径图算法(shortest path dijkstra)_第5张图片

C语言实现:

邻接矩阵(adjacence matrix)版

你可能感兴趣的:(最短路径图算法(shortest path dijkstra))