多源最短路Floyd算法

news/2024/12/16 13:57:25/文章来源:https://www.cnblogs.com/dianman/p/18609942

多源最短路算法-Floyd

使用Floyd(弗洛伊德)算法,可以以 \(O(n^3)\) 的时间复杂度求出一张多源图的任意两点间的最短路径

一般采用邻接矩阵的方法来存储图:

int g[N][N];
g[i][j]

其中,g[i][j]的意义为第i个节点到第j个节点的权重

我们需要对邻接矩阵进行路径初始化,将自身到自身的权重设置为 \(0\) ,到其他节点的距离初始化为 \(+\infty\)(或极大的一个值)

for (int i = 0; i <= N; i++)for (int j = 0; j <= N; j++)if (i == j) g[i][j] = 0;else g[i][j] = 1e9;

对有向图而言,我们通过三个参数进行边的读入:

cin >> u >> v >> w;
g[u][v] = min(g[u][v], w);//判断重边

如果是无向图,则只需要再次赋值反向边即可

g[u][v] = g[v][u] = min(g[u][v], w);

Floyd算法原理:

对任意两个节点a,b而言,如果存在有更短的路径连通它们两个,则必然存在另外一个节点c,使得:

g[a][b] < g[a][c] + g[c][a]

换言之,如果需要更新我们的最短路径,就需要额外的一个中转节点来加入我们的路径中

同样的,如果对经过三个节点的路径a,b,c,能更新一个更短的路径,就需要加入d节点

不难写出以下代码:其中,我们的 i 为新加入的节点

for (int j = 1; j <= N; j++)for (int k = 1; k <= N; k++)g[j][k] = min(g[j][k], g[j][i] + g[i][k]);

每次遍历两层所有节点,目的是更新每个节点间的最短路径,并判断能否通过新加入的 i 节点,得到一个更短路径

我们的 i节点可以取到所有的节点来作为路径中转
因为相对于任意两个节点,我们都能够使用其余的节点来构建出一条经过任意多的中转节点的最短路径

于是有最终的递推函数,求得最短路:

void floyd(void) {for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++)for (int k = 1; k <= N; k++)g[j][k] = min(g[j][k], g[j][i] + g[i][k]);
}

以洛谷B3647为例:

输出最终的邻接矩阵

#include <iostream>
#include <algorithm>
using namespace std;int n, m;
int g[105][105];void floyd(void) {for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)for (int k = 1; k <= n; k++)g[j][k] = min(g[j][k], g[j][i] + g[i][k]);
}int main()
{cin >> n >> m;int u, v, w;for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++)if (i != j) g[i][j] = 1e9;for (int i = 0; i < m; i++) {cin >> u >> v >> w;g[u][v] = g[v][u] = min(g[u][v], w);}floyd();for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++)cout << g[i][j] << ' ';cout << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853768.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款强大的开源物联网 Web 组态软件

前言 快速发展的物联网(IoT)领域,设备管理和监控的需求日益增长。为了满足这一需求并提供更高效的解决方案。 向大家推荐一款强大的开源物联网Web组态软件。这款软件不仅具备灵活的可视化配置功能,还提供了丰富的工具和接口,轻松实现设备集成、数据监控和远程管理。 项目介…

Win10 wsl 迁移到 D 盘

wsl 关闭wsl --shutdown查看系统wsl --list导出 tar 文件wsl --export Ubuntu-24.04 D:/export.tar删除C盘的虚拟机wsl --unregister Ubuntu-24.04导入新的虚拟机wsl --import Ubuntu-24.04 D:\wsl\ D:\export.tar --version 2查看状态直面挑战,躬身入局

PHP源码加密之php-beast

1、简介 php-beast可以对PHP源码文件进行加密,加密后的文件也可以正常的访问。2、安装php-beast# 下载php-beast wget https://github.com/liexusong/php-beast/archive/master.zip# 解压下载的文件 unzip master.zip# 进入解压后的目录 cd php-beast-master# ‌生成配置文件 …

ABB机器人3HAC17332-1电机维修攻略分享

ABB作为工业机器人制造商,其伺服电机是机器人执行精确动作的核心部件。伺服电机负责将电能转化为机械能,驱动机器人的关节和臂部运动。一旦伺服电机出现故障,将直接影响机器人的运行精度和稳定性。一、ABB机器人维修前准备在进行ABB机器人伺服电机维修之前,需要做好以下准备…

大话《权限设计》全篇,领略不同设计模式的魅力

说明该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。 友情提醒:本篇文章是属于系列文章,…

LLM应用实战-财经新闻自动聚合

开发了一款新闻资讯的自动聚合的工具,基于crawl4ai框架实现。1. 背景 这段时间项目比较忙,所以本qiang~有些耽误了学习,不过也算是百忙之中,抽取时间来支撑一个读者的需求,即爬取一些财经网站的新闻并自动聚合。 该读者看了之前的《AI资讯的自动聚合及报告生成》文章后,…

减少延迟时间的方法

减少延迟时间的方法 ‍ ​​ ‍一、回顾 重点:延迟时间就是磁头在某一磁道上开转的时间 盘片一直在旋转个不停 机械硬盘的数据读取以一个扇区为单位 物理上相邻的扇区并不能连续读数据,因为磁头读入一个扇区的数据后还需要一小段时间来处理,并不能紧接着读取相邻的扇区的数据…

Win电脑端有什么好用的备忘录便签推荐?

一、sticky notes 中文名叫便笺,就是Windows电脑系统自带的便笺,打开即可直接使用,无需安装。 它是一个一个彩色便利贴形式展现的,可以记录文字、添加图片,适合记录一些简单的信息。 不支持一直悬挂在电脑桌面上显示,也不支持设置提醒时间,想要同步到手机端使用,也有点…

设备的分配与回收

设备的分配与回收 ‍ ​​ ‍一、设备分配时的考虑因素 ​​ (一)设备的固有属性独占设备:一个时段只能分配给一个进程(如打印机) 共享设备:可同时分配给多个进程使用(如磁盘),各进程往往是宏观上同时共享使用设备,而微观上交替使用。 虚拟设备:采用 SPOOLing 技术将…

GitHub项目迁移到GitLab

GitHub项目迁移到GitLab 1.克隆GitHub项目到本地 [root@gitclient ~]# mkdir gitrepos [root@gitclient ~]# cd gitrepos [root@gitclient gitrepos]# git init . hint: Using master as the name for the initial branch. This default branch name hint: is subject to chang…

极狐GitLab 正式发布安全补丁版本 17.6.2、17.5.4、 17.4.6

本分分享极狐GitLab 补丁版本 17.6.2, 17.5.4, 17.4.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何措施。 参考资料GitLab 专业升级…

IO应用程序接口设备驱动程序接口

IO应用程序接口&设备驱动程序接口 ‍ ​​ ‍一、输入/输出应用程序接口 背景:在设备独立软件层向上提供各种各样的输入/输出应用程序接口的原因是: 用户层的应用程序无法用一个统一的系统调用接囗来完成所有类型设备的 I/O ​​ ‍ 三种输入/输出应用程序接口:字符设备…