力扣每日一题21.08.02网络延迟时间
网络延迟时间
题目描述:
有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
提示:
- 1 <= k <= n <= 100
- 1 <= times.length <= 6000
- times[i].length == 3
- 1 <= ui, vi <= n
- ui != vi
- 0 <= wi <= 100
- 所有(ui, vi)对都互不相同(即,不含重复边)
思路:DFS(一般不用于最短路径求解)、BFS、Dijkstra、Bellman-Ford、Floyed等
1、DFS:建图后直接DFS递归遍历图,但是这种方法不太适合求最短路径
python代码:
class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:# 方法一DFS# 建图mp = [{} for i in range(n+1)]for u, v, t in times:mp[u][v] = t# 记录结点最早收到信号的时间current_time = [-1 for i in range(n+1)]# DFSdef dfs(i, t):# 在t时间到达i结点if current_time[i] == -1 or t < current_time[i]:current_time[i] = tfor u, v in mp[i].items():dfs(u, t+v)dfs(k, 0)minT = -1for i in range(1, n+1):if current_time[i] == -1:return -1minT = max(minT, current_time[i])return minT
2、BFS,一般最短路径都用BFS解决
python代码:
class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:# 方法二BFS# 建图mp = [{} for i in range(n+1)]for u, v, t in times:mp[u][v] = t# 记录结点最早收到信号的时间current_time = [-1 for i in range(n+1)]current_time[k] = 0# 队列用于存放[结点,收到信号时间]s = deque([[k, 0]])while s:cur, t = s.popleft()for u, v in mp[cur].items():cur_t = t + vif current_time[u] == -1 or cur_t < current_time[u]:current_time[u] = cur_ts.append([u, cur_t])minT = -1for i in range(1, n+1):if current_time[i] == -1:return -1minT = max(minT, current_time[i])return minT
3、Dijkstra,该算法为使用贪心策略优化后的广度优先搜索(BFS),缺点是不能处理存在负权的图,如果是存在负权的图,可以使用Bellman-Ford算法
python代码:
class Solution:def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:# 方法三Dijkstra# 建图mp = [{} for i in range(n+1)]for u, v, t in times:mp[u][v] = t# 记录结点最早收到信号的时间,设置最短路标记r = [ float('inf') for i in range(n+1)]s = [False for i in range(n+1)]r[k] = 0# 不断循环查找最短路径while True:# 查找最短路径cur, t = -1, float('inf')for i, d in enumerate(r):if not s[i] and d < t:cur, t = i, dif cur == -1:break# 更新最短路径s[cur] = Truefor u, v in mp[cur].items():r[u] = min(r[u], t + v)minT = -1for i in range(1, n+1):minT = max(minT, r[i])return minT if minT != float('inf') else -1
力扣每日一题21.08.02网络延迟时间相关推荐
- 【JAVA】交错字符串——力扣每日一题(六)(2020.07.18)
目录 题目:97. 交错字符串 思路 如果你从本文中学习到丝毫知识,那么请您点点关注.点赞.评论和收藏 大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博 ...
- leetcode 力扣每日一题系列详解——总目录
这是总目录,该系列持续更新中........ leetcode 力扣每日一题系列详解--总目录
- 【爬虫】力扣每日一题每天自动邮件提醒!!!
使用python实现了一个力扣每日一题每天自动邮件提醒的小爬虫,小但实用!!! 文章目录 A.需求来源与分析 B.技术角度分析 C.具体分析步骤 1.接口协议分析 2.发邮件 3.写crontab放服 ...
- 力扣每日一题每天自动邮件提醒
A.需求来源与分析 需求来源于生活,对于只是偶尔有兴趣做做题的我,力扣的每日一题对我一直有以下的不便: 太简单不想做,需要花太多时间的不想做,每天打开力扣其实只是想看一下是什么题,有意思才做. 看题需 ...
- 力扣每日一题:1720.解码异或后的数组 python异或操作
1720.解码异或后的数组 https://leetcode-cn.com/problems/decode-xored-array/ 难度:简单 题目: 未知 整数数组 arr 由 n 个非负整数组成 ...
- LeetCode 力扣每日一题 488.祖玛游戏
题目描述: 你正在参与祖玛游戏的一个变种. 在这个祖玛游戏变体中,桌面上有 一排 彩球,每个球的颜色可能是:红色 'R'.黄色 'Y'.蓝色 'B'.绿色 'G' 或白色 'W' .你的手中也有一些彩 ...
- 力扣每日一题——两数相加II
发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...
- 2022.1.4 力扣-每日一题-猫和老鼠
题目描述: 两位玩家分别扮演猫和老鼠,在一张 无向 图上进行游戏,两人轮流行动. 图的形式是:graph[a] 是一个列表,由满足 ab 是图中的一条边的所有节点 b 组成. 老鼠从节点 1 开始,第 ...
- 力扣每日一题——独一无二出现的次数
难度:简单 题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数. 如果每个数的出现次数都是独一无二的,就返回 true:否则返回 false. 示例 1: 输入:arr = [1,2 ...
最新文章
- JS仿淘宝关闭二维码案例
- linux系统密码自动丢失,通过单用户模式找回linux系统丢失的密码
- NOIP2013Day1T3 表示只能过一个点
- php多线程swoole,swoole究竟能够多线程么_PHP开发框架教程
- 《Programming in Lua 3》读书笔记(十二)
- java conf_JAVA 解析、编辑nginx.conf详解
- node 存储过程_用Node.js操作跨平台数据库Firebird
- Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享
- 无法检测或故障_大众朗境挡位偶发缺失且无法启动
- SVC较好的介绍资料
- 作为前端程序员,你不能不知道的这个小技巧
- 数据可视化?不如用最经典的工具画最酷炫的图
- java中新建对象设为null 和new 一个对象的区别
- 泰坦尼克号幸存者预测所用函数
- 杭电操作系统实验三--- 实现模拟shell(arm架构华为云)
- 计量经济学及Stata应用 陈强 第十章工具变量法习题10.6
- 文件上传属性accept
- 软件测试工作中遇到的痛点,RPA解决方案:几个典型行业痛点工作场景
- mac下安装 mat内存分析工具
- Xft字体库:体系结构及用户指南(转)