多源最短路简介

多源最短路算法用于解决图中任意两节点间最短路径的问题,广泛应用于交通网络、社交关系分析、路由优化等场景。与单源最短路(如Dijkstra)不同,它一次性计算所有节点对的最短距离,适合需要全局路径规划的场景。

核心算法

Floyd算法:基于动态规划,通过三重循环松弛所有中间节点,时间复杂度为 O(V3)O(V^3)O(V3),适合稠密图或需要处理负权边的场景。其空间复杂度为 O(V2)O(V^2)O(V2),需存储所有节点对的距离矩阵。

Floyd算法:

Floyd算法本质是用动态规划,来求任意两个节点之间的最短路,也成为插点法。通过不断在两结点之间加入新的点,来更新最短路。且适用于任何图,不管有向无向,边权正负,但必须有最短路存在(也就是不存在负环)。
其实最本质上,就是分阶段,逐步更新出最终结果。
算法流程

  1. 状态表示:f[k][i][j] 表示,仅仅通过 [1,k] 这些点,计算出结点 i 走到结点 j 的最短路径长度
  2. 状态转移方程:不选新来的点:f[k][i][j] = f[k-1][i][j] 选择新来的点:f[k][i][j] = f[k-1][i][k] + f[k-1][k][j]
  3. 空间优化:只会用到上一层的状态,因此可以优化掉第一维。f[i][j]为初始状态下i到j的距离,如果没有边则为无穷
  4. 初始化:f[i][j] = 0
  5. 填表顺序:一定要先枚举 k 再枚举 i 和 j。因为外面填表的时候需要依赖 k-1 曾的状态,因此,必须先枚举 k。

代码实现

int main()
{cin >> n >> m;memset(f, 0x3f, sizeof f);for (int i = 1; i <= n; i++)f[i][i] = 0;for (int i = 1; i <= m; i++){int a, b, c; cin >> a >> b >> c;f[a][b] = f[b][a] = min(f[a][b], c);}//floydfor (int k = 1; k <= n; k++)//以那个点作为新的中间的桥梁节点(之前的点已经用过并保存在数组中,因此,k = n时使用的桥梁节点是前n个所有结点){for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){f[i][j] = min(f[i][j], f[i][k] + f[k][j]);}}}for (int i = 1; i <= n; i++){for(int j = 1; j <= n; j++)cout << f[i][j] << " ";cout << endl;}
}

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

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

相关文章

【攻防实战】记一次攻防实战全流程

那天我向众神祈祷&#xff0c;最后回答我的却只有挣扎十年依旧不甘的自己&#xff01;成功究竟是馈赠还是偿还。 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事&#xff0c;只有对原理了然于⼼&#xff0c;才能突破更多的限制。 拥有快速学习能力的安全研究员&…

Anaconda配置环境变量和镜像

Anaconda配置环境变量和镜像 下载失败就是开了梯子 Anaconda 作用&#xff1a;包管理&#xff08;集中&#xff0c;有序&#xff09;和环境管理&#xff08;版本切换&#xff09;使用conda命令对虚拟环境创建、删除自带python解释器pip&#xff08;python自带的包管理工具&…

给定单词倒排

实现代码&#xff1a;public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 输入的字符串String input scanner.nextLine();// 存储单词List<String> words new ArrayList<>();// 存储当前单词StringBuilder currentWord new S…

IO进程——进程引入、进程函数接口

一、引入1、进程&程序1.1 程序编译好的可执行的文件存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;程序是静态的&#xff0c;没有任何执行的概念1.2 进程一个独立的可调度的任务执行一个程序所分配的资源的总称进程是程序执行的一次过程进程是动态的&…

周末游戏推荐:安卓端俄罗斯方块,经典与创新的结合

前段时间&#xff0c;每到周末我都会给大家推荐一些离线的经典游戏&#xff0c;原本打算将这个传统一直延续下去。然而&#xff0c;我实在找不到足够好用且无广告的游戏了。有些游戏刚开始用的时候还不错&#xff0c;但用着用着就开始频繁弹出广告&#xff0c;这让我实在不敢向…

《用 Scikit-learn 构建 SVM 分类模型:从原理到实战的全流程解析》

《用 Scikit-learn 构建 SVM 分类模型:从原理到实战的全流程解析》 一、引言:为什么选择 SVM? 在机器学习的众多算法中,支持向量机(SVM)以其强大的分类能力和良好的泛化性能,在文本分类、人脸识别、医学诊断等领域广泛应用。尤其在中小规模数据集上,SVM 往往能提供比…

一文学会CMakeLists.txt: CMake现代C++跨平台工程化实战

你能学到什么&#xff1f;朋友们好久不见&#xff0c;我是alibli&#xff0c;好久没有更新博客了。今天本人将通过构造一个实际的虚拟小项目&#xff0c;来让你彻底掌握CMake跨平台工程构建&#xff0c;学会CMakeLists.txt语法。该项目实现了一个简单的平方、立方的计算程序&am…

高并发场景下限流算法实践与性能优化指南

高并发场景下限流算法实践与性能优化指南 在大规模并发访问环境中&#xff0c;合理的限流策略能保护后端服务稳定运行&#xff0c;避免系统因瞬时高并发导致资源耗尽或崩溃。本文将从原理出发&#xff0c;深入解析几种主流限流算法&#xff0c;并结合Java和Redis给出完整可运行…

Vue3应用执行流程详解

精确化的完整执行流程 (以 Vite Vue3 SPA 为例)整个过程可以分为两部分&#xff1a;首次访问的“冷启动”和后续的Vue应用接管。第一部分&#xff1a;首次访问与页面加载客户端&#xff1a;发送请求用户打开浏览器&#xff0c;输入 URL&#xff08;如 http://localhost:5173&a…

Redis 持久化与高可用实践(RDB / AOF / Sentinel / Cluster 全解析)

这篇是我把几套生产环境踩坑与复盘整理成的一份“从 0 到 1 长期可维护”的实践文。目标是&#xff1a;明确策略、给出默认可用的配置模板、把常见坑一次讲透。 适用场景&#xff1a;新项目选型、老项目稳定性加固、从单机迁移到 HA/Cluster、应对数据安全与故障切换要求。目录…

Linux内核的PER_CPU机制

参考书《Linux内核模块开发技术指南》 1.原理 在多核CPU的情况下&#xff0c;为了提高CPU并发执行的效率&#xff0c;对于某些不是必须要在核间进行同步访问的资源&#xff0c;可以为每一个CPU创建一个副本&#xff0c;让每个CPU都访问自身的数据副本&#xff0c;而不是通过加锁…

VSCode 的百度 AI编程插件

VSCode 的百度 AI编程插件主要是 Baidu Comate&#xff08;文心快码&#xff09;&#xff0c;这是一款基于文心大模型的新一代编码辅助工具&#xff0c;旨在提升开发者的编码效率&#xff0c;让写代码变得更简单。以下是关于 Baidu Comate 的详细介绍&#xff1a; 一、功能特点…

阿里云监控使用

阿里云的云监控服务&#xff08;CloudMonitor&#xff09;是一款简单易用、功能强大的监控工具&#xff0c;主要用来帮助用户实时监控阿里云上的各种资源&#xff08;比如服务器、数据库、网络等&#xff09;&#xff0c;并在出现问题时及时发出警报&#xff0c;确保业务稳定运…

嵌入式C语言-关键字typedef

定义和作用 typedef是C/C中的一个关键字&#xff0c;作用是为现有的数据类型&#xff08;int 、char 、flaot等&#xff09;创建新的别名&#xff0c;其目的是为了方便阅读和理解代码。 用法 typedef 原有类型名 新类型名;基本类型创建别名 typedef unsigned char uint8_t; typ…

【混合开发】【大前端++】Vue节点优化Dome之单节点轮播图片播放视频二

动图更精彩 背景 Vue作为大前端开发页面交互&#xff0c;在数字屏&#xff0c;智慧大屏等大屏幕开发过程中&#xff0c;轮播效果作为丰富的展示组件经常作为首选。但也因为这个组件的交互体验很好&#xff0c;于是各种单点组件增加到轮播效果里。经过业务的扩展&#xff0c;人…

前端开发核心技术与工具全解析:从构建工具到实时通信

觉得主包文章可以的,可以点个小爱心哟&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 主页:一位搞嵌入式的 genius-CSDN博客 系列文章专栏: https://blog.csdn.net/m0_73589512/category_13028539.html 前端开发核心技术与工具全解…

GPT 系列论文 gpt3-4 175B参数 + few-shot + 多模态输入 + RLHF + system

GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】 GPT-4论文精读 从1750亿参数的文本预言家&#xff0c;到多模态的通用天才&#xff0c;OpenAI用两次震撼世界的发布&#xff0c;重新定义了人工智能的可能性边界。这份笔记将带你深入GPT-3和GPT-4的核心突破&#…

.gitignore文件的作用及用法

目录 ​​.gitignore 文件的作用​​ ​​.gitignore 的基本语法​​ ​​Python 项目的 .gitignore 示例​​ ​​如何使用 .gitignore​​ ​​1. 创建 .gitignore 文件​​ ​​2. 编辑 .gitignore​​ ​​3. 检查 Git 状态​​ ​​常见问题​​ ​​Q1&#xff…

QEMU环境准备

QEMU环境准备 下载 qemu # qemu sudo apt install qemu-system-arm # gdb sudo apt install gdb-multiarchsudo apt-get update sudo apt-get install build-essential zlib1g-dev pkg-config libglib2.0-dev \libpixman-1-dev libfdt-dev ninja-build下载并自行编译 qemu(可…

003 cargo使用

cargo是什么 cargo 是 Rust 的构建系统和包管理器。Rust 开发者常用 cargo 来管理 Rust 工程和获取工程所依赖的库。 在上一篇文章中我们已经使用cargo new命令创建了一个名叫hello_rust的项目。也使用cargo run来运行项目。 cargo常用命令 cargo 除了创建工程以外还具备构建&a…