zoukankan      html  css  js  c++  java
  • 最短路径——Floyd算法

    最短路径——Floyd算法

    可以用来求带权图和无权图

    Floyd算法:求出每一对顶点之间的最短路径

    使用动态规划思想,将问题的求解分为多个阶段

    第一个矩阵就是图的邻接矩阵

    第二个矩阵表示两个顶点之间的中转点

    遍历上一个阶段留下来的矩阵A,对于上一个矩阵A当中的每一个具体的元素我们都进行:

    若 A^(k-1)[i] [j]>A^(k-1)[i] [k]+A^(k-1)[k] [j]

    则 A^(k)[i] [j] = A^(k-1)[i] [k] + A^(k-1)[k] [j];

    ​ path^(k)[i] [j] = k

    否则A^(k) 和 path^(k)保持原值

    [A^{(-1)}[2] [1]>A^{(-1)}[2] [0]+A^{(-1)}[0] [1]=11 ]

    [A^{(0)}[2] [1] = 11; ]

    [path^{(0)}[2] [1] = 0; ]

    [A^{(0)}[0] [2]>A^{(0)}[0] [1]+A^{(0)}[1] [2]=10 ]

    [A^{(1)}[0] [2] = 10; ]

    [path^{(1)}[0] [2] = 1; ]

    [A^{(1)}[1] [0]>A^{(1)}[1] [2]+A^{(1)}[2] [0]=9 ]

    [A^{(2)}[1] [0] = 9; ]

    [path^{(2)}[1] [0] = 2; ]

    Floyd算法核心代码

    //。。。。准备工作,初始化矩阵A和path
    for(int k=0;k<n;k++){	//考虑以vk作为中转点
        for(int i=0;i<n;i++){	//遍历整个矩阵,i为行号,j为列号
            for(int j=0;j<n;j++){
                if(A[i][j]>A[i][k]+A[k][j]){	//以vk作为中转点的路径更短
                    A[i][j] = A[i][k]+A[k][j];	//更新最短路径长度
                    path[i][j] = k;	//中转点
                }
            }
        }
    }
    

    Floyd算法实例

    练习:floyd算法用于负权图

    //。。。。准备工作,初始化矩阵A和path
    for(int k=0;k<n;k++){	//考虑以vk作为中转点
        for(int i=0;i<n;i++){	//遍历整个矩阵,i为行号,j为列号
            for(int j=0;j<n;j++){
                if(A[i][j]>A[i][k]+A[k][j]){	//以vk作为中转点的路径更短
                    A[i][j] = A[i][k]+A[k][j];	//更新最短路径长度
                    path[i][j] = k;	//中转点
                }
            }
        }
    }
    

    不能解决的问题

    带有“负权值回路”的图

    这种图可能没有最短路径

    知识回顾

  • 相关阅读:
    7zip在DOS命令行用法总结
    WinRAR在DOS下压缩/解压缩的使用方法
    Linux关闭防火墙命令
    将java的jar包,打包为rpm 安装包
    spring mvc 基于注解 配置默认 handlermapping
    Spring + Spring MVC + MyBatis 整合
    Android开发环境搭建全程演示(jdk+eclipse+android sdk)
    使用Spring MVC表单标签
    context:component scan配置策略
    Spring AutoWiring Beans with @Autowired annotation
  • 原文地址:https://www.cnblogs.com/jev-0987/p/13213497.html
Copyright © 2011-2022 走看看