第二十章 多源最短路之Floyd算法的思路即实现(超强解析)

news2024/12/28 3:11:05

第二十章 多源最短路之Floyd算法的思路即实现

  • 一、什么是多源最短路
  • 二、Floyd算法
    • 1、算法思路
    • 2、算法模板
      • (1)问题:
      • (2)代码模板:
      • (3)代码分析:

一、什么是多源最短路

我们之前了解到的dijkstra算法、SPFA算法、Bellman-Ford算法都是从起点到各个点的最短路,都是从一个源点出发的。因此,这些称作单源最短路。那么当我们想知道图中的任意两点的最短路的时候,我们可以使用n次单源最短路算法,但是这样做的话,就显得过于繁琐僵硬。
因此,为了解决多源最短路问题,世界上就出现了一种新的算法:Floyd算法。

二、Floyd算法

1、算法思路

我们还是延续我们之前的传统,先分析问题,而不是直接给出算法的步骤。

我们的目的是求出任意两个点之间的最短路。

那么我们首先思考的问题应该是用什么存储呢?
一个点通往n个点的最短路,我们一共要求n个点的。我们直接创建一个dis[N][N]。那么这个数组的初始化应该是什么样的呢?
我们知道,一个点到自身的最短距离肯定是0,即我们dis数组的对角线方向。除此之外,我们并不知道其余点之间的距离。因此我们讲dis数组的剩余部分初始化为正无穷。如下图所示:
在这里插入图片描述
接着,我们以下面的图为例,想一想我们如何求任意两点之间的最短路:
在这里插入图片描述
我们知道,在这个图里任意两点之间的最短路的路径上必经过图中的点。

那么我们与其去向最短路经过哪些点,不如反过来,我们想一想这些点在哪些最短路上

那我们在顺着这个思路想一想,如果这个点在最短路上,那么这个点满足的条件是什么?根据我们前面推导单源最短路的文章中,我们了解到。我们的点如果在最短路上,那么我们用这个点去松弛最短路上的边的话,必定会松弛成功。

因此,我们要想知道一个点在哪些点的最短路上,我们只需要用这个点去松弛所有边

我们举个例子吧:

比如上图中的F点。我们很容易看出来,A点想到G的话,必须过F,我们用F去松弛的话,AF边必定是会松弛成功的。因为在初始化的时候,这两个点之间的距离是正无穷。但AF之间的边权是常数。F点也有可能在A到I上,也就是说A到I的最短路有可能经过AF。如果我们假设AI之间的最短路就是过F的那一条的话,那么AI也是要经过AF的。而我们在用F松弛的时候,也确实松弛了这条边。另外,我们的F还会松弛成功FG和FI,这两个短边也有可能是某几个点之间的最短路上所经过的边。

因此,我们要想要知道所有点的最短路:

我们只需要让n个点都去松弛一遍所有的边,松弛过后,就能够确定这n个点都分别在哪几个点的最短路上,于是我们就知道了图中任意两点之间的最短路。

而这就是Floyd算法的算法逻辑

2、算法模板

(1)问题:

在这里插入图片描述

(2)代码模板:

#include<iostream>
#include<cstring>
using namespace std;
const int N=210;
int dis[N][N];
int n,m,k;
void floyd()
{
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}
int main()
{
    cin>>n>>m>>k;
    memset(dis,0x3f,sizeof dis);
    for(int i=1;i<=n;i++)dis[i][i]=0;
    for(int i=0;i<m;i++)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(a!=b)
        dis[a][b]=min(dis[a][b],c);
    }
    floyd();
    for(int i=0;i<k;i++)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        if(dis[a][b]>0x3f3f3f3f/2)puts("impossible");
        else printf("%d\n",dis[a][b]);
    }
    return 0;
}

(3)代码分析:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

远程Jenkins新增Mac电脑节点,你知道怎么操作么?

目录&#xff1a;导读 一&#xff0c;前言 二&#xff0c;Mac电脑准备 1&#xff0c;网络环境 2&#xff0c;设置允许远程登录 三&#xff0c;Jenkins新增节点 1&#xff0c;新建节点 2&#xff0c;配置节点 3&#xff0c;节点启动代理 四&#xff0c;写在最后 一&…

算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200)

算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200&#xff09; 文章目录算法竞赛入门【码蹄集进阶塔335题】(MT2176-2200&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f;目录1. MT2176 围栏木桩2. MT2177 学习时间3. MT2178 最长子段…

【设计模式】观察者模式Observe(Java)

文章目录1. 观察者模式定义2. 类图3.Java实现3.1 定义主题Interface3.2 定义观察者Interface3.3 定义具体主题3.4 定义具体观察者3.5 定义测试主方法1. 观察者模式定义 观察者模式定义了对象之间的一对多依赖&#xff0c;这样以来&#xff0c;当一个对象改变状态时&#xff0c…

如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物等?

如何利用ArcGIS实现电子地图可视化表达&#xff1f;如何利用ArcGIS分析空间数据&#xff1f;如何利用ArcGIS提升SCI论文的层次&#xff1f;制图是地理数据展现的直观形式&#xff0c;也是地理数据应用的必要基础 本文从ArcGIS的基本操作、ArcGIS 的空间数据分析及ArcGIS 的高级…

使用MyBatis Generator自动创建代码

使用MyBatis Generator自动创建代码安装jdk下载jar 和配置xml文件自动生成代码报错分析与解决Table configuration with catalog null, schema null, and table public.user_t did not resolve to any tablesThe specified target project directory src does not exist安装jdk…

深入解决Linux内存管理之page fault处理

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 内核实现只是在进程的地址空间建立好了vma区域&#xff0c;并没有实际的虚拟地址到物理地址的映射操作。…

基于Pyqt5实现笔记本摄像头拍照及PaddleOCR测试

在上一篇文章《基于百度飞桨PaddleOCR的图片文字识别》的基础上&#xff0c;做了个简单的扩展&#xff1a; 1、通过Pyqt5做个简单的UI界面&#xff1b; 2、通过OpenCV操作笔记本摄像头进行视频显示、拍照等功能&#xff1b; 3、加载图片&#xff1b; 4、对拍照图片或者加载的图…

Python贝叶斯回归分析住房负担能力数据集

我想研究如何使用pymc3在贝叶斯框架内进行线性回归。根据从数据中学到的知识进行推断。 最近我们被客户要求撰写关于贝叶斯回归的研究报告&#xff0c;包括一些图形和统计输出。 视频&#xff1a;线性回归中的贝叶斯推断与R语言预测工人工资数据案例 贝叶斯推断线性回归与R语言…

猿如意---Visual Studio手把手教学安装和下载.

亲自为大家示范如何使用猿如意以及在猿如意当中下载&#xff0c;安装和使用python3.10版本&#xff0c;让大家喜欢上这款好用的app—猿如意。 文章目录前言一、手把手教你猿如意的安装、下载二、手把手教你Visual Studio的安装、下载1.找到我需要的工具2.我需要的工具的安装、下…

最新Crack:foxit pdf sdk 8.4.1_win_java

Foxit pdf sdk一个功能强大、易于使用的核心 API&#xff0c;用于呈现、查看、注释、签名、保护和管理 PDF 中的表单。 Foxit pdf sdk开发人员的最佳工具 快速整合 C、C#、C、Python 和 Java 中功能强大且易于使用的核心 API。系统要求&#xff1a;Windows XP、Vista、7、8 和…

【云原生 | Kubernetes 实战】12、K8s 四层代理 Service 入门到企业实战应用(上)

目录 一、Service 四层代理基本介绍 1.1 四层负载均衡 Service&#xff1a;概念、原理解读 1 为什么要有Service&#xff1f; 2 Service 概述 3 Service 工作原理 4 kubernetes 集群中有三类 IP 地址 二、创建 Service 资源 2.1 Service 的四种类型 2.2 Service 的端口…

k8s编程operator实战之云编码平台——①架构设计

文章目录1、想法来源2、初步设想2.1 通过反向代理的方式访问后端Pod3、架构设计3.1 技术栈3.2 架构设计k8s编程operator系列&#xff1a;k8s编程operator——(1) client-go基础部分k8s编程operator——(2) client-go中的informerk8s编程operator——(3) 自定义资源CRDk8s编程op…

SpringSecurity管理接口权限

使用SpringSecurity管理具体接口访问权限。 需要先有授权服务器和资源服务器 Springboot利用Security做OAuth2授权验证_LO嘉嘉VE的博客-CSDN博客 Springboot利用Security做OAuth2资源服务器_LO嘉嘉VE的博客-CSDN博客 配置接口具体访问权限再有以上两个的基础上就比较简单了…

antd-vue 累加表单编辑和删除(完善版)

一、业务场景&#xff1a; 最近在使用Antd-Vue组件库的时候&#xff0c;发现在累加表单 时没有直接可以用的&#xff0c;必须自己在官网上手动合并几个才能实现&#xff0c;为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、具体实现步骤&#xff1a; <temp…

新一代最强开源UI自动化测试神器Playwright(Java版)环境搭建

Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或在 CI 上进行测试&#xff0c;无外设或带本机移动仿真。 一.安装 在JAVA中&#xff0c;使用…

嵌入式技术之IAP,自从有了它老板再也不担心我的代码了!(上)

1.惨痛的教训 那是一个严寒的冬日&#xff0c;客户在现场使用我们公司新研发的设备&#xff0c;设备最初设计可以允许最多连接20个温湿度传感器&#xff0c;但是由于现场空间非常大&#xff0c;客户要求连接30个温湿度传感器。这个需求修改非常简单&#xff0c;只用修改程序中…

帮公司面试了个要25K的测试,我问了他这些问题...

深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网公司&#xff0c;会给我们以后的发展带来多大的影响。 很多人想说&#xff0c;这个我也知道&#xff0c;但是进大厂实在是太难了&#xff0c;简历投出去基本石沉大海&#xff0…

spring security安全认证登录全流程分析

文章目录前言一、登录时序图二、配置与代码1.引入库2.代码文件参考文档前言 本文章主要从spring security安全认证登录内部调用流程来流程分析登录过程。 一、登录时序图 时序原图 二、配置与代码 1.引入库 pom.xml&#xff1a; <!-- Spring框架基本的核心工具 -->&…

截至到2022年12月12日,知网最新改进 YOLO 核心论文合集 | 22篇创新点速览

截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集 本篇博文仅供学习交流&#xff0c;不对文章质量进行评价&#xff0c;请尊重每一位同学的科研成果&#x1f91d;。 文章目录截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集引言&#x1f4a1;0. 什…

Vue.use()的用法详解

目录 &#x1f53d; 前言 &#x1f53d; 官方解释 &#x1f53d; Demo演示 &#x1f388; Object对象 &#x1f449; 创建项目 &#x1f449; 创建组件 &#x1f449; 使用组件 &#x1f388; function函数 &#x1f449; 创建函数 &#x1f449; 引入 &#x1f449…