Leetcode 802. 找到最终的安全状态

news/2024/10/19 13:06:10

1.题目基本信息

1.1.题目描述

有一个有 n 个节点的有向图,节点按 0 到 n – 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。

如果一个节点没有连出的有向边,则该节点是 终端节点 。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点 。

返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

1.2.题目地址

https://leetcode.cn/problems/find-eventual-safe-states/description/

2.解题方法

2.1.解题思路

逆向拓扑排序法 / DFS+三色染色法

2.2.解题步骤

DFS+三色染色法

  • 第一步,定义并初始化各个节点的颜色。colors[i]==0,表示白色,还没有访问过;等于1,表示灰色,在递归栈中待着;等于2,黑色,安全的
  • 第二步,构建dfs递归函数。递归任务:返回节点node是否安全
  • 第三步,执行递归,将各个未访问的节点的颜色进行标记,并根据最终的标记颜色返回结果

逆向拓扑排序法

  • 第一步,构建逆向图
  • 第二步,拓扑排序
  • 第三步,将拓扑排序的节点升序排列

3.解题代码

Python代码(逆向拓扑排序法)

from collections import defaultdict,dequeclass Solution:# 逆向拓扑排序法def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:length=len(graph)# 第一步,构建逆向图reverseGraph={i:[] for i in range(length)}inDegrees=defaultdict(int)for i in range(length):for node in graph[i]:reverseGraph[node].append(i)inDegrees[i]+=1# 第二步,拓扑排序result=[]que=deque()for node in reverseGraph.keys():if inDegrees[node]==0:que.append(node)result.append(node)while que:node=que.popleft()for subNode in reverseGraph[node]:inDegrees[subNode]-=1if inDegrees[subNode]==0:que.append(subNode)result.append(subNode)# 第三步,将拓扑排序的节点升序排列result.sort()return result

Python代码(DFS+三色染色法)

class Solution:# DFS+三色染色法def eventualSafeNodes(self, graph: List[List[int]]) -> List[int]:length=len(graph)# 第一步,定义并初始化各个节点的颜色。colors[i]==0,表示白色,还没有访问过;等于1,表示灰色,在递归栈中待着;等于2,黑色,安全的colors=[0]*length# 第二步,构建dfs递归函数。递归任务:返回节点node是否安全def dfs(node):if colors[node]!=0:return colors[node]==2colors[node]=1for subNode in graph[node]:if not dfs(subNode):return Falsecolors[node]=2return True# 第三步,执行递归,将各个未访问的节点的颜色进行标记,并根据最终的标记颜色返回结果for i in range(length):if colors[i]==0:dfs(i)return [t for t in range(length) if colors[t]==2]

4.执行结果

在这里插入图片描述

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

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

相关文章

第35篇 C#文件夹加锁小工具

要想保护自己的文件夹内的信息不被别人看到,可以给文件加个锁【注意:加锁用的密码一定要记住】 用C#语言实现一个文件夹锁的程序,程序的基本原理是:用C#语言重命名文件夹,通过重命名使之成为windows安全文件的类标识符。具体的方法是为文件夹添加拓展名“.{2559a1f2-21d7-…

金属矿山电子封条系统

金属矿山电子封条系统的主要特点和作用如下:金属矿山电子封条系统通过电子封条的安装位置和追踪技术,金属矿山电子封条系统可以对煤矿进行实时监控,确保安全事件的及时发现和处理。金属矿山电子封条系统识别到运输设备启动运行 或者识别到运输设备运行工作状态下有煤、无煤转…

工业机器人维修保养|ABB机器人IRB 6700维修保养技巧

通过机器人维修保养服务定制合理的维修保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障。 一、ABB机器人IRB 6700日常检查与维护 外观检查:每日工作前后,应检查ABB机器人IRB 6700外观是否有明显的损伤、腐蚀或油漆剥落。特别注…

C++ 易踩坑总结以及小技巧

1. for循环中在栈上创建的对象可能具有相同的地址,进行指针操作时需注意;所以循环中最好使用new来创建指针并操作地址; for (int x : arr) {ClassName obj(); \\ it is like to have the same address in every loopClassName obj2 = new ClassName();std::cout<<&…

【转载】 蚂蚁集团骆骥谈如何打造下一代智能数据体系

【转载】 蚂蚁集团骆骥谈如何打造下一代智能数据体系 本文整理自2024外滩大会“Data+AI”见解论坛骆骥(蚂蚁集团数据平台与服务部负责人)的演讲实录在过去这两年时间,生成式人工智能在科技领域取得了重大的突破,海量的数据和庞大的算力相碰撞,推动了无数科技产品的创新。在…

2024.09.11星期三

今天学习了springboot的相关知识,由于自己使用原生的Maven经常出现tomcat配置 与hive数据库冲突的问题,因此选择了内置tomcat不需要自己配置也更加先进的springboot 确实也该学习一些新的技术不能总是局限于原生的javaweb了 以下是今天踩的一些坑 1.用IDEA创建springboot项目…

2024.09.11

今天主要继续学习了springboot的相关内容,在昨天实现了基础的登录功能后,今天对增删改查有了更深刻的认识 特别是通过连接hive,对于网页的getmapper和postmapper有了更深刻的认识,实现了基础的增删改查并且优化了 页面 repository包,其中建立了类,这个类就是用于继承JpaR…

2024-10-17_Thu_13:52 - 财富目标:求其上者得其中

2024-10-17_Thu_13:52 - 财富目标:求其上者得其中 ​​ 态势:攻与守有钱人玩金钱游戏是为了赢。穷人玩金钱游戏是为了不要疏。意念的力量很惊人!‍ 目标:求其上者得其中,求其中者得其下,求其下者无所得致富法则 如果你的目标是过得舒服就好,你就很可能永远也不会有钱。但…