美文网首页
图-最短路径-弗洛伊德算法

图-最短路径-弗洛伊德算法

作者: 如春天 | 来源:发表于2020-08-14 14:10 被阅读0次

多源点最短路径-弗洛伊德算法(Floyd)

求所有顶点到所有顶点的最短路径,而迪杰斯特拉是求单源点到所有顶点的最短路径。

几个用到的变量和数组的含义:

  • 变量k:中转顶点坐标
  • 数组P:存放顶点之间的中转结点的数组,比如:
P[1][4] = 2;//顶点1到顶点4途径顶点2
P[2][4] = 3;//顶点2到顶点4又途径顶点3
P[3][4] = 4;//顶点3到顶点4经过顶点4,即表明3->4之间无中转顶点了。
  • 从而得:
  当P[v][k] == k的时候,即走到了路径的最后。
  • 数组D:存放了顶点到顶点之间的最小路径和。

代码实现:

typedef int ShortPathTable[MAXVEX][MAXVEX]
typedef int PathMatrix[MAXVEX][MAXVEX]
void Floyd(MGraph G, PathMatrix *P, ShortPathTable *D)
{
    int v, w, k; /*k为中转顶点的下标*/
    for(v = 0; v < G.numVertexes; v++)
    {
        for(w = 0; w < G.numVertexes; w++)
        {
            (*D)[v][w] = G.arc[v][w];
            (*P)[v][w] = w; /*P[v][w] == w 的时候表明,v -> w 之间没有中转顶点了,初始化的时候肯定都是没有中转顶点的,所以都置为w*/
        }
    }
    /*以上完成了初始化工作*/
    /*注意三层for循环的次序,k作为中转顶点在第二层*/
    for(v = 0; v < G.numVertexes; v++)
    {
        for(k = 0; k < G.numVertexes; k++)
        {
            for(w = 0; w < G.numVertexes; w++)
            {
                /*如果顶点v到w的路径和 大于 顶点v到中转顶点k的路径和 + 顶点k到顶点w的路径和
                  就更新为小者,同时要更新v到w之间经过 [顶点v到顶点k之间的中转顶点]
                */
                if((*D)[v][w] > ((*D)[v][k] + (*D)[k][w]))
                {
                    (*D)[v][w] = ((*D)[v][k] + (*D)[k][w]);
                    (*P)[v][w] = (*P)[v][k];/*路径设置为经过下标为k的顶点*/
                }
            }
        }
    }



    /*根据P数组打印路径的算法*/
    for(v = 0; v < G.numVertexes; v++)
    {
        for(w = v+1; w < G.numVertexes; w++)
        {
            printf("v%d-v%d weight: %d", v, w, (*D)[v][w]);
            k = (*P)[v][w]; /*获得第一个路径顶点下标*/
            printf(" path: %d": v);/*打印源点*/
            while(k != w)
            {
                printf("-> %d", k);
                k = (*P)[k][w];
            }
        }
        printf(" -> %d\n", w);/*打印终点*/
    }
}

相关文章

  • 19-图的最短路径

    图的最短路径 迪杰斯特拉算法 贝尔曼-福特算法 弗洛伊德算法 SPFA算法(中国西南交通大学段凡丁发明) 最短路径...

  • 弗洛伊德算法求图的最短路径 JavaScript实现

    弗洛伊德算法求图的最短路径 JavaScript实现 核心思想我们假设Dis(i,j)为节点u到节点v的最短路径的...

  • 图的应用-最短路径求解

    图的最短路径   图的最短路径是一个起点到一个终点之间最短的路径。  用于解决最短路径问题的算法被称做“最短路径算...

  • 图-最短路径-弗洛伊德算法

    思路 通过中间点修正矩阵 场景 所有顶点至所有顶点的最短路径问题 案例 代码 控制台输出 如何通过P 得到具体的最...

  • 图-最短路径-弗洛伊德算法

    多源点最短路径-弗洛伊德算法(Floyd) 求所有顶点到所有顶点的最短路径,而迪杰斯特拉是求单源点到所有顶点的最短...

  • 头条-手撕代码

    [toc] 图算法 以及最短路径算法 树算法 手写LRU 排序算法 链表算法

  • 图的最短路径算法

    0. 前言 本文将介绍求解图最短路径的三个经典算法:迪杰斯特拉 Dijkstra、弗洛伊德 Floyd、贝尔曼-福...

  • python 狄克斯特拉算法

    前言 狄克斯特拉算法是解决加权图求最短路径的算法,广度优先算法可以求非加权图的最短路径,但是如果图的边权重不一样,...

  • 数据结构与算法学习 (14)最短路径求解

    最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形...

  • 数据结构与算法-最短路径问题

    最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形...

网友评论

      本文标题:图-最短路径-弗洛伊德算法

      本文链接:https://www.haomeiwen.com/subject/zfpgdktx.html