弗洛伊德(Floyd)算法

来源:互联网 发布:网络现金赌博官网 编辑:程序博客网 时间:2024/04/30 02:00

弗洛伊德(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 | 微博@从流域到海域

0 0