弗洛伊德(Floyd)算法

弗洛伊德算法,又称Floyd-Warshall算法,是解决图中任意两点间最短路径的动态规划方法,能处理有向图及负权边的情况。算法流程包括初始化矩阵,然后通过N次更新找到最短路径。在Java中实现的时间复杂度为O(n^3)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


enter image description here

简介

罗伯特•弗洛伊德(Robert W.Floyd)计算机科学家,图灵奖得主,前后断言法的创始人,堆排序算法和Floyd-Warshall算法的创始人之一。第一次把“不确定性”概念引入程序,并且在分析理论、程序设计语言的逻辑与语义、自动程序验证、自动程序综合、算法分析以及编译器方面做出了巨大贡献,被授予第十三届图灵奖。

Floyd-Warshall算法,中文亦称弗洛伊德算法,是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。

算法流程

弗洛伊德算法的原理是动态规划。假设图G中顶点个数为N,则需要对矩阵S进行N次更新。

  • 初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。
  • 接下来开始,对矩阵S进行N次更新。第1次更新时,如果”a[i][j]的距离” > “a[i][0]+a[0][j]”(a[i][0]+a[0][j]表示”i与j之间经过第1个顶点的距离”),则更新a[i][j]为”a[i][0]+a[0][j]”。
  • 同理,第k次更新时,如果”a[i][j]的距离” > “a[i][k]+a[k][j]”,则更新a[i][j]为”a[i][k]+a[k][j]”。
  • 更新N次之后,操作完成!

算法实现(Java)

/**
 * @description 最短路径之弗洛伊德(Floyd)算法(即求网图G中各顶点i到其余顶点j的最短路径prev[i][j]及带权长度dist[i][j])
 *              输入 --> G:无向有权图                          
 *              输出 --> 最短距离数组及长度
 * @author      GongchuangSu
 * @since       2016.04.18
 * @version     v1.0
 */
public class Floyd {
   
   
    WeightedGraph G;
    int vlen;     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值