Floyd(弗洛伊德)算法 详解+模板

大话数据结构-迪杰斯特拉算法(Dijkstra)和弗洛伊德算法(Floyd) 最短路径,迪杰斯特拉算法(Dijkstra)、弗洛伊德算法(Floyd)基本原理及邻接矩阵的代码实现。 阅读详情
AI摘要

本文介绍了弗洛伊德算法的基本原理及应用,这是一种用于计算加权图中顶点间最短路径的有效算法。文中详细解释了算法的核心思想,并通过图例展示了具体的计算过程。此外,还提供了算法的伪代码及C语言实现示例。

弗洛伊德算法介绍

和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。

基本思想

 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

 假设图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次之后,操作完成!

 单纯的看上面的理论可能比较难以理解,下面通过实例来对该算法进行说明。

弗洛伊德算法图解

这里写图片描述
以上图G4为例,来对弗洛伊德进行算法演示。
这里写图片描述
初始状态:S是记录各个顶点间最短路径的矩阵。
第1步:初始化S。
矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值;如果i和j不相邻,则a[i][j]=∞。实际上,就是将图的原始矩阵复制到S中。
注:a[i][j]表示矩阵S中顶点i(第i个顶点)到顶点j(第j个顶点)的距离。
第2步:以顶点A(第1个顶点)为中介点,若a[i][j] > a[i][0]+a[0][j],则设置a[i][j]=a[i][0]+a[0][j]。
以顶点a[1]6,上一步操作之后,a[1][6]=∞;而将A作为中介点时,(B,A)=12,(A,G)=14,因此B和G之间的距离可以更新为26。
同理,依次将顶点B,C,D,E,F,G作为中介点,并更新a[i][j]的大小。

弗洛伊德算法的代码说明

以"邻接矩阵"为例对弗洛伊德算法进行说明,对于"邻接表"实现的图在后面会给出相应的源码。

1. 基本定义

// 邻接矩阵
typedef struct _graph
{
    char vexs[MAX];       // 顶点集合
    int vexnum;           // 顶点数
    int edgnum;           // 边数
    int matrix[MAX][MAX]; // 邻接矩阵
}Graph, *PGraph

Graph是邻接矩阵对应的结构体。
vexs用于保存顶点,vexnum是顶点数,edgnum是边数;matrix则是用于保存矩阵信息的二维数组。例如,matrix[i][j]=1,则表示"顶点i(即vexs[i])"和"顶点j(即vexs[j])"是邻接点;matrix[i][j]=0,则表示它们不是邻接点。

2. 弗洛伊德算法

模板1
/*

  • floyd最短路径。
  • 即,统计图中各个顶点间的最短路径。
  • 参数说明:
  •    G -- 图
    
  • path -- 路径。path[i][j]=k表示,"顶点i"到"顶点j"的最短路径会经过顶点k。
    
  • dist -- 长度数组。即,dist[i][j]=sum表示,"顶点i"到"顶点j"的最短路径的长度是svoid floyd(Graph G, int path[][MAX], int dist[][MAX])
    

{
int i,j,k;
int tmp;
// 初始化
for (i = 0; i < G.vexnum; i++)
{
for (j = 0; j < G.vexnum; j++)
{
dist[i][j] = G.matrix[i][j]; // “顶点i"到"顶点j"的路径长度为"i到j的权值”。
path[i][j] = j; // "顶点i"到"顶点j"的最短路径是经过顶点j。
}
}

// 计算最短路径
for (k = 0; k < G.vexnum; k++)
{
    for (i = 0; i < G.vexnum; i++)
    {
        for (j = 0; j < G.vexnum; j++)
        {
            // 如果经过下标为k顶点路径比原两点间路径更短,则更新dist[i][j]和path[i][j]
            tmp = (dist[i][k]==INF || dist[k][j]==INF) ? INF : (dist[i][k] + dist[k][j]);
            if (dist[i][j] > tmp)
            {
                // "i到j最短路径"对应的值设,为更小的一个(即经过k)
                dist[i][j] = tmp;
                // "i到j最短路径"对应的路径,经过k
                path[i][j] = path[i][k];
            }
        }
    }
}

// 打印floyd最短路径的结果
printf("floyd: \n");
for (i = 0; i < G.vexnum; i++)
{
    for (j = 0; j < G.vexnum; j++)
        printf("%2d  ", dist[i][j]);
    printf("\n");
}

}自:http://www.cnblogs.com/skywang12345/

模板2:

#include <stdio.h>
#define inf 0x3f3f3f3f
int map[1000][1000];
int main()
{
    int k,i,j,n,m;
    //读入n和m,n表示顶点个数,m表示边的条数
    scanf("%d %d",&n,&m);

    //初始化
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            if(i==j)
                map[i][j]=0;
            else
                map[i][j]=inf;
    int a,b,c;
    //读入边
    for(i=1; i<=m; i++)
    {
        scanf("%d %d %d",&a,&b,&c);
        map[a][b]=c;//这是一个有向图
    }

    //Floyd-Warshall算法核心语句
    for(k=1; k<=n; k++)
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                if(map[i][j]>map[i][k]+map[k][j] )
                    map[i][j]=map[i][k]+map[k][j];

    //输出最终的结果,最终二维数组中存的即使两点之间的最短距离
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            printf("%10d",map[i][j]);
        }
        printf("\n");
    }
    return 0;
}
弗洛伊德(Floyd)算法详解 阅读详情

相关推荐

【学习笔记】数据结构--最短路径问题(弗洛伊德和迪迦特斯拉)

前向星 void add_edge(int u, int v, int w) { //加边,u起点,v终点,w边权 edge[cnt].to = v; //终点 edge[cnt].w = w; //权值 edge[cnt].next = head[u];//以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号 head[u] = cnt++;//更新以u为起点上一条边的编号 } 弗洛伊德(floyd) void Floyd(MGraph *mGraph, int **iArrPath

hcCuriosity的博客 369

图解最短路径之弗洛伊德算法(Java实现)

概述 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法是一种在具有正或负边缘权重(但没有负环)的加权图中找到最短路径的算法,即支持负权值但不支持负权环。弗洛伊德算法采用的是动态规划思想,其状态转移方程如下: 其中matrix[i,j]表示i到j的最短距离,k是穷举i到j之间可能经过的中间点,当中间点为k时,......

编码强迫症患者 2万+

Floyd (弗洛伊德)算法简述

Floyd在1962年由Robert Floyd以其当前公认的形式出版。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。Floyd 算法是解决图论问题的比较经典的算法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图的最短路径问题。

慕羽★的博客 2万+

【算法】最短路径——弗洛伊德 (Floyd) 算法

本文介绍了弗洛伊德 (Floyd) 算法的相关知识。

代码星辰的博客 1万+

Matlab中eig内置函数转为C语言

本文记录一下如何将MATLAB中的eig函数转为C语言,即通过C语言求解矩阵的特征值与特征向量。[V,D]=eig(Rx)中V为矩阵Rx的特征向量,D为矩阵的特征值。其中Rx维度为12*12的复矩阵。 首先在MATLAB端创建入口函数保存为eigvalue.m: 打开MATLAB Coder,添加入口函数: 3.在定义输入类型窗口中,需要添加输入数据来训练...

u011441044的博客 3515

[uboot] (第一章)uboot流程——概述

[uboot] uboot流程系列: [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。==============================================

ooonebook的博客 1万+

【图论】弗洛伊德Floyd算法模板及实战(LeetCode743)

给出Java版本的Floyd多源最短路径算法模板,并在LeetCode中实战。

鹏啊鹏 1133

脑电分析中的频谱特征提取 —— 从理论到实践

本文系统介绍了脑电信号(EEG)频谱特征提取方法及其应用。EEG信号通过频谱分析可分为Delta、Theta、Alpha、Beta和Gamma等具有明确生理意义的频段。文章详细讲解了功率谱密度、频带功率、相对功率、频谱熵等关键特征的计算方法,并提供了Python实现示例,包括模拟数据和真实CHB-MIT癫痫数据集的处理流程。这些频谱特征在脑机接口、情绪识别、疲劳监测和癫痫检测等领域具有重要应用价值。文章强调频谱特征结合时域和非线性特征可提升分析效果,为EEG研究提供了实用指导。

qq_32516809的博客 1441

ACM模板 - Floyd(弗洛伊德算法)

一、理论: 如何求任意两点之间最短路径呢?通过之前的学习我们知道通过深度或广度优先搜索可以求出两点之间的最短路径。所以进行n2遍深度或广度优先搜索,即对每两个点都进行一次深度或广度优先搜索,便可以求得任意两点之间的最短路径。可是还有没有别的方法呢? 我们来想一想,根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即......

1135

STM32实战:5分钟搞定CanFestival协议栈下的CANopen心跳报文配置(附避坑指南)

本文详细介绍了如何在STM32平台上使用CanFestival协议栈快速配置CANopen心跳报文,包括硬件准备、协议栈移植、心跳报文配置及常见问题解决方案。通过实战步骤和避坑指南,帮助开发者高效实现节点状态监控,提升工业控制系统的可靠性。

win55的博客 744

Perplexity AI 高效使用培训手册

Perplexity AI 是一款革命性的 AI 搜索引擎,提供免费版和专业版两种选择。免费版支持基础搜索、每日3次Pro搜索、3个文件上传和初步深度研究功能;Pro版则解锁无限次Pro搜索、无限制文件上传、AI图像生成等高级功能,适合专业用户深度研究。该工具能整合网络信息、分析本地文档、生成创意内容,并提供知识库管理功能,显著提升信息检索和内容创作效率。用户可根据需求选择合适版本,免费版已能满足日常使用,而Pro版则更适合专业场景。

conquer_qgw的博客 1205

最短路——弗洛伊德算法(floyd)

模板: #include <bits/stdc++.h> using namespace std; int mp[20][20]; int n,m,x,z,y; const int inf = 1<<20; int main() { cin>>n>>m; for(int i=1;i<=n;i++) ...

weixin_34380948的博客 258

【笔记整理】轻量级神经网络 MobileNetV3

【笔记整理】轻量级神经网络 MobileNetV3

qq_33934427的博客 4273

最短路问题模板——迪杰斯特拉算法(Dijstra)、Bellman-Ford算法、弗洛伊德算法(Floyd-Warshall)、SPFA算法

Dijstra算法: //POJ 2378 #include &amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;gt; using namespace std; #define MAXN 1005 const int INF = (1 &amp;amp;amp;amp;lt;&amp;amp;amp;amp;lt; 30); int t,V,d[MAXN],costs[MAXN][MAXN]; bool used[MAXN]

qq_36501006的博客 1474

5分钟搞定Conflux钱包注册:Fluent钱包从安装到转账全流程指南

本文提供Conflux公链上Fluent钱包的完整注册和使用指南,涵盖从安装、助记词备份到CFX转账的全流程。特别强调安全操作要点,包括助记词保管和网络选择,帮助用户5分钟内快速掌握这款国产公链钱包的核心功能,确保数字资产安全。

weixin_29181861的博客 244

华为OD机试 - 名字的漂亮度(Java 牛客练习题)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。给出多个字符串,计算每个字符串最大可能的“漂亮度”。第一行一个整数N,接下来N行每行一个字符串。数据范围:输入的名字长度满足。每个字符串可能的最大漂亮程度。

学Java,找哪吒 1785

Dijkstra, SPFA, Floyd 三种最短路及优化【模板】

求最短路的基本算法有三种 Dijkstra算法,Floyd算法, Spfa算法。 其中Djs和Spfa都是单源最短路算法一般用于求从单一源点出发到其他点的最短距离,Floyd是多源最短路算法,可以求出任意两点的最短距离。 其次这三种算法的基本原理都是通过中转点达到缩短两点距离的目的。例如:1->2 距离为5、1->3距离为1、3->2距离为2.那么1->2的最短距离就可以通过中转点3来缩短,1->3->2 距离为3,比直接1->2的5要小。 Dijkstra算法(堆

梅子酒的博客 419

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

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

Floyd算法模板--详解

对于无权的图来说: 若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。 由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,我们把路径长度最短(即经过的边数最少)的那条路径叫做最短路径,其路径长度叫做最短路径长度或最短距离。 对于带权的图来说: 考虑路径上各边...

weixin_30312563的博客 174

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

挑战程序设计竞赛最短路习题及详解(C++实现)

最短路径Aizu - 0189 Convenient LocationPOJ - 2139 Six Degrees of Cowvin BaconPOJ - 3259 WormholesPOJ - 3268 Silver Cow PartyAizu - 2249 Road Construction总结 Aizu - 0189 Convenient Location 弗洛伊德模板题 #include<iostream> #include<algorithm> using namespa

qq_45929428的博客 563

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

图的基本操作(遍历,寻找最短路径,最小生成树)

#include #include #include #include #include #include #include using namespace std; int INF=9999999; template class MGraph { public: MGraph(int mSize); ~MGraph(); bool Insert(int u,int

MrLeaper 的博客 650

图论-最短路Floyd算法

Floyd算法是一种基于动态规划的全源最短路算法。它通过三重循环逐步更新节点间的最短路径:外层循环引入中间节点k,内层双重循环遍历所有节点对(i,j),比较直接路径和经过k点的间接路径。

2402_88147924的博客 608

求解有向网任意两点之间的最短路径——弗洛伊德(Floyd)算法Java代码

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

m0_46519466的博客 309

最短路 dijkstra , floyd 和spfa算法 模板

最短路算法还有spfa算法,但是对于比赛的一些数据来说,单纯的求最短路还是用D算法更快更稳定,但是对于有负权值的边来说,就必须用到spfa算法了,所以放在下次说。 floyd 5 行算法,求各个点之间的最短路,相当于遍历每个边,做传递,a-c,c-b,那么a就可以通过c到b。时间复杂度O(n^3) ps:一般就这种用邻接矩阵存好点 模板代码: void read(){ memset(g...

A_Pathfinder的博客 466

【HDU 1599】 Find the mincost route

【题目链接】          点击打开链接【算法】         弗洛伊德求最小环模板         我们知道,在一个环上,一定有一个有且仅有一个编号最大的点,设这个点为k,起点为i,终点为j,那么         mincost = dist[i][j] + cost[j][k] + cost[k][i] (dist[i][j]为i到j的最短路)         所以只需枚举i,j,k,在...

even_bao的博客 347

HDU - 1874 畅通工程续 (最短路)

                                         畅通工程续 Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距...

K.X的博客 217
上一篇: Dijkstra(迪杰斯特拉) 最短路+模板
下一篇: Poj 2139 Six Degrees of Cowvin Bacon (floyd最短路)
Puppet__
博客等级 码龄9年 319粉丝 328原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值