LeetCode 3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

news2024/9/22 11:39:58

【LetMeFly】3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

力扣题目链接:https://leetcode.cn/problems/minimum-time-to-visit-disappearing-nodes/

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] = [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。

同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点,在那一刻及以后,你无法再访问这个节点。

注意,图有可能一开始是不连通的,两个节点之间也可能有多条边。

请你返回数组 answer ,answer[i] 表示从节点 0 到节点 i 需要的 最少 单位时间。如果从节点 0 出发 无法 到达节点 i ,那么 answer[i] 为 -1 。

 

示例 1:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,1,5]

输出:[0,-1,4]

解释:

我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。

  • 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
  • 对于节点 1 ,我们需要至少 2 单位时间,通过 edges[0] 到达。但当我们到达的时候,它已经消失了,所以我们无法到达它。
  • 对于节点 2 ,我们需要至少 4 单位时间,通过 edges[2] 到达。

示例 2:

输入:n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,3,5]

输出:[0,2,3]

解释:

我们从节点 0 出发,目的是用最少的时间在其他节点消失之前到达它们。

  • 对于节点 0 ,我们不需要任何时间,因为它就是我们的起点。
  • 对于节点 1 ,我们需要至少 2 单位时间,通过 edges[0] 到达。
  • 对于节点 2 ,我们需要至少 3 单位时间,通过 edges[0] 和 edges[1] 到达。

示例 3:

输入:n = 2, edges = [[0,1,1]], disappear = [1,1]

输出:[0,-1]

解释:

当我们到达节点 1 的时候,它恰好消失,所以我们无法到达节点 1 。

 

提示:

  • 1 <= n <= 5 * 104
  • 0 <= edges.length <= 105
  • edges[i] == [ui, vi, lengthi]
  • 0 <= ui, vi <= n - 1
  • 1 <= lengthi <= 105
  • disappear.length == n
  • 1 <= disappear[i] <= 105

解题方法:单源最短路的Dijkstra算法

关于单源最短路的Dijkstra算法的视频讲解,可以查看这个视频。

大致思路是:从起点开始,每次将所有的能一部到达的节点放入优先队列中。优先队列中存放的是每个节点的首次能到达的时间以及节点编号,能最先到达的最先出队。

每次从优先队列中取出一个元素,这样就得到了这个元素的最快到达时间。以此节点开始将所有相邻的没有确定过最短时间的节点入队。直到队列为空为止,就得到了从起点到其他任意一点的最短耗时。

关于本题,有个额外条件就是节点消失时间。很简单,在每次遍历当前节点的相邻节点时,若无法在某相邻节点消失之前到达,则不将其入队。

  • 时间复杂度 O ( n + m log ⁡ m ) O(n+m\log m) O(n+mlogm),其中 n n n是节点数量, m m m是边的数量。
  • 空间复杂度 O ( n + m ) O(n+m) O(n+m)

AC代码

C++
class Solution {
public:
    vector<int> minimumTime(int n, vector<vector<int>>& edges, vector<int>& disappear) {
        vector<vector<pair<int, int>>> graph(n);
        for (vector<int>& edge : edges) {
            graph[edge[0]].push_back({edge[1], edge[2]});
            graph[edge[1]].push_back({edge[0], edge[2]});
        }
        vector<int> ans(n, -1);
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;  // [<time, toNode>, ...
        pq.push({0, 0});
        while (pq.size()) {
            auto [thisTime, thisNode] = pq.top();
            pq.pop();
            if (ans[thisNode] != -1) {
                continue;
            }
            ans[thisNode] = thisTime;
            for (auto [nextNode, length] : graph[thisNode]) {
                if (ans[nextNode] != -1 || thisTime + length >= disappear[nextNode]) {
                    continue;
                }
                pq.push({thisTime + length, nextNode});
            }
        }
        return ans;
    }
};
Java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

class Solution {
    public int[] minimumTime(int n, int[][] edges, int[] disappear) {
        List<int[]>[] graph = new ArrayList[n];
        Arrays.setAll(graph, i -> new ArrayList<>());
        for (int[] edge : edges) {
            graph[edge[0]].add(new int[]{edge[1], edge[2]});
            graph[edge[1]].add(new int[]{edge[0], edge[2]});
        }
        int[] ans = new int[n];
        Arrays.fill(ans, -1);
        Queue<int[]> pq = new PriorityQueue<>((a, b) -> (a[0] - b[0]));
        pq.add(new int[]{0, 0});
        while (!pq.isEmpty()) {
            int[] temp = pq.poll();
            int thisTime = temp[0];
            int thisNode = temp[1];
            if (ans[thisNode] != -1) {
                continue;
            }
            ans[thisNode] = thisTime;
            for (int[] temp2 : graph[thisNode]) {
                int nextNode = temp2[0];
                int length = temp2[1];
                if (ans[nextNode] == -1 && thisTime + length < disappear[nextNode]) {
                    pq.add(new int[]{thisTime + length, nextNode});
                }
            }
        }
        return ans;
    }
}
Python
from typing import List
import heapq

class Solution:
    def minimumTime(self, n: int, edges: List[List[int]], disappear: List[int]) -> List[int]:
        graph = [[] for _ in range(n)]
        for x, y, d in edges:
            graph[x].append((y, d))
            graph[y].append((x, d))
        ans = [-1] * n
        pq = [(0, 0)]
        while pq:
            thisTime, thisNode = heapq.heappop(pq)
            if ans[thisNode] != -1:
                continue
            ans[thisNode] = thisTime
            for nextNode, length in graph[thisNode]:
                # print(nextNode, length, ans[nextNode], thisTime + length, disappear[nextNode])  #------------------
                # print(ans[nextNode] != -1)
                # print(thisTime + length < disappear[nextNode])
                if ans[nextNode] == -1 and thisTime + length < disappear[nextNode]:
                    heapq.heappush(pq, (thisTime + length, nextNode))
        return ans


if __name__ == '__main__':
    sol = Solution()
    print(sol.minimumTime(3, [[0, 1, 2], [1, 2, 1], [0, 2, 4]], [1, 1, 5]))

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/140530368

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

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

相关文章

【JavaEE】CAS原理实现 + 常见应用

本文基于jdk8 参考&#xff1a; 黑马程序员深入学习Java并发编程&#xff0c;JUC并发编程全套教程_哔哩哔哩_bilibili CAS原理 CAS&#xff1a;比较和交换(设置) Compare And Swap(Set)。当A的值为5的时候&#xff0c;给A设置值为10。这里涉及到的比较和设置值的操作是原子的…

SAP代理商哲讯智能携手合肥企业,共塑SAP系统开发新篇章

在数字化转型的浪潮中&#xff0c;SAP开发作为企业信息化建设的重要一环&#xff0c;对于提升企业的运营效率和市场竞争力具有至关重要的作用。合肥&#xff0c;作为中国东部地区的重要城市之一&#xff0c;拥有众多企业正积极探索SAP开发的可能性。哲讯智能科技有限公司&#…

【昇思25天学习打卡营第25天 | 基于MindSpore通过GPT实现情感分类】

学习心得&#xff1a;基于MindSpore通过GPT实现情感分类 摘要 本文通过一个具体的实验案例&#xff0c;详细阐述了如何使用华为的MindSpore框架结合GPT模型来实现情感分类任务。从环境配置到模型训练&#xff0c;再到评估和测试&#xff0c;整个流程清晰、系统&#xff0c;为…

第三篇 Vue项目目录结构介绍

1、最外层目录结构 passagerFrontPage ├── .vscode //vscode配置&#xff0c;不用理会 ├── node_modules //项目依赖&#xff0c;npm install命令执行后自动生成 ├── public //公共资源存放 ├── src //源码 ├── tests //选装&#xff1a;测试模块 ├── .git…

华为云安全事件深度剖析与防范策略

华为云安全事件深度剖析与防范策略 引言 随着云计算技术的飞速发展&#xff0c;企业越来越依赖云服务来提升业务效率和创新能力。然而&#xff0c;云服务在带来便利的同时&#xff0c;也伴随着一系列复杂的安全挑战。华为云作为国内领先的云服务提供商&#xff0c;其安全性直接…

Linux网络——TcpServer

一、UDP 与 TCP 在现实生活中&#xff0c;Udp 类似于发传单&#xff0c;Tcp 类似于邮局的挂号信服务。 1.1 UDP&#xff08;用户数据报协议&#xff09; 无连接&#xff1a;发放传单时&#xff0c;你不需要提前和接受传单的人建立联系&#xff0c;直接把传单发出去。不可靠&…

Ubantu 使用 docker 配置 + 远程部署 + 远程开发

大家好我是苏麟 , Ubantu 一些配置 . 视频 : 服务器很贵&#xff1f;搞台虚拟机玩玩&#xff01;保姆级 Linux 远程开发教程_哔哩哔哩_bilibili Docker安装及配置 安装命令 : sudo apt install docker.io 查看版本号 : docker -v 查看虚拟机地址命令 : ifconfig 虚拟机地址 或…

服务器数据恢复—RAID5阵列重建重建导致数据丢失的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器&#xff0c;有一组由5块硬盘组建的raid5磁盘阵列。 服务器在运行过程中一块有磁盘掉线&#xff0c;由于raid5阵列支持一块磁盘掉线的特性&#xff0c;服务器还在正常工作。不久之后服务器出现故障&#xff0c;管理员在不了…

记一下blender的烘焙贴图的UV特殊用法

就拿这个BOX来说好了 如果使用light map展开是这样的 如果你手动展好的话是这样的 为什么提到这个东西呢 如果有一个物体&#xff0c;你在blender渲染其实使用了程序化方案&#xff0c;且没展UV就做好了颜色&#xff0c;那如果你想要直接拿到他&#xff0c;直接用这个light …

LLM大模型实战项目--基于Stable Diffusion的电商平台虚拟试衣

本文详细讲解LLM大模型实战项目&#xff0c;基于Stable Diffusion的电商平台虚拟试衣 一、项目介绍 二、阿里PAI平台介绍 三、阿里云注册及开通PAI 四、PAI_DSW环境搭建 五、SDLORA模型微调 一、项目介绍 AI虚拟试衣是一种创新的技术&#xff0c;利用人工智能和计算机视觉技…

【C语言】深入解析选择排序

文章目录 什么是选择排序&#xff1f;选择排序的基本实现代码解释选择排序的优化选择排序的性能分析选择排序的实际应用结论 在C语言编程中&#xff0c;选择排序是一种简单且直观的排序算法。尽管它在处理大型数据集时效率不高&#xff0c;但由于其实现简单&#xff0c;常常用于…

IT产品研发全生命周期【详细说明】

阶段步骤任务负责人产品管理用户故事收集和理解用户需求&#xff0c;创建用户故事产品经理需求分类分类用户故事&#xff0c;组织和优先级排序需求经理可行性分析评估需求的技术可行性与实现难度研发经理需求转换将需求转化为具体的产品特性或功能要求需求经理需求管理创建需求…

【机器学习】机器学习与语音识别的融合应用与性能优化新探索

文章目录 引言第一章&#xff1a;机器学习在语音识别中的应用1.1 数据预处理1.1.1 数据去噪1.1.2 数据归一化1.1.3 特征提取 1.2 模型选择1.2.1 隐马尔可夫模型1.2.2 循环神经网络1.2.3 长短期记忆网络1.2.4 Transformer 1.3 模型训练1.3.1 梯度下降1.3.2 随机梯度下降1.3.3 Ad…

Three.JS 使用RGBELoader和CubeTextureLoader 添加环境贴图

导入RGBELoader模块&#xff1a; import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"; 使用 addRGBEMappingk(environment, background,url) {rgbeLoader new RGBELoader();rgbeLoader.loadAsync(url).then((texture) > {//贴图模式 经纬…

基于Linux的USB-wifi配置流程

目录 内核配置 配置 CFG80211 配置usb 配置 Netlink 配置DHCP 工作流程 1.连接到无线网络 2.设置网络接口&#xff1a; 3.验证连接&#xff1a; 4. 接收数据&#xff1a; 最近daisy一直忙活这个linux的wifi驱动和bluze蓝牙驱动&#xff0c;相比较蓝牙&#xff0c;WiFi的驱动和内…

【ARMv8/v9 GIC- 700 系列 2 -- GIC-700 上电控制寄存器 GICR_PWRR】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC-700 上电GICR_PWRR 寄存器字段介绍GICR_PWRR 功能说明GICR_PWER 代码配置GICR_PWRR 使用场景GICR_PWRR 注意事项GIC-700 上电 GICR_PWRR(功耗寄存器)是ARM GICv4架构中用于控制GIC-700是否可以关闭电源的寄存器。它通过几个位…

【日记】我倒是想穿可爱的 JK 小裙子,可惜我是哥布林……(704 字)

正文 中午给三盆植物换水&#xff0c;惊叹于文竹的根。长得之长&#xff0c;都能在花盆里盘几圈了。而且我好像有一段时间没换水了&#xff0c;花盆的水中和盆底有了些绿藻。虽然不知道好不好&#xff0c;但我还是清掉了&#xff0c;摸起来黏黏的。而且我也总是觉得单位的水&am…

InceptionV3代码实现(Pytorch)

文章目录 Inception介绍InceptionV3代码实现第一步&#xff1a;定义基础卷积模块第二步&#xff1a;定义Inceptionv3模块InceptionAInceptionBInceptionCInceptionDInceptionE 第三步&#xff1a;定义辅助分类器InceptionAux第四步&#xff1a;搭建GoogLeNet网络第五步*&#x…

算法力扣刷题记录 五十二【617.合并二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十二【617.合并二叉树】 一、题目阅读 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要…

HCIE-AI大模型直通车火热报名中

第一阶段&#xff1a;HCIA-AI Solution Architect&#xff08;直播&#xff0c;39课时&#xff09; 该阶段详细介绍 AI 大模型所需基础技术栈&#xff0c;包含深度学习基础、计算机视觉技术、自然语言处理技术、华为开源深度学习框架 MindSpore、注意力制、Transformer 架构&am…