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

本文涉及知识点

C++BFS算法

LeetCode802. 找到最终的安全状态

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

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

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

示例 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 <= graphi.length <= n

0 <= graphij <= n - 1

graphi 按严格递增顺序排列。

图中可能包含自环。

图中边的数目在范围 1, 4 \* 10^4^ 内。

C++BFS

本题本质是拓扑排序,如果有相应的模板,则用模板,否则用BFS。

预处理:graph记录的是后续的节点,计算vPre前续节点。

BFS的状态:leves0记录所有终端节点,levesi记录所有边都指向leves0...i-1的节点。空间复杂度:O(n)。

BFS的后续状态:cur所有前置节点中,扣掉指向leves0...i-1后,出度为0的节点。时间复杂度:O(m),m是边数。注意 :不能有重边。

BFS的初始状态:所有终端节点。

BFS的返回值:用一维数组代替二维数组,并排序。

BFS的重复处理:数组出重。

代码

核心代码

cpp 复制代码
class Solution {
		public:
			vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
				const int N = graph.size();
				vector<vector<int>> vPre(N);
				vector<int> vOut(N);
				for (int i = 0; i < graph.size(); i++) {
					for (const auto& 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 (const int ip : vPre[v[i]]) {
						vOut[ip]--;
						Add(ip);
					}
				}
				sort(v.begin(), v.end());
				return v;
			}
		};

单元测试

cpp 复制代码
		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++**实现。

相关推荐
akinggw9 分钟前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck24 分钟前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
小郎君65830 分钟前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
JJJennie7771 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚1 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
专注仿真1 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练
FII工业富联科技服务1 小时前
多智能体如何进入制造现场?从业务协同到数字孪生验证
大数据·人工智能·算法·机器人·制造·数字孪生
≮傷£≯√2 小时前
httpserver_QNetWorkClient
算法
Evand J2 小时前
【PMSM例程11】永磁同步电机(PMSM)基于UKF的转速与转子位置估计。附下载链接
算法·matlab·卡尔曼滤波·永磁同步电机·ukf·pmsm·位置估计
货拉拉技术2 小时前
记忆即智能:重构对话式AI Agent认知基座的四层渐进式记忆与自进化系统
人工智能·算法