问题
如果从图中某一顶点到达另一顶点的路径可能不止一条,如何找到一条路径使得沿此路径上各边的权值总和(称为路径长度)达到最小。可以将适用最短路的算法分为单源最短路和多源最短路。
解析
多源最短路算法Floyd
以下图为例,用Floyd算法求解下图各个顶点的最短距离。
从任意节点 i 到任意节点 j 的最短路径有两种可能,一是直接从 i 到 j ,二是从 i 经过若干个节点 k 到 j 。所以核心为d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
设计
伪代码:
int d[110][110],n;
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
//比较d[i][j]和d[i][k]+d[k][j]的大小得出点i和j的最短路径
}
}
}
分析
i,j,k都为1~n逐个遍历,3重循环,容易得出:
源码
github源码地址:
https://github.com/loadin61/cuddly-memory