1.问题
- 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径,按实验报告模板编写算法。
2.解析
- Dijkstra算法是每次对所有可见点的路径长度进行排序后,选择一条最短的路径,这条路径就是对应顶点到源点的最短路径。可见点就是从源点开始按广度优先算法遍历顶点的过程中,搜索到的点。
步骤如下
1.声明一个数组dist来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T。初始时,原点start的路径权重被赋为0(dist[start] = 0)。求出其它点到start的距离dist[i](相邻则为边权值,不相邻为无穷大)
2.选取最小且未加入集合S的顶点i对应的dist[i](记为d[u]),并将此dist[i]边对应的点u加入集合S,此时的d[u]即为u到初始点的最短距离
3.对于从u出发的所有边[u,j],更新dist[j] = min{dist[j], dist[u]+distmap[u][j]}
4.从dist中找出最小值,重复3,4,直到T中包含了图的所有顶点。
5.最终,dist[end]即为最短路径长度
3.设计
int Dijkstra(int start,int End)
{
dist[start] = 0; //到起点自身的距离为0
for (进行n次)
{
for (遍历顶点1到n)//
{
//寻找此时dist[]中的最小值,并记下其顶点为u
}
visited[u] = 1; //在路径集合中加入该点
for (遍历顶点1到n)
{
//更新与u相邻的dist
//并记录下路径
}
//若终点End也加入结合,则结束循环
}
//返回dist[End]
}
4.分析
- Dijkstra算法的时间复杂度是O(n²),其中每一次找到最近顶点的时间复杂度为O(n),这一步若进行堆排优化,可以使得最后复杂度降为O(nlogn)