Leetcode743. 网络延迟时间

Java实现 LeetCode 743 网络延迟时间(Dijkstra经典例题) 743. 网络延迟时间 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 示例: 输入:times = [... 阅读详情

Every day a Leetcode

题目来源:743. 网络延迟时间

本题需要用到单源最短路径算法 Dijkstra,现在让我们回顾该算法,其主要思想是贪心。

将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。

每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。

用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。这种操作也被叫做「松弛」。

这里暗含的信息是:每次选择「未确定节点」时,起点到它的最短路径的长度可以被确定。

可以这样理解,因为我们已经用了每一个「已确定节点」更新过了当前节点,无需再次更新(因为一个点不能多次到达)。而当前节点已经是所有「未确定节点」中与起点距离最短的点,不可能被其它「未确定节点」更新。所以当前节点可以被归类为「已确定节点」。

解法1:朴素 Dijkstra 算法

适用于稠密图。

代码:

/*
 * @lc app=leetcode.cn id=743 lang=cpp
 *
 * [743] 网络延迟时间
 */

// @lc code=start
class Solution
{
private:
    const int inf = INT_MAX / 2;

public:
    int networkDelayTime(vector<vector<int>> &times, int n, int k)
    {
        vector<vector<int>> g(n, vector<int>(n, inf));
        for (auto &time : times)
        {
            int u = time[0] - 1, v = time[1] - 1;
            int w = time[2];
            g[u][v] = w;
        }
        // dist[i] 表示点 k 到其他节点的最短距离
        vector<int> dist(n, inf);
        dist[k - 1] = 0;
        vector<int> used(n);
        for (int i = 0; i < n; i++)
        {
            int x = -1;
            for (int y = 0; y < n; y++)
                if (!used[y] && (x == -1 || dist[y] < dist[x]))
                    x = y;
            used[x] = true;
            for (int y = 0; y < n; y++)
                dist[y] = min(dist[y], dist[x] + g[x][y]);
        }

        int ans = *max_element(dist.begin(), dist.end());
        return ans == inf ? -1 : ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n2+m),其中 n 是节点个数,m 是数组 times 的长度。

空间复杂度:O(n2),其中 n 是节点个数。

解法2:堆优化 Dijkstra 算法

适用于稀疏图。

寻找最小值的过程可以用一个最小堆来快速完成:

  • 一开始把 (dis[k],k) 二元组入堆。
  • 当节点 x 首次出堆时,dis[x] 就是写法一中寻找的最小最短路。
  • 更新 dis[y] 时,把 (dis[y],y) 二元组入堆。

注意,如果一个节点 x 在出堆前,其最短路长度 dis[x] 被多次更新,那么堆中会有多个重复的 x,并且包含 x 的二元组中的 dis[x] 是互不相同的(因为我们只在找到更小的最短路时才会把二元组入堆)。

所以写法一中的 used 数组可以省去,取而代之的是用出堆的最短路值(记作 dx)与当前的 dis[x] 比较,如果 dx>dis[x] 说明 x 之前出堆过,我们已经更新了 x 的邻居的最短路,所以这次就不用更新了,继续外层循环。

代码:

// 堆优化 Dijkstra(适用于稀疏图)

class Solution
{
private:
    const int inf = INT_MAX / 2;

public:
    int networkDelayTime(vector<vector<int>> &times, int n, int k)
    {
        vector<vector<pair<int, int>>> g(n); // 邻接表
        for (auto &time : times)
        {
            int u = time[0] - 1, v = time[1] - 1;
            int w = time[2];
            g[u].emplace_back(v, w);
        }
        // dist[i] 表示点 k 到其他节点的最短距离
        vector<int> dist(n, inf);
        dist[k - 1] = 0;
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
        pq.emplace(0, k - 1);
        while (!pq.empty())
        {
            auto [dx, x] = pq.top();
            pq.pop();
            if (dx > dist[x])
            { // x 之前出堆过
                continue;
            }
            for (auto &[y, d] : g[x])
            {
                int new_dist = dx + d;
                if (new_dist < dist[y])
                {
                    dist[y] = new_dist; // 更新 x 的邻居的最短路
                    pq.emplace(new_dist, y);
                }
            }
        }

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

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(mlog⁡m),其中 m 是数组 times 的长度。值得注意的是,如果输入的是稠密图,本写法的时间复杂度为 O(n2log⁡n),不如写法一。

空间复杂度:O(m),其中 m 是数组 times 的长度。

LeetCode743. 网络延迟时间(Dijkstra算法) LeetCode743. 网络延迟时间(Dijkstra算法) code class Solution: def networkDelayTime(self, times: list, N: int, K: int) -&gt; int: inf = int(1e9) g = [[int(1e9)] * N for _ in range(N)] ... 阅读详情

相关推荐

网络延迟时间

网络延迟时间,dijkstra算法,迪杰斯特拉算法,单源最短路径

优快云 6289

leetcode-743. 网络延迟时间

最短路径。2. dijkstra堆优化版本。3.bellman-ford算法。dijkstra 朴素。最短路径的几种算法。

qq_33496846的博客 649

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

头歌操作系统 课堂练习4.2:页式内存管理 答案 无解析

kercii的博客 1万+

leetcode743. 网络延迟时间 floyd

有 n 个网络节点,标记为 1 到 n。给你一个列表 times,表示信号经过 有向 边的传递时间。times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。现在,如果不能使所有节点收到信号,返回 -1。

ResumeProject的博客 962

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 688

LeetCode 743. 网络延迟时间

Dj算法 注意这个不是最小生成树 而是判断到达每个点的最小值中的最大值 ,用的应该是dj,最后遍历一遍dis数组 注意dj的一些判断条件: 1.退出条件 visited全部为true 2.判断到达不到全部的定点: 这个比较难判断,我是这么判断的,进行多轮判断后,dis数组一定不包含无穷(就是9999),如果包含无穷,就说明有点到达不到;也就是说 判断dis这个数组中的最小值时不能让index(代码中设置为N-1,为了不让下标越界,实际上这个index设置为无穷更好理解)为默认值。 import java.u

qq_42950702的博客 256

从学生项目到工程实践:手把手教你用ATE测试电源芯片的Rdson与漏电流

本文详细介绍了如何将学术级的电源芯片测试方案转化为工业级解决方案,重点讲解使用ATE设备测试Rdson(导通电阻)和漏电流的关键技术。从设备选型、测试夹具设计到量产环境下的工程化实现,提供了实用的优化技巧和常见问题解决方案,帮助工程师提升测试效率和精度。

weixin_42525289的博客 182

【LeetCode: 743. 网络延迟时间 + Dijkstra】

【LeetCode: 743. 网络延迟时间 + Dijkstra】有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

Coder_ljw的博客 937

PVE启动卡在loading initial ramdisk

pve显卡直通导致的异常解决

学而时习之 6692

eICU数据库没有ventilation_event表

各位学友大家好,我是环湖医院神经外科的飞时过,很多外院的老师和我问,ventilation_event表的问题,哪怕用ChatGPT也无法正确生成,今天我给大家用SQL做一个拿来就能用的。

环湖数据科学知识共享平台 939

743.力扣LeetCode_ 网络延迟时间_Dijkstra算法

迪杰斯特拉算法是一种求解单源最短路径的贪心算法,通过逐步锁定离源点最近的节点来更新其他节点的距离。该代码实现使用邻接矩阵存储图结构,将节点编号转换为0基索引,并采用0x3f3f3f3f作为安全无穷大值以避免溢出。关键步骤包括初始化距离数组、标记已访问节点、执行松弛操作等。最终结果取所有节点最短距离的最大值,若存在未达节点则返回-1。算法通过n次循环确保所有节点都被处理,时间复杂度为O(n²)。

2401_82472941的博客 1489

5.13华为OD机试真题 新系统 - 社交网络相同爱好好友查询 (Java/Py/C/C++/Js/Go)

5.13华为OD机试真题 新系统 - 社交网络相同爱好好友查询 (Java/Py/C/C++/Js/Go)

算法大师! 157

Leetcode 743.网络延迟时间(Network Delay Time)

Leetcode 743.网络延迟时间 1 题目描述(Leetcode题目链接)   有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 输入:times = [[2,1,1],[2,3,1],[3,4,1]], N =

qq_39378221的博客 662

Python爬虫实战:模拟登录B站 – 处理Cookie和加密参数

由于B站在登录过程中采用了多种安全措施,包括加密的请求参数和cookie验证,模拟登录成为一项具有挑战性的任务。首先,我们需要获取B站的登录页面,并解析出其中的CSRF令牌和其他隐藏的字段。B站的登录接口通常会包含一些动态的加密参数,我们需要在登录前通过GET请求获取这些信息。本文详细介绍了如何使用Python模拟登录B站,解决加密参数的处理、图形验证码的识别以及登录后的数据抓取。库中的加密方法加密登录请求中的密码。一旦登录成功,我们可以通过维护会话状态,抓取登录后的数据,如个人主页、评论、观看记录等。

2201_76125261的博客 1310

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LeetCode 743.网络延迟时间

LeetCode 743.网络延迟时间 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 样例输入...

缇欧的咪西 353

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[leetcode]743. 网络延迟时间(Dijkstra)

1.题目: 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 2.代码: /* 这个题节点1-N对应数组...

MJ_Lee的博客 996

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Leetcode 743. 网络延迟时间 C++

Leetcode 743. 网络延迟时间 题目 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 示例: 输入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2 输出:2

weixin_43750513的博客 524

leetcode:743. 网络延迟时间

题目解析 迪杰斯特拉算法,用于计算一个节点到其他节点的最短路径这个算法的主要思想是:贪心用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。这种操作也被叫做「松弛」。这里暗含的信息是:每次选择「未确定节点」时,起点到它的最短路径的长度可以被确定。可以这样理解,因为我们已经用了每一个「已确定节点」更新过了当前节点,无需再次更新(因为一个点不能多次到达)。而当前节点已经是所有「未确定节

OceanStar的博客 367

【Leetcode刷题篇】- Leetcode743网络延迟时间

DFS-2.Leetcode743 网络延迟时间 有 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

Mind_programmonkey的博客 620

LeetCode第743题 - 网络延迟时间

LeetCode第743题 - 网络延迟时间

流水账 538

LeetCode 743. 网络延迟时间 [java实现]

一、问题描述 有 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

lly-Rachel的博客 561

Floyd弗洛伊德算法和解决 leetcode 743. 网络延迟时间

文章目录1 Floyd弗洛伊德算法2 leetcode 743. 网络延迟时间 1 Floyd弗洛伊德算法  Floyd算法是求解图上多源最短路径问题的,意思是可以求出每一个顶点到其他顶点的最短路径,和我们之前讲的Bellman-ford算法原理其实是一样的,也是一种动态规划问题,状态转移方程是dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j])dp[i][j]=min(dp[i][j],dp[i][

weixin_43688483的博客 921

Leetcode-743 Network Delay Time(网络延迟时间)

1 #define INF 0x3f3f3f3f 2 const int maxn = 503; 3 #define _for(i,a,b) for(int i = (a);i < (b);i ++) 4 struct edge 5 { 6 int to; 7 int cost; 8 }; 9 10 //G[s].push_back(...

weixin_30421525的博客 165
上一篇: 设计模式:观察者模式(Observer)
下一篇: 腾讯面试准备-2024.3.25
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值