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

news2025/1/14 1:13:13

每日一题

今天刷到一道有关的图的题,需要求单源最短路径,因此使用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.coloradmin.cn/o/1639503.html

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

相关文章

GPT-1

GPT 系列是 OpenAI 的一系列预训练模型&#xff0c;GPT 的全称是 Generative Pre-Trained Transformer&#xff0c;顾名思义&#xff0c;GPT 的目标是通过 Transformer&#xff0c;使用预训练技术得到通用的语言模型。目前已经公布论文的有 GPT-1、GPT-2、GPT-3。 最近非常火的…

java之web笔记

1.Servlet技术 1.1 JavaWeb概述 在Sun的Java Servlet规范中&#xff0c;对Java Web应用作了这样定义:“JavaWeb应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。 Java Web应用中可以包含如下内容…

B+树详解与实现

B树详解与实现 一、引言二、B树的定义三、B树的插入四、B树的删除五、B树的查找效率六、B树与B树的区别和联系 一、引言 B树是一种树数据结构&#xff0c;通常用于数据库和操作系统的文件系统中。它的特点是能够保持数据稳定有序&#xff0c;其插入与修改拥有较稳定的对数时间…

hive表基本语法

hive表基本语法 青少年是一个美好而又是一去不可再得的时期 是将来一切光明和幸福的开端 目录 hive表基本语法 1.ROW FORMAT用法 2.LOCATION用法 3.EXTERNAL用法 &#xff08;外部表&#xff09; 4.STORED AS 用法&#xff1a;设置数据存储格式 5.TBLPROPERTIES 用法 6.P…

liceo靶机复现

liceo-hackmyvm 靶机地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmLiceo 本机环境&#xff1a;NAT模式下&#xff0c;使用VirtualBox 信息收集&#xff1a; 首先局域网内探测靶机IP 发现IP为10.0.2.4 开启nmap扫描一下看看开了什么端口 扫描期间看一下web页…

随便聊一下 显控科技 控制屏 通过 RS485 接口 上位机 通讯 说明

系统搭建&#xff1a; 1、自己研发的一个小系统&#xff08;采集信号&#xff0c;将采集的信号数字化&#xff09;通过COM口&#xff0c;连接显控屏 COM3 口采用 485 协议送到显控屏&#xff08;显控科技&#xff09;的显示屏展示出来&#xff09;。 2、显控屏 将 展示的数据…

Neomodel 快速上手 构建neo4j 知识图谱

介绍 python 创建neo4j 数据通常使用py2neo&#xff0c;但是这个包 官方声明已经停止更新&#xff0c;根据neo4j网站推荐使用neomodel neomodel 使用起来很想django 中的orm&#xff0c;如果有django基础的上手很简单&#xff0c;而且neomodel 支持 neo4j 5.X版本更新维护的也…

使用 FFmpeg 推拉 RTSP 流媒体

实时流传输协议 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;是 TCP/IP 协议体系中的一个应用层协议&#xff0c;由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP 在体系…

全栈开发之路——前端篇(3)setup和响应式数据

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 本文为该系列的第三篇&#xff0c;主要讲述Vue核心的setup语法&#xff0c;同时讲解再使用了setup后如何设置响应式数据。 辅助…

基于php+mysql+html超市商品管理系统(含论文)

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Java-异常处理-处理RuntimeException(2/2)

下面有一个简单的整数除法运算程序&#xff0c;输入两个整数作为被除数和除数&#xff0c;在正常情况下&#xff0c;会输出两数相除的整数商。 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.i…

unity制作app(3)--gps定位

1.unity中定位Unity之GPS定位&#xff08;高德解析&#xff09;_unity gps定位-CSDN博客 代码需要稍微修改一下&#xff0c;先把脚本绑到一个button上试一试&#xff01; 2.先去高德地图认证&#xff08;app定位&#xff09; 创建应用和 Key-Web服务 API | 高德地图API (ama…

【Java】HOT100 贪心算法

目录 理论基础 一、简单贪心 LeetCode455&#xff1a;分发饼干 二、中等贪心 2.1 序列问题 LeetCode376&#xff1a;摆动序列 2.2 贪心股票问题 LeetCode121&#xff1a;买卖股票的最佳时机 LeetCode121&#xff1a;买卖股票的最佳时机ii 2.3 两个维度权衡问题 LeetCode135&…

GitHub Copilot Workspace:欢迎进入原生Copilot开发环境

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

华为Pura70发布,供应链公司进入静默保密期

保密措施&#xff1a;与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态&#xff0c;尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感&#xff0c;调动用户的好奇心&#xf…

mac电脑关于ios端的appium真机自动化测试环境搭建

一、app store 下载xcode,需要登录apple id 再开始下载 二、安装homebrew 1、终端输入命令&#xff1a; curl -fsSL <https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh>如果不能直接安装&#xff0c;而是出现了很多内容&#xff0c;那么这个时候不要着急&…

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载&#xff09;》 2、程序功能选中列表控件某一项&#xff0c;修改这一项的按钮由禁止变为可用&#xff0c;双击这个按钮弹出对话框可对这一项的记录数据进行修改&#xff0c;点击确定保存修改数…

《R语言与农业数据统计分析及建模》学习——数字图像处理

数字图像处理&#xff08;digital image processing&#xff09;又称计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用数字图像处理计算机对其进行处理的过程。 常见的数字图像处理是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理。 R语言…

信息管理与信息系统就业方向及前景分析

信息管理与信息系统(IMIS)专业的就业方向十分广泛&#xff0c;包含计算机方向、企业信息化管理、数据处理和数据分析等&#xff0c;随着大数据、云计算、人工智能、物联网等技术的兴起&#xff0c;对能够处理复杂信息系统的专业人才需求激增&#xff0c;信息管理与信息系统就业…

数据分析:基于DESeq2的转录组功能富集分析

介绍 DESeq2常用于识别差异基因&#xff0c;它主要使用了标准化因子标准化数据&#xff0c;再根据广义线性模型判别组间差异&#xff08;组间残差是否显著判断&#xff09;。在获取差异基因结果后&#xff0c;我们可以进行下一步的富集分析&#xff0c;常用方法有基于在线网站…