实验2-2 单源最短路算法Dijkstra

泄露秘密 提交于 2020-03-10 02:45:20

问题

如果从图中某一顶点到达另一顶点的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。可以将适用最短路的算法分为单源最短路和多源最短路。

解析

单源最短路算法Dijkstra
对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径
在这里插入图片描述
每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。即从剩余路径中找最短的路径,然后更新最短路径。

设计

[核心伪代码]
void dijkstra() {
	memset(d, inf, sizeof(d));
	memset(vis, 0, sizeof(vis));
	d[1] = 0;
	//重复进行n-1次
	for (int i = 1; i < n; i++) {
		int x = 0;
		//找到未标记节点中d最小的
		for (int j = 1; j <= n; j++) {
			if (!vis[j] && (x == 0 || d[j] < d[x]))	x = j;
		}
		vis[x] = 1;
		//用全局最小值点x更新其他节点
		for (int y = 1; y <= n; y++) {
			d[y] = min(d[y], d[x] + a[x][y]);
		}
	}
}

分析

dijkstra函数中x循环n-1次,在该循环中还有循环n次j和n次y,所以该算法的复杂度为:
在这里插入图片描述

源码

github源码地址:
https://github.com/loadin61/cuddly-memory

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!