数据结构复习:弗洛伊德算法(Floyd)
弗洛伊德算:
算法的复杂度为O(n^3)
它的思想是以经过一个点到达终点的为最短来更新路径权值矩阵,以及路径前驱矩阵
代码来自大话数据结构:
/* Floyd 算法, 求网图 G 中各顶点 v 到其余顶点 w 的最短路径 P[v][w] 及带权长度 D[v][w] */
void ShortestPath_Floyd(MGraph G, Patharc *P, ShortPathTable *D) {
/* 初始化 D 与 P */
for (int v = 0; v < G.numVertexes; ++v) {
for (int w = 0; w < G.numVertexes; ++w) {
(*D)[v][w] = G.arc[v][w]; /* D[v][w] 值即为对应顶点间的权值 */
(*P)[v][w] = w; /* 初始化 P */
}
}
for (int k = 0; k < G.numVertexes; ++k) {
for (int v = 0; v < G.numVertexes; ++v) {
for (int w = 0; w < G.numVertexes; ++w) {
if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w]) {
/* 如果经过下标为 k 的顶点路径比原两点间路径更短 */
(*D)[v][w] = (*D)[v][k] + (*D)[k][w]; /* 将当前两点间权值设为更小的一个 */
(*P)[v][w] = (*P)[v][k]; /* 路径设置为经过下标为 k 的顶点 */
}
}
}
}
}