当前位置: 首页 > news >正文

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

【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 heapqclass 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] * npq = [(0, 0)]while pq:thisTime, thisNode = heapq.heappop(pq)if ans[thisNode] != -1:continueans[thisNode] = thisTimefor 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 ansif __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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Nginx详解(超级详细)
  • Mac Electron 应用如何进行签名(signature)和公证(notarization)?
  • cms wpscan使用方式--kali linux
  • You are running Vue in development mode.和undefined is not iterable白屏问题
  • 【Android】Intent基础用法及作用
  • Go网络编程-RPC程序设计
  • 前端路由History 和 Hash模式的区别以及Vue项目打包后显示白屏,路由router-view不加载问题
  • C语言之指针的奥秘(三)
  • 【python】OpenCV—Scanner
  • vue使用x6画流程图,简单使用
  • 鸿蒙语言基础类库:【@system.request (上传下载)】
  • 分布式搜索引擎ES-Elasticsearch进阶
  • Python酷库之旅-第三方库Pandas(032)
  • 食堂采购系统开发:从需求分析到上线实施的完整指南
  • npm install时报错 reason: connect ETIMEDOUT
  • 【翻译】babel对TC39装饰器草案的实现
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • bearychat的java client
  • ECS应用管理最佳实践
  • FastReport在线报表设计器工作原理
  • Flannel解读
  • js作用域和this的理解
  • leetcode讲解--894. All Possible Full Binary Trees
  • spring-boot List转Page
  • SpringCloud集成分布式事务LCN (一)
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 如何利用MongoDB打造TOP榜小程序
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 双管齐下,VMware的容器新战略
  • 我与Jetbrains的这些年
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 如何在招聘中考核.NET架构师
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​字​节​一​面​
  • ![CDATA[ ]] 是什么东东
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #git 撤消对文件的更改
  • #宝哥教你#查看jquery绑定的事件函数
  • $ git push -u origin master 推送到远程库出错
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (pojstep1.3.1)1017(构造法模拟)
  • (阿里云万网)-域名注册购买实名流程
  • (二)JAVA使用POI操作excel
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十六)视图变换 正交投影 透视投影
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原)Matlab的svmtrain和svmclassify
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ****Linux下Mysql的安装和配置
  • ***详解账号泄露:全球约1亿用户已泄露