743. 网络延迟时间(最短路径)

2023-11-02 08:48

本文主要是介绍743. 网络延迟时间(最短路径),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有 N 个网络节点,标记为 1 到 N

给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1

Example 1:

Input: times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
Output: 2

注意:

  1. N 的范围在 [1, 100] 之间。
  2. K 的范围在 [1, N] 之间。
  3. times 的长度在 [1, 6000] 之间。
  4. 所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100

思路:这题目是一个有向图求最短路径的问题,求出K点到每一个点到最短路径,然后取其中最大的一个就是需要的时间了。

采用Dijkstra算法来求有向图的最短路径。

1、先回顾一下Dijkstra算法原理。

2、Dijkstra算法伪代码:

//G为图,S,U,K为起点
Dijkstra(G, U, S)
{初始化;for(循环n次,每次向S中添加一个顶点){uu = 去U中找出路径最小的顶点的标号;在U中删掉uu,并且将uu将入到S中for(在U中遍历从uu出发能到达的所有顶点v){if(以uu为中介点使s到顶点v的最短距离d[v]更优){优化d[v];}}}
}

3、设计Dijkstra算法所用到的数据结构:

数据结构的设计应该有很多种方法,我就选了一种最朴素的:

用两个vector表示S和U,每个vector里面索引值存顶点,元素值存源点到该顶点的路径长度。

另外,考虑到数组中删除元素代价比较大,所以我额外建了一个标记数组visited,用来标记U中被移除的顶点。

4、最后,代码实现一下:

class Solution {
public:int networkDelayTime(vector<vector<int>>& times, int N, int K) {//定义并初始化S,U,visitedvector<int>S(N+1, INT_MAX), U=S;vector<bool>v(N+1, true);U[K]=0;//每次处理掉一个顶点for(int c=1; c<=N; ++c){//去U中找最小路径int uu=0;for(int i=1; i<=N; ++i){if(v[i] && U[i]<U[uu])uu=i;}//在U中删掉uu,并且将uu将入到S中v[uu]=false;S[uu]=U[uu];//在U中遍历(要求该点在v中的值为true)从uu出发能到达的所有顶点v(从题目中给的G下手)for(auto x:times){if(x[0]==uu && v[x[1]] && S[uu]+x[2]<U[x[1]]){//以uu为中介点使s到顶点v的最短距离d[v]更优U[x[1]]=S[uu]+x[2];}}}//此时S中存的应该是K到每一个顶点的最短路径了//去S中找出最大值int re=0;for(int i=1; i<=N; ++i){//注意要从第一个元素算起re=max(re, S[i]);}return re==INT_MAX ?-1:re;//有可能有的点找不到最短路径}
};

 

这篇关于743. 网络延迟时间(最短路径)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329463

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义