对Floyd算法的理解

本文介绍了Floyd算法,一种基于动态规划的多源最短路径算法,适用于处理负权边的图。文章详细阐述了算法特点、基本策略,并提供了个人尝试的代码实现,包括递归求最短路径序列的方法。经过测试,代码能够正确输出最短路径及序列。

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

对Floyd算法的理解

Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

特点

1、Floyd是使用动态规划思想解决多源最短路径的经典算法(即图中任意两点的最短路径)。
2、可以处理负权边。
3、不能处理负权环。(Dijstra算法既不能处理负权边也不能处理负权环)
4、可以处理无向图和有向图

算法基本策略

从任意节点u到任意节点v的最短路径有2种:
1、是直接从u到v
2、是从u经过若干个节点k到v
所以,我们假设graph(u,v)为节点u到节点v的最短路径的距离(当然,不同的题目代表的不一样,比如有的可能是花费,需要灵活变通),对于每一个节点k(1~N个节点),我们检查graph(u,k) + graph(k,v) < graph(u,v)是否成立,如果成立,证明从u到k再到v的路径比u直接到v的路径短,我们便设置graph(u,v) = graph(u,k) + graph(k,v),当我们遍历完所有节点k,graph(u,v)中记录的便是u到v的最短路径的距离。

代码实现(个人尝试版)

主要使用两张表,路由表(数组)Node和距离表(数组)Path,使用上述算法策略对表内存储信息进行更新,得出最终任意两点的最短路径值与最短路径序列。
在这里插入图片描述
图1 算法测试Graph

public class Floyd {
   
    public void floyd(){
   
        int inf = Integer.MAX_VALUE;
        //定义起始Path数组
        int Path[][] = {
   
                {
   inf,5,inf,7},
                {
   inf,inf,4,2},
                {
   3,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值