弗洛伊德(Floyd)算法(多源最短路径)

基础算法_04_最短路径问题 目录 一. 单源最短路径问题(Dijkstra迪杰斯特拉算法) 二. 多源最短路径问题(Floyd弗洛伊德算法) 一. 单源最短路径问题(Dijkstra迪杰斯特拉算法) 1. 问题描述 如上有向图所示,求出到其它各个顶点的最短路径 2. Dijkstra算法 先将有向图用带权邻接矩阵表示: 算法过程状态图如下: 上述图中,表示当前求得的一条从出发的最短路径的终点,S表示已找到从出发... 阅读详情

弗洛伊德算法比较适合稠密图,形式上比较优雅,核心代码只有五行。

for (k = 1; k <= g.v; k++)
        for (i = 1; i <= g.v; i++)
            for(j = 1; j <= g.v; j++)
                if (g.matrix[i][j] > g.matrix[i][k] + g.matrix[k][j])
                    g.matrix[i][j] = g.matrix[i][k] + g.matrix[k][j];
             

这段代码的基本思想就是:最开始只允许1号顶点进行中转,接下来只允许1号和2号顶点进行中转......允许经过1~n号的所有顶点进行中转,求任意两点间的最短路程。用一句概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。

完整代码如下:

/************************************************************************
*
* 文件名:7.1.2.cpp
*
* 文件描述:弗洛伊德算法(多源最短路径)适合稠密图
*
* 创建人:  fdk

* 时  间:  2018-09-05
*
* 版本号:1.0
*
* 修改记录:
*
************************************************************************/

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<limits.h>
#define N 100
#define M 100
using namespace std;

/*定义矩阵结构*/
typedef struct node
{
    int matrix[N][M];    //定义邻接矩阵
    int v;               //结点数
    int e;               //边数
}MGraph;

/*弗洛伊德算法*/
void Floyd(MGraph g, int path[10][10])
{
    int i, j, k;
    cout << "-----更新前路径------" << endl;
    for (i = 1; i <= g.v; i++)
    {
        for (j = 1; j <= g.v; j++)
        {
            /*如果顶点i和顶点j之间不存在通路则输出无穷,否则输出最小值*/
            if (g.matrix[i][j] == 9999)
                cout << "∞" << " ";
            else
                cout << g.matrix[i][j] << " ";
        }
        cout << endl;
    }

    cout << "-----更新后path路径------" << endl;
    for (i = 1; i <= g.v; i++)
    {
        for (j = 1; j <= g.v; j++)
        {
            cout << path[i][j] << " ";
        }
        cout << endl;
    }

    /*弗洛伊德核心代码5行*/

    //从i号顶点到j号顶点,只经过前k号顶点的最短路程
    for (k = 1; k <= g.v; k++)
        for (i = 1; i <= g.v; i++)
            for(j = 1; j <= g.v; j++)
                if (g.matrix[i][j] > g.matrix[i][k] + g.matrix[k][j])
                {
                    /*如果存在顶点k使得i到j的距离变短,则更新距离*/
                    g.matrix[i][j] = g.matrix[i][k] + g.matrix[k][j];
                    path[i][j] = path[i][k];  //更新路径,为了顺序输出
                }
    cout << "-----更新后路径------" << endl;
    for (i = 1; i <= g.v; i++)
    {
        for (j = 1; j <= g.v; j++)
        {
            if (g.matrix[i][j] == 9999)
                cout << "∞" << " ";
            else
                cout << g.matrix[i][j] << " ";
        }
        cout << endl;
    }

    /*打印更新后的path*/
    cout << "-----更新后path路径------" << endl;
    for (i = 1; i <= g.v; i++)
    {
        for (j = 1; j <= g.v; j++)
        {
            cout << path[i][j] << " ";
        }
        cout << endl;
    }
    /*打印路径*/
    for (i = 1; i <= g.v; i++)
    {
        for (j = 1; j <= g.v; j++)
        {
            if (g.matrix[i][j] == 9999)
            {
                cout << "从点" << i << "到点" << j << "不存在通路" << endl;
            }
            else
            {
                cout << "从点" << i << "到点" << j << "的最短路径为" << g.matrix[i][j];
                cout << " 经过的点为: " << i << " ";

                /*顺序输出路径上的顶点*/
                k = path[i][j];
                while (k != j)
                {
                    cout << k << " ";
                    k = path[k][j];
                }
                cout << j;
            }
            cout << endl;
        }
    }
}


int main()
{
    int v, e;  //v为顶点e为边
    cin >> v >> e;

    int i, j;

    int s, t, w;  //从顶点s到顶点t权值为w

    int path[10][10];
    MGraph g;
    g.e = e;
    g.v = v;
    /*初始化*/
    for (i = 1; i <= v; i++)
    {
        for (j = 1; j <= v; j++)
        {
            if (i == j)
                g.matrix[i][j] = 0;
            else
                g.matrix[i][j] = 9999;
            path[i][j] = j;
        }
    }

    /*输入带权的路径*/
    for (i = 1; i <= e; i++)
    {
        cin >> s >> t >> w;
        g.matrix[s][t] = w;
    }

    Floyd(g, path);
    return 0;
}


 

从弗洛伊德算法到路径平滑:在游戏寻路中实现高效与自然的移动 本文探讨了弗洛伊德算法与路径平滑技术在游戏寻路中的应用,旨在解决路径计算的高效性与移动自然度的双重挑战。通过改良Floyd算法并结合路径平滑技术,实现了从数学最优到视觉自然的转变,适用于RPG、RTS等游戏类型,显著提升NPC和玩家单位的移动体验。 阅读详情

相关推荐

3D slicer查看形变场

3Dslice显示数据和形变场 将需要可视化的数据也导入3Dslice,注意描述为volume(图1a),如果没有显示是因为路径中不能有中文,也就是moving图像。 (b) 图1、数据导入形变场和 将相应的形变场数据直接拖入3Dslice,并修改描述为形变场(图1b)。 点击transform菜单图2(a),然后勾选形变场可视化图2(b)。 (b) 图2...

fanre的专栏 1947

图论模型——图论最短路径求解:弗洛伊德算法

算法(英语:或简写为Floyd algorithm),中文亦称弗洛伊德算法,是解决任意两点间的最短路径的一种算法,可以正确处理无向图或有向图(可以有负权重,但不可存在负权回路)的最短路径问题。Floyd算法与迪杰斯特拉算法或贝尔曼福特算法相比,能够一次性的求出任意两点之间的最短路径,后两种算法运行一次只能计算出给定的起点和终点之间的最短路径。当然,Floyd算法计算的时间也要高于后两种算法,其算法核心的步骤由三层循环构成2.最短路径应满足的结论从上图中不难得到以下两个结论:1。

W2663772417的博客 1250

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1044

C/C++ 最短路径-Floyd算法 (路径的保存和输出)

一、最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题。 确定终点的最短路径问题 - 与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。 确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。 全局最短路径问题 - 求图中所有的最

Carizy的博客 1万+

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统

本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。

weixin_29161785的博客 299

STM32低功耗模式下ADC采样抖动的5个隐藏陷阱及解决方案(实测避坑)

本文深入探讨了STM32低功耗模式下ADC采样抖动的5个常见陷阱及解决方案,包括多通道采样电压跃迁、外设开关信号稳定、低功耗模式与ADC时钟同步、输入阻抗失配以及基准电压稳定性问题。通过实测数据和优化代码示例,帮助工程师有效规避ADC采样数据抖动问题,提升物联网设备的测量精度和稳定性。

weixin_30316097的博客 381

Floyd算法使用递归输出path路径

使用递归的方式输出Floyd算法的path

weixin_45828673的博客 1008

HBF凭什么能挑战HBM?

最近AI圈聊得最多的,除了大模型迭代,就是“算力瓶颈”。大家都知道GPU不够用、HBM抢疯了,但很少有人注意到,存储层正在酝酿一场革命——高带宽闪存(HBF)。今天就结合HBM之父Joungho Kim教授的最新观点,跟大家好好盘盘这门技术:它不是HBM的替代品,却可能重塑AI推理的游戏规则,甚至在2038年超越HBM市场规模。先澄清一个核心认知:HBF不是凭空冒出来的新技术,而是站在HBM肩膀上的“优化款”。

存储随笔 2129

佛洛伊德最短路径算法 讲解 以及 C++实现

假设图G中顶点个数为N,则需要对矩阵D和矩阵P进行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]”,更新b[i][j]=b[i][0]。同理,第k次更新时,如果”a[i][j]的距离” > “a[i][k-1]+a[k-1][j]”,则更新a[i][j]为”a[i][k-1]+a[k-1][j]”,b[i][j]=b[i][k-1]。

m0_73802120的博客 1812

昇腾310B实战:FFmpeg硬件加速全流程解析与性能优化

本文详细解析了昇腾310B与FFmpeg硬件加速的全流程,包括环境配置、性能优化及常见问题排查。通过实战案例展示,昇腾310B在视频转码中性能提升可达6倍,同时降低功耗,特别适合多媒体处理和高性能计算场景。

m3n5b7v8c9x的博客 732

小白 虚拟机 kali_Linux安装 详细教程

安装版本:VMmare workstation pro kali_Linux 安装环境:Window10 首先我们先了解一下什么是kali_linux: Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统。每一季度更新一次。由Offensive Security Ltd维护和资助。最先由Offensive Security的Mati Aharoni和Devon Kearns通过重写BackTrack来完成,BackTrack是他们之前写的用于取证的Linux发行

m0_50917178的博客 9万+

8、每对顶点之间的最短路径,弗洛伊德(Floyd)算法

顶点对之间的最短路径是指:对于给定的有向网G=(V,E),要对G中任意一对顶点有序对V、W(V≠W),找出V到W的最短距离和W到V的最短距离。 解决此问题的一个有效方法是:轮流以每一个顶点为源点,重复执行迪杰斯特拉算法n次,即可求得每一对顶点之间的最短路径,总的时间复杂度为O(n3)。 弗洛伊德(Floyd)提出了另外一个求图中任意两顶点之间最短路径的算法,虽然其时间复杂度也是O(n...

hopegrace的博客 2432

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 266

floyd算法 弗洛伊德算法 多源最短路径算法

写在前边的话:写作不易,有帮助到你的话麻烦点赞加收藏呦。感激不尽!如有错误也请留言指正 一、弗洛伊德算法 注:表格中值得下标代表最短的路径 在弗洛伊德算法中,需要通过迭代填写矩阵的思路计算最短路径。在填写过程中有一些规律,以D0到D1为例。 D0到D1 在D1中填写的时候,不加证明的给出以下规律。 如果红色区域有无穷,那么无穷所对应的列和行都填入原来的值(黄色区域)。 剩余的空白格,以(V2,V3)这个格为例,如果红色与浅绿色的交点处的值相加比草绿色处的值小,就将.....

Anthony_4926 5061

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

多源最短路径算法 -- 弗洛伊德(Floyd)算法

总的来说,Floyd算法是一种计算图中所有顶点对之间最短路径的动态规划算法,它能够处理包含负权边的图,但不允许存在负权回路。适用于小型到中等规模稠密图的算法,尤其是在需要全局最短路径信息时。对于大型稀疏图或者单源最短路径问题,其他算法如Dijkstra算法可能更加合适。

xiaoyu❅的博客 5668

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

总结:Floyd弗洛伊德算法(多源最短路径)

求任意两个点之间的最短路径。这个问题这也被称为“多源最短路径”问题。 用一个二维数组存储图的信息。 e[i][j]就是i到j的路径长。 初始化: 自身到自身就是0,无法到达就是正无穷。 我们发现, 每个顶点 ,都有可能使得另外两个顶点之间的路程 变短。 。 。 假如现在只允许经过1号顶点,求任意两点之间的最短路程,应该如何求呢? 只需判断e[i][1]+e[1][j]是否比e[i][j]要小即...

006 菜是原罪 的博客 748

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JAVA弗洛伊德算法_短小精悍的多源最短路径算法—Floyd算法

前言本文同步于公众号[bigsai],专注于数据结构与算法、java、python在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径。在单源正权值最短路径,我们会用Dijkstra算法来求最短路径,并且算法的思想很简单——贪心算法:每次确定最短路径的一个点然后维护(更新)这个点周围点的距离加入预选队列,等...

weixin_42394100的博客 244

多源最短路径算法-Floyd算法(弗洛伊德算法)

概念 Floyd算法又称为插点法,是一种利用动态规划的思想(将原问题分解成相对简单的子问题,通过求解子问题的最优解,来得到原问题的最优解。)寻找给定的加权图中多源点之间最短路径的算法,主要思想是: 1.从第1个点到第n个点依次加入图中,每个点加入后进行试探是否有路径长度被更改。具体方法为遍历图中每一个点(i,j双重循环),判断每一个点对距离是否因为加入的点而发生最小距离变化。如果发生改变,更新两点(i,j)的距离。 2.重复上述直到最后插点试探完成。 其中更新距离的状态转移方程为: dp[i][j

2301_77109445的博客 895

图详解第六篇:多源最短路径--弗洛伊德(Floyd-Warshall)算法(完结篇)

多源最短路径--Floyd-Warshall算法

m0_70980326的博客 1万+

最短路径(Floyd算法,弗洛伊德算法,多源最短路径)

算法思想:一开始各顶点之间的最短路径,就是邻接矩阵值,每一次加入一个顶点,然后判断该顶点加入后,其余起点通过该顶点到达其余顶点能否得到比之前更短的最短路径,如果找到了就进行最短路径和权值和的更新 算法伪代码 代码实现和相关代码注释 #include<iostream> using namespace std; #define Max 10//最大顶点数 #define MANY 65535 class Graph { private: int verNum;//顶点个数 int ar

m0_53157173的博客 613

图论之最短路径 弗洛伊德算法(Floyd)多源最短

图论之最短路径 弗洛伊德算法(Floyd)多源最短 一: 该算法解决的问题是对于一个图,对该图的没一对顶点vi != vj,要求求出vi与vj之间的最短路径和最短路径长度。   二:算法思想 正如我们所知道的,Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展,三个for循环就可以解决问题,所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下

No_Retreats的专栏 1490

2024-01-04 Floyd算法 动态规划思想解读 弗洛伊德算法 多源最短路径

最短的Floyd算法只用五(六)行,就可以实现多源最短路长度和路径的求解。这个算法真的有看上去这么简单吗?其中蕴含了怎样的精妙的算法思想?本文旨在从两个对Floyd算法最重要的角度解读它————和。

weixin_46545421的博客 625

从零开始学数据结构系列之第四章《弗洛伊德(floyd)算法简介》

弗洛伊德算法选取某个节点k作为i到j需要经过的中间节点,通过比较d(i,k)+d(k,j)和现有d(i,j)的大小,将较小值更新为路径长度,对k节点的选取进行遍历,以得到在经过所有节点时i到j的最短路径长度,通过不断加入中间点的方式更新最短路径。​   弗洛伊德算法作为求最短路径的经典算法,其算法实现相比迪杰斯特拉等算法是非常优雅的,可读性和理解都非常好。​本质上来讲就是求每一对顶点之间的最短距离。

铁匠匠匠的博客 1333

【图论】FLOYD弗洛伊德算法-最短路径

弗洛伊德算法用于求多源最短路径,也就是求两个点的最短路径,其思想是基于动态规划。

m0_62335629的博客 836

(图)最短路径之弗洛伊德算法

弗洛伊德Floyd算法:其本质是动态规划算法,也是经典的多源最短路径算法之所以称为经典便是因为该算法非常简短:该算法的时间复杂度:O(n的三次方)这个算法短的离谱,以致于我们通常直接将它背了下来当模板使用,而不像学dijkstra那时候一步步理解它是如何贪心的.那么,为什么floyd算法是这个样子的呢?或者说,为什么这样就能求出所有点到所有点的最短路径?它的递推公式是:D[v][w]=min{D[...

大芝士球的博客 839
上一篇: 单源最短路径-迪杰斯塔拉(Dijkstra)算法的实现
下一篇: 最小生成树之Prim算法-使用邻接矩阵实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值