zoukankan      html  css  js  c++  java
  • Floyd 最短路径算法(天勤详解)

    Dijkstra 是求某个顶点到其余各个顶点的最短路径。
    Floyd 是求图中任意一对顶点间的最短路径。

    过程

    假设存在有向图,

     采用的存储结构是 邻接矩阵

    首先初始化 A[ ][ ] 方阵,

    path[ ][ ] 方阵默认值为 -1
    A 的下标代表第几个节点,-1 代表初始化节点

     // 初始化
     for (i = 0; i < g.n; i++) {
         for (j = 0; j < g.n; j++) {
             A[i][j] = g.edges[i][j];
             path[i][j] = -1;
         }
     }
        

    按照节点顺序依次遍历 k = 0 时
    首先选择第一个, 以A[0[0]为基准做十字交叉线 X1,类比矩阵的余子式;除了此十字线以外的数字,
    选择一个 A[i][j] 再做一个十字交叉 X2,与 X1 相交于两点 A[i][0]、A[0][j],判断:

    if (A[i][j] > A[i][0] + A[0][j]){
    	A[i][j] = A[i][0] + A[0][j]
     	path[i][j] = k; // 同时修改path, k此时为0
    }

    从上到下、从左到右依次对比 <=> 所有相邻的边
    注意:如果A[i][j] 在以 A[0][0] 为基准的十字线上,就不需要进行比较。
    方阵A 比较完后没有数字修改

     

    k = 1 时,
    以 A[1][1] 为为基准做十字交叉线,比对过程和上述一样。
    只有 A[0][2] 修改条件成立,故 path[0][2] = k 

      

     

    同理 k = 2 时,从上至下、从左至右遍历,除了十字线上的
    修改A[1][0]、A[3][0]、A[3][1]的值
    对应path[1][0] = k、path[3][0] = k、path[3][1] = k

     

    k = 3 时,,从上至下、从左至右遍历,除了十字线上的
    修改A[0][2]、A[1][0]、A[1][2]
    对应path[0][2] = k、path[1][0] = k、path[1][2] = k

    遍历结束。

     

    以对上过程归纳可得天勤代码。

    代码

    void Floyd(MGraph * g, int &path[][maxsize],  int A[][maxsize] ) {
        
        // 初始化
        for (i = 0; i < g.n; i++) {
            for (j = 0; j < g.n; j++) {
                A[i][j] = g.edges[i][j];
                path[i][j] = -1;
            }
        }
        
        
        for (k = 0; k < g.n; k++) {  // 对节点遍历
                                   
            for (i = 0; i < g.n; i++) {  // 对方阵里的值枚举
                for (j = 0; j < g.n; j++) {            
                
                    if( A[i][j] > A[i][k] + A[k][j] ) {  // 修改条件
                        A[i][j] =  A[i][k] + A[k][j];
                        path[][] = k;
                    }
                }
            }
        }
        
    }
    

      

     

  • 相关阅读:
    springboot+websocket 归纳收集
    flask-admin 快速打造博客 系列一
    Flask-sqlalchemy 语法总结
    python 小问题收集
    pyenv+virtual 笔记
    flask_admin 笔记七 扩展功能
    Flask_admin 笔记六 modelView的内置方法
    spring boot 项目中 maven打第三方lib包时遇到的问题以及解决方法
    java 字符串压缩长度并解压
    highcharts中放aqi及6要素,再加上气象5要素的图
  • 原文地址:https://www.cnblogs.com/qianyuesheng/p/15554699.html
Copyright © 2011-2022 走看看