当前位置: 首页 > news >正文

最短路径 | 743. 网络延迟时间之 Dijkstra 算法和 Floyd 算法

目录

    • 1 基于 Dijkstra 算法
      • 1.1 代码说明
      • 1.2 完整代码
    • 2 基于 Floyd 算法
      • 2.1 代码说明
      • 2.2 完整代码


前言:我在做「399. 除法求值」时,看到了基于 Floyd 算法的解决方案,突然想起来自己还没有做过最短路径相关的题。因此找来了「743. 网络延迟时间」作为练习,其本质是在求解一个源点到其他各点的最短路径。



1 基于 Dijkstra 算法

假设源点为 2 \mathrm{2} 2,那么手工模拟如下图所示:

在这里插入图片描述

代码的编写在本质上就是实现上述手工模拟过程。



1.1 代码说明

为了表示两点之间没有路径,我们定义两点之间的距离为无穷大:

const int inf = INT_MAX / 2;

说明:这里只是对 i n f \mathrm{inf} inf 进行定义,后面才会进行使用;为什么不直接定义为 i n f = I N T − M A X \mathrm{inf = INT_{-}MAX} inf=INTMAX?因为在更新距离时涉及加法操作,而 I N T − M A X \mathrm{INT_{-}MAX} INTMAX 可能让加法越界,所以我们取其一半来表示无穷大。

Step1:构建图

由于题目通常给出的是边的起点、终点以及权值,而非存储了图结构的二维数组,因此无论是 Dijkstra 算法还是 Floyd 算法,我们都需要完成图的构建。代码如下:

vector<vector<int>> graph(n + 1, vector<int>(n + 1, inf));
for (auto & t : times)graph[t[0]][t[1]] = t[2];

逻辑非常简单:① 创建一个二维数组 g r a p h \mathrm{graph} graph;② g r a p h [ i ] [ j ] \mathrm{graph[i][j]} graph[i][j] 表示边 < i , j > \mathrm{<i, j>} <i,j> 的权值。

说明:初始时如果两点之间没有边,那么认为两点之间的距离为 i n f \mathrm{inf} inf 无穷大。

Step2:定义数组

vector<int> dist(n + 1, inf);
dist[k] = 0;
vector<int> used(n + 1, 0);
  • d i s t \mathrm{dist} dist 数组用于存储每一轮源点 k \mathrm{k} k 到其他点的距离;
  • u s e d \mathrm{used} used 数组用于表明当前点是否已经被纳入集合。

说明:由于 k \mathrm{k} k 到自己的距离为 0 \mathrm{0} 0,因此有 d i s t [ k ] = 0 \mathrm{dist[k] = 0} dist[k]=0;为什么不直接让 u s e d [ k ] = 1 \mathrm{used[k] = 1} used[k]=1?由于在纳入每个点时都会更新源点 k \mathrm{k} k 到其他点的距离,因此我们在初始时并不直接将 k \mathrm{k} k 纳入集合,而是放到后面和其他点统一处理,从而避免了需要在初始时更新 d i s t \mathrm{dist} dist 数组的值的问题。

Step3:纳入并更新距离

for (int i = 1; i <= n; ++i) {// 查找距离源点最近的点int s = -1;for (int t = 1; t <= n; ++t) {if (!used[t] && (s == -1 || dist[s] > dist[t]))s = t;}// 纳入该点used[s] = 1;// 更新距离for (int j = 1; j <= n; ++j)dist[j] = min(dist[j], dist[s] + graph[s][j]);
}

其中 s \mathrm{s} s 用于查找当前距离源点最近的点, t \mathrm{t} t 用于遍历所有未被纳入的点。

说明:由于初始时只有 d i s t [ k ] = 0 \mathrm{dist[k] = 0} dist[k]=0,而其他距离被默认为 i n f \mathrm{inf} inf 无穷大,因此第一个被纳入的一定是源点 k \mathrm{k} k

Step4:返回结果

由于题目提问「需要多久才能使所有节点都收到信号」,因此我们返回源点 k \mathrm{k} k 到其他点的最短距离的最大值即可。代码如下:

int ans = * max_element(dist.begin() + 1, dist.end());
return ans == inf ? -1 : ans;

如果最大值是 i n f \mathrm{inf} inf,那么说明源点 k \mathrm{k} k 无法到达某些点,因此返回 − 1 \mathrm{-1} 1



1.2 完整代码

int networkDelayTime(vector<vector<int>>& times, int n, int k) {const int inf = INT_MAX / 2;vector<vector<int>> graph(n + 1, vector<int>(n + 1, inf));for (auto & t : times)graph[t[0]][t[1]] = t[2];vector<int> dist(n + 1, inf);dist[k] = 0;vector<int> used(n + 1, 0);for (int i = 1; i <= n; ++i) {int s = -1;for (int t = 1; t <= n; ++t) {if (!used[t] && (s == -1 || dist[s] > dist[t]))s = t;}used[s] = 1;for (int j = 1; j <= n; ++j)dist[j] = min(dist[j], dist[s] + graph[s][j]);}int ans = * max_element(dist.begin() + 1, dist.end());return ans == inf ? -1 : ans;
}


2 基于 Floyd 算法

在这里插入图片描述

说明:上图只是给出一个示例,并没有把整个更新过程画完整,请自行脑补。



2.1 代码说明

Step1:构建图(与 Dijkstra 算法一致)

Step2:更新距离

Floyd 算法的核心:不断尝试在点 i \mathrm{i} i 和点 j \mathrm{j} j 之间加入其他点 k \mathrm{k} k 作为中间点,如果加入 k \mathrm{k} k 之后的距离比加入 k \mathrm{k} k 之前的距离短,那么就更新点 i \mathrm{i} i 和点 j \mathrm{j} j 之间的距离。重复上述操作 n \mathrm{n} n 次,即可计算出任意两点之间的最短路径。

for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (graph[i][k] >= 0 && graph[k][j] >= 0)graph[i][j] = graph[i][j] >= 0 ?min(graph[i][j], graph[i][k] + graph[k][j]): graph[i][k] + graph[k][j];}}
}

注意:中间点 k \mathrm{k} k 必须在最外层循环,否则一些路径无法被更新到;为什么判断条件是 > = 0 \mathrm{>= 0} >=0?因为题目给出的边的权值的范围为 [ 0 , 100 ] \mathrm{[0,100]} [0,100],所以需要包含 0 \mathrm{0} 0

Step3:返回结果

int ans = -1;
for (int j = 1; j <= n; ++j) {if (graph[k][j] == -1 && k != j)return -1;else if (k != j)ans = max(ans, graph[k][j]);
}
return ans;

由于我们只需要源点 k \mathrm{k} k 到其他点的距离,因此只需要遍历 g r a p h \mathrm{graph} graph 中的第 k \mathrm{k} k 行。

说明:由于我们在本方案中定义两点之间没有路径时的边的权值为 − 1 \mathrm{-1} 1,因此只要 g r a p h [ k ] [ j ] = = − 1 \mathrm{graph[k][j] == -1} graph[k][j]==1,就说明源点 k \mathrm{k} k 无法到达点 j \mathrm{j} j,因此返回 − 1 \mathrm{-1} 1



2.2 完整代码

int networkDelayTime(vector<vector<int>>& times, int n, int k) {vector<vector<int>> graph(n + 1, vector<int>(n + 1, -1));for (auto & t : times)graph[t[0]][t[1]] = t[2];for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {if (graph[i][k] >= 0 && graph[k][j] >= 0)graph[i][j] = graph[i][j] >= 0 ?min(graph[i][j], graph[i][k] + graph[k][j]): graph[i][k] + graph[k][j];}}}int ans = -1;for (int j = 1; j <= n; ++j) {if (graph[k][j] == -1 && k != j)return -1;else if (k != j)ans = max(ans, graph[k][j]);}return ans;
}

虽然 Floyd 算法写起来没有 Dijkstra 算法繁琐,但是针对该问题的时间复杂度更高。



相关文章:

最短路径 | 743. 网络延迟时间之 Dijkstra 算法和 Floyd 算法

目录 1 基于 Dijkstra 算法1.1 代码说明1.2 完整代码 2 基于 Floyd 算法2.1 代码说明2.2 完整代码 前言&#xff1a;我在做「399. 除法求值」时&#xff0c;看到了基于 Floyd 算法的解决方案&#xff0c;突然想起来自己还没有做过最短路径相关的题。因此找来了「743. 网络…...

LLM模型与实践之基于 MindSpore 实现 BERT 对话情绪识别

安装环境 # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip install mindnlp0.3.1 !pip install mindnlp 模型简介 BERT是一种由Google于2018年发布的新型语言模型&#xff0c;它是基于Transforme…...

单例模式学习cpp

现在我们要求定义一个表示总统的类型。presented可以从该类型继承出French present和American present的等类型。这些派生类型都只能产生一个实例 为了设计一个表示总统的类型&#xff0c;并从该类型派生出只能产生一个实例的具体总统&#xff08;如法国总统和美国总统&#x…...

第5讲:Sysmac Studio中的硬件拓扑

Sysmac Studio软件概述 一、创建项目 在打开的软件中选择新建工程 然后在工程属性中输入工程名称,作者,类型选择“标准工程”即可。 在选择设备处,类型选择“控制器”。 在版本处,可以在NJ控制器的硬件右侧标签处找到这样一个版本号。 我们今天用到的是1.40,所以在软…...

使用GoAccess进行Web日志可视化

运行网站的挑战之一是了解您的 Web 服务器正在做什么。虽然各种监控应用程序可以在您的服务器以高负载或页面响应缓慢运行时提醒您&#xff0c;但要完全了解正在发生的事情&#xff0c;唯一的方法是查看 Web 日志。阅读日志数据页面并了解正在发生的事情可能需要花费大量时间。…...

GD 32 流水灯

前言&#xff1a; 通过后面的学习掌握了一些逻辑架构的知识&#xff0c;通过复习的方式将学到的裸机任务架构的知识运用起来&#xff0c;同时巩固前面学到的知识&#xff0c;GPIO的配置等。 开发板上LED引脚使用示意图 注&#xff1a;此次LED灯的点亮凡是是高电平点亮&#xff…...

数据结构之栈详解

1. 栈的概念以及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…...

算法:BFS解决 FloodFill 算法

目录 FloodFill 算法 题目一&#xff1a;图像渲染 题目二&#xff1a;岛屿数量 题目三&#xff1a;岛屿的最大面积 题目四&#xff1a;被围绕的区域 FloodFill 算法 在递归搜索回溯中已经说到过 FloodFill 算法了&#xff0c;但是那里是用 dfs 解决的&#xff0c;这里会使…...

Python 中文双引号 “”

Python 中文双引号 “” 1. SyntaxError: invalid character in identifier2. CorrectionReferences 1. SyntaxError: invalid character in identifier print(Albert Einstein once said, “A person who never made a mistake never tried anything new.”) print(Albert Ei…...

以太网(Ethernet)

目录 1. What is Internet?1.1. What is Ethernet?2. TCP/IP3. Physical Layer(PHY)4. Data Link Layer4.1. MAC Sublayer5. Network Layer5.1. IP5.2. ARP6. Transport Layer6.1. UDP6.2. TCP7. Application LayerFPGA实现以太网(一)——以太网简介 网络与路由交换 菜鸟FP…...

Scrcpy adb server version (41) doesn‘t match this client (39); killing...

通过Snap 在Ubuntu上安装 scrcpy之后&#xff0c;启动会导致无法同时 scrcpy和adb logcat 过滤日志 目前最新的安装的platforms-tools下面的adb 版本最新都是 adb 41版本 解决办法&#xff1a; 在这里链接里面 下载 adb 1.0.39 版本&#xff0c;替换 /home/host/Android/Sdk/…...

微服务实战系列之玩转Docker(四)

前言 幸福&#xff0c;就是继续追寻已经拥有的东西。 ——圣奥古斯丁 什么算已经拥有的&#xff1f;比如爱你的人在等你&#xff0c;比如每日热腾腾的三餐&#xff0c;比如身边可爱的同事&#xff0c;又比如此刻的你&#xff0c;看见了这篇博文&#xff08;&#x1f601;&#…...

微信小程序-自定义组件生命周期

一.created 组件实例创建完毕调用。定义在lifetimes对象里。 不能在方法里面更改data对象里面的值&#xff0c;但是可以定义属性值。 lifetimes:{//不能给data设置值created(){this.testaaconsole.log("created") }}二. attached 模板解析完成挂载到页面。 可以更…...

2024年7月23日(samba DNS)

​ 回顾 1、关闭防火墙&#xff0c;关闭selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 2、修改静态IP地址 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #修改uuid的目的是为了保证网络的唯一性 3、重启网络服务 systemctl restart netwo…...

Hyperledger顶级项目特点和介绍

Hyperledger的顶级项目 Hyperledger是Linux基金会主持的开源区块链项目&#xff0c;其目的是推动跨行业的区块链技术的开发和应用。以下是Hyperledger的顶级项目&#xff1a; 1. Hyperledger Fabric 描述&#xff1a;Hyperledger Fabric是一个可扩展的企业级区块链平台&…...

操作系统——笔记(1)

操作系统是管理计算机硬件资源&#xff0c;控制其他程序运行并为用户提供交互操作界面的系统软件的集合&#xff0c;控制和管理着整个计算机系统的硬件和软件资源&#xff0c;是最基本的系统软件。 常见的操作系统&#xff1a;ios、windows、Linux。 计算机系统的结构层次&am…...

isEmpty() 和 isBlank()的区别

isEmpty() 和 isBlank()的区别 平时自己开发的时候没有注意到这个地方,直到实习的时候代码审查的时候发现其用法上两者的不同. isEmpty() public static boolean isEmpty(String str) {return str null || str.length() 0; }isBlank() public static boolean isBlank(Strin…...

scrapy生成爬虫数据为excel

scrapy生成爬虫数据为excel 使用openpyxl&#xff08;推荐&#xff09;安装openpyxl库建一个新的Item Pipeline类在settings.py中启用ExcelPipeline说明 使用scrapy-xlsx首先&#xff0c;安装scrapy-xlsx&#xff1a;然后在Scrapy爬虫中使用管道&#xff1a;说明 要使用Scrapy生…...

vscode debug C++无法输入问题

研究了半天vscode debug c无法输入的问题&#xff0c;原来vscode的文档里面已经记录了。issue都是2020年提的了&#xff0c;还没解决。。。 不过人家也确实给了一个解法&#xff1a;用外部的terminal。 不过怎么看都还不是很方便&#xff0c;所以还是推荐直接使用CodeLLDB插件来…...

MODBUS tcp学习总结

MODBUS TCP协议实例数据帧详细分析_modbus 帧结构-CSDN博客...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...