- 多源路径算法求解:
对于单源最短路径,可以通过Dijkstra求解,那么多于多源最短路径是否可以利用Dijkstra求解呢?答案是显然的,我们可以通过遍历每个顶点进行Dijkstra求解,时间复杂度为O(n^3),由于Dijkstra算法编写较复杂,对于多源最短路径是否还有其他更简单的算法呢? - 另一种多源路径算法求解 — Floyd算法
Floyd是通过动态规划的思想,我们定义f[k][i][j]表示i和j之间可以通过1,2,3,…k的结点的最短路径,从i到j可以有两种办法,一种是直接从i到j,另一种是借助k,先从i到k,再从k到j。即f[k][i][j]可以从f[k-1][i][j]转移来,也可以从f[k-1][i][k] + f[k-1][k][j]转移而来,即f[k][i][j] = min{f[k-1][i][j],f[k-1][i][k] + f[k-1][k][j]},Floyd算法需要三个for循环进行遍历,时间复杂度为O(n^3)。
void floyd(MGraph* G,int path[][MaxSize], int A[][MaxSize]){
for (int i = 0; i< G->n; i++) {
for (int j = 0; j < G->n ; j++) {
A[i][j] = G->edges[i][j];
path[i][j] = -1;
}
}
for (int k = 0; k < G->n ; k++) {
for (int i = 0; i< G->n; i++) {
for (int j = 0; j < G->n ; j++) {
if (A[i][j]>A[i][k] + A[k][j]) {
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
}