冉宝的每日一题--8月5日
今天看女乒天团的直播,她们好有趣啊
802.找到最终的安全状态
在有向图中,以某个节点为起始节点,从该点出发,每一步沿着图中的一条有向边行走。如果到达的节点是终点(即它没有连出的有向边),则停止。
对于一个起始节点,如果从该节点出发,无论每一步选择沿哪条有向边行走,最后必然在有限步内到达终点,则将该起始节点称作是 安全 的。
返回一个由图中所有安全的起始节点组成的数组作为答案。答案数组中的元素应当按 升序 排列。
该有向图有 n 个节点,按 0 到 n - 1 编号,其中 n 是 graph 的节点数。图以下述形式给出:graph[i] 是编号 j 节点的一个列表,满足 (i, j) 是图的一条有向边。
class Solution:def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:num_nodes = len(graph)visited = [False for i in range(num_nodes)]not_save_nodes = set()def dfs(node,pre_list):nonlocal not_save_nodes# 处理当前节点,标记为已访问if node in pre_list or (node in not_save_nodes):not_save_nodes |= set(pre_list)return # 这条路径应该已经结束了visited[node] = True# 遍历与当前顶点所有为访问节点next_nodes = [next_n for next_n in graph[node]]for next_n in next_nodes:pre_next = pre_list[:] + [node]dfs(next_n,pre_next)for node in range(num_nodes):if not visited[node]:dfs(node,[])return [node for node in range(num_nodes) if node not in not_save_nodes]
dfs思路:
dfs(dep,)
{if (找到解||找不下去) {return }枚举下一种情况:dfs(dep+1,)
}
dfs(顶点)
{处理当前结点,记录为已访问遍历与当前定点相邻所有未访问结点{标记更改dfs(下一结点)}
}
官方题解:
方法一:深度优先搜索+三色标记法
根据题意,若起始节点位于一个环内,或者能到达一个环,则该节点不是安全的。
我们可以使用深度优先搜索来找环,并在深度优先搜索时,用三种颜色对节点进行标记,标记的规则如下:
- 白色(用0表示):该节点尚未被访问;
- 灰色(用1表示):该节点位于递归栈中,或者在某个环上;
- 黑色(用2表示):该节点搜索完毕,是一个安全节点
当我们首次访问一个节点时,将其标记为灰色,并继续搜索与其相连的节点。
如果在搜索过程中遇到了一个灰色节点,则说明找到了一个环,此时退出搜索,栈中的节点仍然保持灰色,这一做法可以将【找到了环】这一信息传递到栈中的所有节点上。
如果搜索过程中没有遇到灰色节点,则说明没有遇到环,递归返回之前,将标记由灰色改成黑色表示是一个安全的结点。
from typing import List
class Solution:def eventualSafeNodes(self,graph:List[List[int]])->List[int]:n = len(graph)color = [0] * ndef safe(x:int)->bool:if color[x] > 0:return color[x] == 2 color[x] = 1 for y in graph[x]:if not safe(y):return Falsecolor[x] = 2 return Truereturn [i for i in range(n) if safe(i)]
复杂度分析:
- 时间复杂度: O(n+m), 其中n是图中的点数,m是图中的边数
- 空间复杂度:O(n),存储节点颜色和递归栈的开销均为O(n)
方法二:拓扑排序
根据题意,如果一个节点没有出边,就是安全的;
一个节点出边相连的点都是安全的,则该节点也是安全的。
根据这个性质,我们可以将图中所有的边反向,得到一个反图,在反图上进行拓扑排序。
拓扑排序的知识以及模版
拓扑排序定义: 对于给定的一张有向无环图,如果一个序列A满足:任意一条边(x,y),x都在y的前面 , 那么序列A 就是图的拓扑排序。
理解: 每一个状态没有循环依赖 --> 没有后效性 --> 可以满足DP递推
即: 有向无环图 ⇒ 拓扑排序 ⇒ 拓扑图 ⇒ 每个状态没有循环依赖 ⇒ 没有后效性,可以通过DP寻找最短、最长路径。
拓扑排序算法实质上属于广度优先遍历。包含以下几个步骤:
1- 从 有向图 中找一个没有前驱的节点 v ,如果v不存在说明不可以进行拓扑排序【图是个环图】,结束。
2- 将 v 输出;
3- 将v 从图中删除,同时删除关联v的所有节点。
4- 如果图中所有节点都输出,就结束,拓扑排序结束,否则转到1继续进行。
常见题型可以分为:
- (1)Topsort模版
- (2)判断是否有环
- (3)已有编号求字典序最小的拓扑需
- (4)给所有节点分配编号使得拓扑排序最小
参考资料
1- 模版:拓扑排序 https://fanfansann.blog.csdn.net/article/details/107707044
冉宝的每日一题--8月5日相关推荐
- 淘宝618每日一猜6月8日答案-明星孙怡最喜欢的显瘦单品?
淘宝6月8日每日一猜答案是什么?,接下来也会给大家来介绍一下6月8日淘宝大赢家每日一猜的答案. 淘宝每日一猜6月8日答案分享 活动问题:明星孙怡最喜欢的显瘦单品? 活动答案:轻塑鲨鱼裤 今天的题目是和 ...
- 淘宝618每日一猜6月6日答案-甄嬛在横店哪里参加的选秀?
淘宝6月6日每日一猜答案是什么?,接下来也会给大家来介绍一下6月6日淘宝大赢家每日一猜的答案. 淘宝每日一猜6月6日答案分享 活动问题:甄嬛在横店哪里参加的选秀 活动答案:[交泰殿] 还有打开手机淘宝 ...
- 第五人格七月三日服务器维护要多久,第五人格微信每日一题7月3日答案是什么_今天有四个人来访过_玩游戏网...
<第五人格>2021独特时装体验卡礼包 第五人格2021独特时装体验卡礼包怎么获得?礼包中有独特时装体验卡.角色体验卡等奖励,小编这里就分享一下第五人格2021独特时装体验卡礼包领取地址, ...
- PMP模拟试题每日5题(5月5日)
摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.你的敏捷团队与一个开发商 ...
- PMP模拟试题每日5题(5月7日)
摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.产品开发团队采用敏捷开发 ...
- PMP模拟试题每日5题(4月28日)
摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.项目需要委托第三方研发一 ...
- PMP模拟试题每日5题(4月22日)
摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.项目技术团队强烈 ...
- PMP模拟试题每日5题(5月6日)
摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.沟通对项目成功非常关键. ...
- 【备战秋招】每日一题:4月23日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释
为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第三题-农村大亨 在线评测链接:P1247 题目内容 塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时 ...
最新文章
- IHttpModule
- python分析excel数据-对照Excel使用Python进行数据分析,更快掌握
- linux更新模块,Linux下Nginx的安装、升级及动态添加模块
- OpenGL编程指南7:视图-
- 理解单片机系统—汇编语言
- Linux-在linux修改文件夹及其子文件夹的权限
- mdb文件取消隐藏_webshellphp隐藏技巧
- 《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.6节理解与记忆
- 计算机360u盘删除,如何删除U盘在电脑中的使用痕迹
- c语言选择结构训练试题,C语言临考练习试题
- 基于mybatis的数据库脱敏
- 联想台式电脑一键恢复后桌面没有计算机了,联想笔记本一键恢复功能使用教程...
- win7 64位虚拟机安装
- 【alibaba cloud】在macM1上用docker部署nacos集群
- 一个可直接使用的轻量级博客开源系统
- 表达式转换 (中缀转后缀表达式)
- Ubuntu 10.04 LTS 下 Android 4.1.2_r1 源代码的下载
- DSP程序开发与优化经验之四:TMS320C64x+ DSP------Using Cache
- centos6 trouble shooting
- 126篇殿堂级深度学习论文分类整理,从入门到应用