LeetCode-网络延迟时间(Dijkstra算法)

每日一题

今天刷到一道有关的图的题,需要求单源最短路径,因此使用Dijkstra算法。

题目要求

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

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

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

示例 1:

输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:2

示例 2:

输入:times = [[1,2,1]], n = 2, k = 1
输出:1

示例 3:

输入:times = [[1,2,1]], n = 2, k = 2
输出:-1

题目解析

题目中给了几个节点,并且给了节点之间的距离,要求我们从指定的某个节点发送信号。需要多久所有节点可以收到,这个明显要求从某个节点到所有节点的最短距离,因此可以采用Dijkstra。

Dijkstra算法

Dijkstra算法是一种用于解决单源最短路径问题的经典算法,由荷兰计算机科学家艾兹赫尔·迪科斯彻(Edsger W. Dijkstra)于1956年提出。该算法可以在加权图中找到从起始节点到所有其他节点的最短路径。

算法思想

  1. 初始化:将起始节点的距离设为0,其他节点的距离设为无穷大(或一个很大的值),并将所有节点标记为未访问。

  2. 遍历节点:从起始节点开始,依次遍历所有节点。

  3. 更新距离:对于当前节点的所有邻居节点,计算从起始节点经过当前节点到达邻居节点的距离。如果经过当前节点到达邻居节点的距离小于目前已知的最短距离,则更新邻居节点的距离值为经过当前节点到达邻居节点的距离,并标记当前节点为邻居节点的前驱节点。

  4. 选择下一个节点:从所有未访问的节点中选择距离起始节点最近的节点作为下一个当前节点,并标记该节点为已访问。

  5. 重复步骤3和4,直到所有节点都被访问过,或者目标节点的距离值被确定。

算法特点

  • Dijkstra算法适用于没有负权边的加权有向图或无向图。
  • 算法保证了在每一步选择当前最短路径的节点,因此得到的结果是最优解。
  • 算法的时间复杂度为O(V^2),其中V是图中节点的数量。如果使用优先队列(如最小堆)来存储和选择距离最近的节点,时间复杂度可以优化到O(E + VlogV),其中E是图中边的数量。

图解流程如下:

使用此算法需要两个数组,一个dist数组用来记录第k个节点到所有的节点最短距离,一个visited数组记录某个节点是否被访问过。

那么针对于这道题来说,我们一共需要创建三个数组

一个二维graph[i][j]数组,用来记录当前记录下的从i到j的距离

一个dist数组,记录第k个节点到所有的节点最短距离

一个used数组记录某个节点是否被访问过。

首先先将graph数组初始化,将距离全部设为最大。随后遍历给的times数组,记录下已经给出的节点间的距离。随后同步到dist数组中。

随后开始循环n-1次,在循环中嵌套循环,找到所有未访问节点中距离k最近的节点‘u’并记录下来已经访问过了。如果循环完毕后发现从k到不了某个未节点,则直接返回-1.最后再次进入一次循环,循环中对于节点j来说,判断是直接从k到j的距离小还是从可先到u再到j的距离小,因为我们刚得到了从k到u的最短距离,找到谁最小,赋值给dist[j].

最后经过多次循环,从k到所有节点的距离就存储在了dist中了,找到其中的最大的值就是我们要的答案。

代码实现

class Solution {public int networkDelayTime(int[][] times, int n, int k) {final int INF = Integer.MAX_VALUE / 2;int[][] graph = new int[n][n];boolean[] used = new boolean[n];int[] dist = new int[n];Arrays.fill(dist, INF);for (int i = 0; i < n; i++) {Arrays.fill(graph[i], INF);}for (int[] time : times) {graph[time[0] - 1][time[1] - 1] = time[2];}for (int i = 0; i < n; i++) { dist[i] = graph[k - 1][i];}dist[k - 1] = 0;used[k - 1] = true;for (int i = 0; i < n - 1; i++) {int min = INF;int u = -1;for (int j = 0; j < n; j++) {if (!used[j] && dist[j] < min) {min = dist[j];u = j;}}if (u == -1) {return -1;}used[u] = true;for (int j = 0; j < n; j++) {if (!used[j] && graph[u][j] + dist[u] < dist[j]) {dist[j] = graph[u][j] + dist[u];}}}int ans = 0;for (int i = 0; i < n; i++) {ans = Math.max(ans, dist[i]);}return ans == INF ? -1 : ans;}
}

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

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

相关文章

Noisy:一款功能强大的DNS和HTTPS网络流量噪声生成工具

关于Noisy Noisy是一款功能强大的DNS和HTTP/S网络流量噪音生成工具&#xff0c;该工具基于Python开发&#xff0c;可以帮助广大研究人员在进行常规网络浏览时&#xff0c;在后台生成随机的HTTP/DNS网络流量噪声&#xff0c;并以此来提升网络通信数据的安全性和隐蔽性。 支持的…

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

《十二》Qt各种对话框之FileDialog文件对话框及QMessageBox 消息对话框

QFileDialog 对话框 选择打开一个文件 若要打开一个文件&#xff0c;可调用静态函数 QFileDialog::getOpenFileName()&#xff0c;“打开一个文件”按钮的响应代码如下&#xff1a; void Dialog::on_btnOpen_clicked() { //选择单个文件QString curPathQDir::currentPath()…

如何利用ChatGPT撰写满分文案:技巧与实例解析

在当今社会&#xff0c;随着企业越来越重视宣传推广&#xff0c;文案写作已成为关键的营销手段之一。同时&#xff0c;人工智能的快速发展为文案创作提供了新的工具和方法。例如&#xff0c;ChatGPT这种基于自然语言处理的模型&#xff0c;在协助撰写多种文案方面展现出了极大的…

【智能算法】冠豪猪优化算法(CPO)原理及实现

1.背景 2024年&#xff0c;M Abdel-Basset等人受到冠豪猪防御行为启发&#xff0c;提出了冠豪猪优化算法&#xff08;Crested Porcupine Optimizer, CPO&#xff09;。 2.算法原理 2.1算法思想 CPO使用四种不同的保护机制:视觉、声音、气味和物理攻击。第一和第二防御策略(视…

Linux实训-用户和组的管理

实训1&#xff1a;用户的管理 创建一个新用户user1&#xff0c;设置其主目录为/home/user1。查看/etc/passwd文件的最后一行&#xff0c;看看是如何记录的。查看文件/etc/shadow文件的最后一行&#xff0c;看看如何记录的。给用户user1设置密码。再次查看文件/etc/shadow文件的…

暗区突围端游海外版|暗区突围怎么玩 新手游玩攻略分享

游戏中健康系统与其它射击游戏有很大区别&#xff0c;根据受伤部位、伤势的不同&#xff0c;会有不同的表现。除了头部之外&#xff0c;其它部位如果损坏后继续受到伤害&#xff0c;那么伤害将会分摊到身体其它部位。在暗区内或者暗区外都可以对角色进行治疗&#xff0c;角色不…

【算法入门教育赛1D】环形密码 - 字符串 | C++题解与代码

题目链接&#xff1a;https://www.starrycoding.com/problem/161 题目描述 小 e e e有一个宝箱&#xff0c;这个宝箱有一个长度为 n n n的密码&#xff0c;但是这个密码校验器是一个环形&#xff0c;意思是只要密码从任意一位开始读&#xff08;读到最后一位回到第一位继续&a…

【Canvas与艺术】自制朝阳电脑桌面(1920*1080)

【关键点】 线性渐变色绘制天空&#xff0c;径向渐变色绘制太阳&#xff0c;半透明色制作光芒。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/&g…

Docker 安装部署 postgres

Docker 安装部署 postgres 1、拉取 postgres 镜像文件 [rootiZbp19a67kznq0h0rgosuxZ ~]# docker pull postgres:latest latest: Pulling from library/postgres b0a0cf830b12: Pull complete dda3d8fbd5ed: Pull complete 283a477db7bb: Pull complete 91d2729fa4d5: Pul…

2023上半年软件设计师上午题——防火墙

防火墙知识点总结 网络级防火墙层次低&#xff0c;但是效率高&#xff0c;因为其使用包过滤和状态监测手段&#xff0c;一般只检验网络包外在 (起始地址、状态) 属性是否异常 , 若异常则过滤掉 , 不与内网通信,因此对应用和用户是透明的。但是这样的问题是&#xff0c;如果遇到…

Redis---------实现查询缓存业务

目录 数据库与缓存之间的工作业务逻辑&#xff1a; 接下来看查询缓存代码实现&#xff0c;主要是捋清楚业务逻辑&#xff0c;代码实现是死的&#xff1a; Controller: Service: P37作业实现&#xff1a;总体逻辑跟上面的业务逻辑差不多 Controller&#xff1a; Service&#…

由于找不到vcruntime140_1.dll无法继续执行此代码的8个解决方法

vcruntime140_1.dll 是一个动态链接库&#xff08;Dynamic Link Library&#xff09;文件&#xff0c;它是Microsoft Visual C Redistributable包的一部分&#xff0c;特别与Visual Studio 2015及之后版本的C运行时环境关联紧密。此文件包含了执行基于Visual C开发的应用程序所…

如何快速的追加文章的内容(在不知道内容的情况下)

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具&#xff0c;切换到文章模块下&#xff0c;快捷键&#xff1a;Ctrl1 2、新建一个文章做演示&#xff0c;001 3、添加一个内容&#xff0c;就随…

订票系统|基于Springboot+vue的火车票订票系统(源码+数据库+文档)

订票系统目录 基于Springbootvue的火车票订票系统 一、前言 二、系统设计 三、系统功能设计 1会员信息管理 2 车次信息管理 3订票订单管理 4留言板管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍…

RoNID:通过生成可靠标签与聚类友好型表征来实现新意图的发现

论文地址&#xff1a;https://arxiv.org/abs/2404.08977 原文地址&#xff1a;intents-are-not-going-away-ronid-is-a-new-intent-discovery-framework 2024 年 4 月 26 日 Robust New Intent Discovery&#xff08;RoNID&#xff09;框架致力于在开放域场景中识别已知意图并合…

韩国云主机安装AMP环境要求科普

AMP环境&#xff0c;即Apache、MySQL和PHP的组合&#xff0c;是许多网站开发者和运维人员常用的环境配置。在韩国云主机上安装AMP环境&#xff0c;需要满足一定的要求以确保顺利运行和高效性能。下面我们将对韩国云主机安装AMP环境的要求进行科普。 首先&#xff0c;韩国云主机…

Vue Canvas图片水印的绘制 图片加水印

效果 定义画布 <canvas width"800" height"800" ref"cn" ></canvas>绘制水印 draw(){const img new Image()img.srchttps://img1.baidu.com/it/u3035183739,1826404114&fm253&fmtauto&app138&fJPEGimg.onload(()…

java版数据结构:深入理解栈和队列:数据结构与应用(vector,stack,queue)

目录 前言 动态数组类&#xff08;vector&#xff09; 特点&#xff1a; 应用&#xff1a; 栈&#xff08;Stack&#xff09; 栈的基础概念&#xff1a; 栈的常用方法&#xff1a; 模拟栈操作&#xff1a; 队列&#xff08;Queue&#xff09; 队列的基础概念 队列的常…

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM

20240502给NanoPi的NEO core开发板编译移远的4G模块的上网程序quectel-CM 2024/5/2 16:29 1、默认编译为AMD64/INTEL的x64架构的可执行文件&#xff1a; rootrootrootroot-ThinkBook-16-G5-IRH:~$ rootrootrootroot-ThinkBook-16-G5-IRH:~$ unzip Quectel_QConnectManager_Lin…