(1)问题
对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
(2)解析
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
基本思想
-
指定起点s(即从顶点s开始计算)。
-
引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
-
初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 -
… 重复该操作,直到遍历完所有顶点。
本题中,起始点是a
(3)设计
-
初始化数组dist,d和p(d和p分别表示未访问的和访问过的);
-
while(d中元素的个数)
-
在dist[n]中求最小值,其编号为k;
-
修改数组dist等;
-
将顶点k添加到数组p中;
(4)分析
时间复杂度为O(N^3)
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,