当前位置: 首页 > news >正文

算法-数据结构(图)-弗洛伊德算法复现(Floyd)

弗洛伊德算法(Floyd-Warshall算法)是一种用于求解所有节点对最短路径的动态规划算法,适用于有向图或无向图,且能处理带有负权边的图(但不能有负权环)。该算法的时间复杂度为 O(V3)O(V3),其中 VV 是图的节点数。


核心思想

弗洛伊德算法通过逐步优化路径来求解最短路径。其核心思想是:

  1. 对于任意两个节点 ii 和 jj,检查是否存在一个中间节点 kk,使得从 ii 到 jj 的路径可以通过 kk 变得更短。

  2. 通过动态规划逐步更新最短路径。


算法步骤

  1. 初始化

    • 创建一个距离矩阵 DD,其中 D[i][j]D[i][j] 表示节点 ii 到节点 jj 的最短路径长度。

    • 如果 ii 和 jj 之间有直接边,则 D[i][j]D[i][j] 为边的权重;否则为无穷大(∞∞)。

    • 对角线上的值 D[i][i]D[i][i] 初始化为 0(节点到自身的距离为 0)。

  2. 动态规划更新

    • 对于每一个中间节点 kk(从 1 到 VV),更新所有节点对 ii 和 jj 的最短路径:

      D[i][j]=min⁡(D[i][j],D[i][k]+D[k][j])D[i][j]=min(D[i][j],D[i][k]+D[k][j])
    • 即,检查是否通过节点 kk 可以使 ii 到 jj 的路径更短。

  3. 结束

    • 当所有中间节点 kk 都被遍历后,矩阵 DD 中的值即为所有节点对的最短路径。

手动推导:

算法如下:



public class Foloyd {
    //弗洛伊德最短路径算法复现
    public static void Floyd(int [] [] dist, int [][] path)
    {
        int L=dist.length;
        for(int k=0;k<L;k++)
        {
            for(int i=0;i<L;i++)
            {
                for(int j=0;j<L;j++)
                {
                    if(dist[i][k]!=Integer.MAX_VALUE&&dist[k][j]!=Integer.MAX_VALUE)
                    {
                        //判断是否通过中转路径能更短
                        if(dist[i][k]+dist[k][j]<dist[i][j])
                        {
                            //更新距离
                            dist[i][j]=dist[i][k]+dist[k][j];
                            //中转点
                            path[i][j]=k;
                        }
                    }
                }
            }
        }
        System.out.println("最短路径值为:");
        for(int i=0;i<L;i++)
        {
            for(int j=0;j<L;j++)
            {
                System.out.print(dist[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
        System.out.println("最短路径为:");
        for(int i=0;i<L;i++)
        {
            for(int j=0;j<L;j++)
            {
                System.out.print(path[i][j]);
                System.out.print(" ");
            }
            System.out.println();
        }
    }

    public static void main(String[] args) {
        int[][] vG= {{0,6,13}, {10,0,4}, {5,Integer.MAX_VALUE,0}};
        int[][] path={{-1,-1,-1},{-1,-1,-1},{-1,-1,-1}};
        Floyd(vG,path);

    }
}

结果如下:

最短路径值为:
0 6 10 
9 0 4 
5 11 0 
最短路径为:
-1 -1 1 
2 -1 -1 
-1 0 -1 

相关文章:

  • 袋鼠数据库工具 6.4 AI 版已上线
  • [AI机器人] Web-AI-Robot机器人前瞻版--比奇堡海之霸凯伦
  • Acwing 哞叫时间II
  • 时间复杂度练习题(6道题,C语言)
  • 性能调优篇——索引优化与执行计划解析
  • 虚拟机及网络配置
  • Xshell客户端免费版无需注册Linux连接客户端8.0详细安装教程(2025年最全最详细的图文教程)附安装包
  • 2.6作业
  • 分享一套适合做课设的SpringBoot商城系统
  • 如何使用大模型、知识库和AI工作流创建AI应用(扣子平台)
  • 理解文件系统
  • TCP如何保证可靠性
  • 【WPF】绑定报错:双向绑定需要 Path 或 XPath
  • vscode 安装 sqltools
  • 解决局域网访问Dify却仅显示nginx页面的问题
  • Mysql的索引失效
  • 基于JAVA+Spring+mysql_快递管理系统源码+设计文档
  • 网络流算法: Dinic算法
  • 【3天快速入门WPF】12-MVVM
  • BDF报告翻译简介后:关于A φ方法criterion引理1如何由范数导出内积
  • vps云主机可以做网站/推广专家
  • a做片手机免费网站有哪些/外贸网站设计
  • 网页文件模板下载/seo是怎么优化推广的
  • wordpress短链接清除/常用的seo查询工具有哪些
  • 近的网站在线客服系统/seo优化网
  • 17做网店网站/青岛关键词网站排名