弗洛伊德(Floyd)算法
弗洛伊德(Floyd)算法求图中两点的最短路径
佛罗依德(Floyd )算法的基本思想:
设图g用邻接矩阵法表示,求图g中任意一对顶点vi与vj间的的最短路径。
(-1)将vi到vj的最短的路径长度初始化为g.arcs[i][j].adj,进行如下n次比较和修正:
(0)在vi与vj间加入顶点v0,比较(vi, v0, vj )和(vi, vj)的路径的长度,取其中较短的路径作为vi到vj的且中间顶点编号不大于0的最短路径。
(1)在vi与vj间加入顶点v1,得(vi,…, v1 )和(v1,…, vj),其中(vi,…, v1)是vi到v1间中间顶点编号不大于0的最短路径,(v1,…, vj)是v1到vj的且中间顶点编号不大于0的最短路径,这两条路径在上一步中均已求出。将(vi,…, v1,…, vj )与上一步已求出的vi到vj中间顶点号不大于0的最短路径比较,取其中较短的路径作为vi到vj的中间顶点号不大于1的最短路径。
(2)在vi与vj间加入顶点v2,得(vi,…,v2)和(v2,…, vj ),其中(vi,…,v2)是vi到v2 的中间顶点号不大于1的最短路径,(v2,…, vj) 是v2到vj的中间顶点号不大于1的最短路径,这两条路径在上一步中已求出。将(vi,…,v2,…,vj)与上一步已求出的vi到vj中间顶点号不大于1的最短路径比较,取其中较短的路径作为vi到vj的中间顶点号不大于2的最短路径。
…
依次类推,经过n次比较和修正,在第(n-1)步,将求得vi到vj的且中间顶点号不大于n-1的最短路径,必为从vi到vj的最短路径。
typedef Seqlist VertexSet;
ShortestPath_Floyd(AdjMartrix g,
WeightType dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM]),
VertexSet path[MAX_VERTEX_NUM][MAX_VERTEX_NUM]) {
/*g为带权有向图的邻接矩阵表示发,path[i]vi到vj的当前最短路径,
dist[i][j]为vi到vj的最短路径长度*/
for(i = 0; i < g.vexnum; i++) { //初始化dist[i][j]和path[i][j]
for(j = 0; j < g.vexnum; j++) {
InitList(&p[i][j]);
dist[i][j] = g.arcs[i][j].adj;
if(dist[i][j] < INFINITY) {
AddTail(&path[i][j], g.vertex[i]);
AddTail(&path[i][j], g.vertex[j]);
}
}
}
for(k = 0; k < g.vexnum; k++) {
for(i = 0; i < g.vexnum; i++) {
for(j = 0; j <g.vexnum; j++) {
if(dist[i][k] + dist[k][j] < dist[i][j]) {
dist = dist[i][k] + dist[k][j];
path = JoinList(path[k][i], path[i][j]);
}//End if JoinList合并顺序表操作
} //End for(j)
} //End for(i)
} //End for(k)
}
知乎:Solo | 微博@从流域到海域