问题
如果从图中某一顶点到达另一顶点的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。可以将适用最短路的算法分为单源最短路和多源最短路。
解析
单源最短路算法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
来源:CSDN
作者:LLoadin
链接:https://blog.csdn.net/LLoadin/article/details/104762540