leetcode 802. 找到最终的安全状态(Find Eventual Safe States)

 2023-09-10 阅读 25 评论 0

摘要:目录 题目描述:示例:解法: 题目描述: 在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。 现在, 如果我们最后能走到终点,那么我们的起始节点是最终安全的。

目录

  • 题目描述:
  • 示例:
  • 解法:

题目描述:

在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。

现在, 如果我们最后能走到终点,那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K, 无论选择从哪里开始行走, 我们走了不到 K 步后必能停止在一个终点。

哪些节点最终是安全的? 结果返回一个有序的数组。

该有向图有 N 个节点,标签为 0, 1, ..., N-1, 其中 N 是 graph 的节点数. 图以以下的形式给出: graph[i] 是节点 j 的一个列表,满足 (i, j) 是图的一条有向边。

示例:

输入:graph = [[1,2],[2,3],[5],[0],[5],[],[]]
输出:[2,4,5,6]
这里是上图的示意图。

leetcode答案?1615582-20190524101728861-824671677.png

提示:

  • graph 节点数不超过 10000.
  • 图的边数不会超过 32000.
  • 每个 graph[i] 被排序为不同的整数列表, 在区间 [0, graph.length - 1] 中选取。

解法:

class Solution {
public:vector<int> eventualSafeNodes(vector<vector<int>>& graph) {vector<int> res;int sz = graph.size();vector<int> degree(sz, 0);unordered_map<int, vector<int>> redge;for(int i=0; i<sz; i++){redge[i] = {};}stack<int> leaf;for(int i=0; i<sz; i++){degree[i] += graph[i].size();if(degree[i] == 0){leaf.push(i);}for(int val : graph[i]){redge[val].push_back(i);}}while(!leaf.empty()){int node = leaf.top();leaf.pop();res.push_back(node);for(int nxt : redge[node]){degree[nxt]--;if(degree[nxt] == 0){leaf.push(nxt);}}}sort(res.begin(), res.end());return res;}
};

转载于:https://www.cnblogs.com/zhanzq/p/10916472.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/36095.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息