0


【C++BFS】802. 找到最终的安全状态

本文涉及知识点

C++BFS算法

LeetCode802. 找到最终的安全状态

有一个有 n 个节点的有向图,节点按 0 到 n - 1 编号。图由一个 索引从 0 开始 的 2D 整数数组 graph表示, graph[i]是与节点 i 相邻的节点的整数数组,这意味着从节点 i 到 graph[i]中的每个节点都有一条边。
如果一个节点没有连出的有向边,则该节点是 终端节点 。如果从该节点开始的所有可能路径都通向 终端节点 ,则该节点为 安全节点 。
返回一个由图中所有 安全节点 组成的数组作为答案。答案数组中的元素应当按 升序 排列。

示例 1:

在这里插入图片描述

输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]
解释:示意图如上。
节点 5 和节点 6 是终端节点,因为它们都没有出边。
从节点 2、4、5 和 6 开始的所有路径都指向节点 5 或 6 。
示例 2:

输入:graph = [[1,2,3,4],[1,2],[3,4],[0,4],[]]
输出:[4]
解释:
只有节点 4 是终端节点,从节点 4 开始的所有路径都通向节点 4 。

提示:

n == graph.length
1 <= n <= 104
0 <= graph[i].length <= n
0 <= graph[i][j] <= n - 1
graph[i] 按严格递增顺序排列。
图中可能包含自环。
图中边的数目在范围 [1, 4 * 104] 内。

C++BFS

本题本质是拓扑排序,如果有相应的模板,则用模板,否则用BFS。
预处理:graph记录的是后续的节点,计算vPre前续节点。
BFS的状态:leves[0]记录所有终端节点,leves[i]记录所有边都指向leves[0…i-1]的节点。空间复杂度:O(n)。
BFS的后续状态:cur所有前置节点中,扣掉指向leves[0…i-1]后,出度为0的节点。时间复杂度:O(m),m是边数。注意:不能有重边。
BFS的初始状态:所有终端节点。
BFS的返回值:用一维数组代替二维数组,并排序。
BFS的重复处理:数组出重。

代码

核心代码

classSolution{public:
            vector<int>eventualSafeNodes(vector<vector<int>>& graph){constint N = graph.size();
                vector<vector<int>>vPre(N);
                vector<int>vOut(N);for(int i =0; i < graph.size(); i++){for(constauto& next : graph[i]){
                        vPre[next].emplace_back(i);}
                    vOut[i]= graph[i].size();}
                vector<bool>vis(N);
                
                vector<int> v;auto Add =[&](int node){if(vis[node]){return;}if(0!= vOut[node]){return;}    
                    v.emplace_back(node);
                    vis[node]=true;};for(int i =0; i < graph.size(); i++){if(graph[i].empty()){Add(i);}}for(int i =0; i < v.size(); i++){for(constint ip : vPre[v[i]]){
                        vOut[ip]--;Add(ip);}}sort(v.begin(), v.end());return v;}};

单元测试

TEST_METHOD(TestMethod1){
            graph ={{}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{0}, res);}TEST_METHOD(TestMethod2){
            graph ={{0}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{}, res);}TEST_METHOD(TestMethod3){
            graph ={{},{}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{0,1}, res);}TEST_METHOD(TestMethod4){
            graph ={{1},{}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{0,1}, res);}TEST_METHOD(TestMethod5){
            graph ={{},{0}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{0,1}, res);}TEST_METHOD(TestMethod6){
            graph ={{1},{0}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{}, res);}TEST_METHOD(TestMethod11){
            graph ={{1,2},{2,3},{5},{0},{5},{},{}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{2,4,5,6}, res);}TEST_METHOD(TestMethod12){
            graph ={{1,2,3,4},{1,2},{3,4},{0,4},{}};auto res =Solution().eventualSafeNodes(graph);AssertEx(vector<int>{4}, res);}


如果有不明白的,请加文末QQ群。如果要打包下载源码(CSDN下载频道偶尔审核不通过,原因未知),也请加QQ群。

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等

课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例。重视操作有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙,那算法就是他的是睛失败+反思=成功

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本**

算法C++**实现。

标签: c++ 宽度优先 算法

本文转载自: https://blog.csdn.net/he_zhidan/article/details/140491627
版权归原作者 闻缺陷则喜何志丹 所有, 如有侵权,请联系我们删除。

“【C++BFS】802. 找到最终的安全状态”的评论:

还没有评论