今天看女乒天团的直播,她们好有趣啊

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日相关推荐

  1. 淘宝618每日一猜6月8日答案-明星孙怡最喜欢的显瘦单品?

    淘宝6月8日每日一猜答案是什么?,接下来也会给大家来介绍一下6月8日淘宝大赢家每日一猜的答案. 淘宝每日一猜6月8日答案分享 活动问题:明星孙怡最喜欢的显瘦单品? 活动答案:轻塑鲨鱼裤 今天的题目是和 ...

  2. 淘宝618每日一猜6月6日答案-甄嬛在横店哪里参加的选秀?

    淘宝6月6日每日一猜答案是什么?,接下来也会给大家来介绍一下6月6日淘宝大赢家每日一猜的答案. 淘宝每日一猜6月6日答案分享 活动问题:甄嬛在横店哪里参加的选秀 活动答案:[交泰殿] 还有打开手机淘宝 ...

  3. 第五人格七月三日服务器维护要多久,第五人格微信每日一题7月3日答案是什么_今天有四个人来访过_玩游戏网...

    <第五人格>2021独特时装体验卡礼包 第五人格2021独特时装体验卡礼包怎么获得?礼包中有独特时装体验卡.角色体验卡等奖励,小编这里就分享一下第五人格2021独特时装体验卡礼包领取地址, ...

  4. PMP模拟试题每日5题(5月5日)

    摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.你的敏捷团队与一个开发商 ...

  5. PMP模拟试题每日5题(5月7日)

    摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.产品开发团队采用敏捷开发 ...

  6. PMP模拟试题每日5题(4月28日)

    摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.项目需要委托第三方研发一 ...

  7. PMP模拟试题每日5题(4月22日)

    ​​​​摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.项目技术团队强烈 ...

  8. PMP模拟试题每日5题(5月6日)

    摘要:为帮助即将参加PMP®考试的考生快速熟悉PMP®试题.熟练掌握PMP®相关考点知识,本专栏将每日推出5道PMP®模拟试题(包含试题原题和答案解析),快来进行练习吧! 1.沟通对项目成功非常关键. ...

  9. 【备战秋招】每日一题:4月23日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

    为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第三题-农村大亨 在线评测链接:P1247 题目内容 塔子哥是一个喜欢种田类的游戏的人,他觉得这样的游戏可以让他体验到农民的乐趣,同时 ...

最新文章

  1. IHttpModule
  2. python分析excel数据-对照Excel使用Python进行数据分析,更快掌握
  3. linux更新模块,Linux下Nginx的安装、升级及动态添加模块
  4. OpenGL编程指南7:视图-
  5. 理解单片机系统—汇编语言
  6. Linux-在linux修改文件夹及其子文件夹的权限
  7. mdb文件取消隐藏_webshellphp隐藏技巧
  8. 《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.6节理解与记忆
  9. 计算机360u盘删除,如何删除U盘在电脑中的使用痕迹
  10. c语言选择结构训练试题,C语言临考练习试题
  11. 基于mybatis的数据库脱敏
  12. 联想台式电脑一键恢复后桌面没有计算机了,联想笔记本一键恢复功能使用教程...
  13. win7 64位虚拟机安装
  14. 【alibaba cloud】在macM1上用docker部署nacos集群
  15. 一个可直接使用的轻量级博客开源系统
  16. 表达式转换 (中缀转后缀表达式)
  17. Ubuntu 10.04 LTS 下 Android 4.1.2_r1 源代码的下载
  18. DSP程序开发与优化经验之四:TMS320C64x+ DSP------Using Cache
  19. centos6 trouble shooting
  20. 126篇殿堂级深度学习论文分类整理,从入门到应用

热门文章

  1. linux系统LVM磁盘扩容
  2. Eclipse中断点调试详解
  3. 中兴通讯与中国电信,联合发布家端新品
  4. 什么是http,什么是tomcat,什么是Servlet
  5. SQL 函数YEAR MONTH 查找特定日期
  6. 三言|打好日志,不要指望复现来查找原因
  7. Swift5.2 Control Advertisement(广告)
  8. 软件研发和嵌入式软件研发面试经历
  9. 计算机应用期刊主编终审通过率,主编终审被录用的可能性有多少?
  10. 怎样从毕业生成为职业人