如果一个节点的出度为0,则该节点是安全的;
如果一个节点的所有下一节点都是安全的,则该节点是安全的;
发现传递性,从所有初始为安全的节点(出度为0)的节点出发,往上找进入该安全节点的节点,并将新节点出度减一;
如果新节点的出度为0了,说明也成安全节点了,知道无新增安全节点;
所有出度为0的节点就是安全节点;
class Solution {
public:
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
int n = graph.size();
vector<int> edge(n, 0);
vector<int> ans;
vector<vector<int>> fa(n);
queue<int> q;
for(int i = 0; i < n; i++) {
for(auto j : graph[i]) {
fa[j].push_back(i);
edge[i]++;
}
if(edge[i] == 0) q.push(i);
}
while(!q.empty()) {
int now = q.front(); q.pop();
for(auto next : fa[now]) if(--edge[next] == 0) q.push(next);
}
for(int i = 0; i < n; i++) if(edge[i] == 0) ans.push_back(i);
return ans;
}
};