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

  • 相关阅读:
    install jprofiler for ubuntu
    android manifest相关属性
    install nginx for ubuntu
    Android shape
    mobile web for no cookie session
    Android布局属性
    什么是强类型,强类型集合
    radl (三) (转)
    几个.net 基础问题,自己回答了一些,请大家指教
    c#接口和抽象类的区别
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842649.html
Copyright © 2020-2023  润新知