赞
踩
在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。
现在, 如果我们最后能走到终点,那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 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]
这里是上图的示意图。
提示:
我们进行反向拓扑排序,也就是改变边的方向后进行拓扑排序。显然,在拓扑序列中的节点就是安全节点。详细过程见代码
vector<int> eventualSafeNodes(vector<vector<int>>& graph) { int n = graph.size(); vector<int> degree(n,0); vector<int> visit(n,0); unordered_map<int,vector<int>> reGraph; for(int i=0; i<n; i++){ //反向构造图 degree[i] = graph[i].size(); for(int j=0; j<degree[i]; j++){ reGraph[graph[i][j]].push_back(i); } } queue<int> q; vector<int> ans; for(int i=0; i<n; i++){ //初始起点,也就是入度为0的点 if(degree[i] == 0){ q.push(i); visit[i] = 1; } } int size; while(!q.empty()){ size = q.size(); while(size--){ int now = q.front(); q.pop(); ans.push_back(now); for(int i=0; i<reGraph[now].size(); i++){ //删除该节点,它指向的点的入度会-1 degree[reGraph[now][i]]--; //cout<<reGraph[now][i]<<" "<<degree[reGraph[now][i]]<<endl; } } for(int i=0; i<n; i++){ if(!visit[i] && degree[i] == 0){ q.push(i); visit[i] = 1; } } } sort(ans.begin(),ans.end()); return ans; }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-eventual-safe-states
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。