【题目】
传送门
【思路】
就是拓扑排序的简化版,一般思路是先找到所有出度为0的节点,再找出能够到达这些节点的节点。
【代码】
class Solution {
public:
vector<int> eventualSafeNodes(vector<vector<int>>& graph)
{
vector<int> res;//存放结果
int m=graph.size();
vector<int>degree(m,0);//degree[i]表示节点i的出度
vector<vector<int>> tem(m);
for(int i=0;i<m;i++)
{
degree[i]=graph[i].size();
for(auto j:graph[i])
{
tem[j].push_back(i);//表示j节点的入度
}
}
queue<int> que;
for(int i=0;i<m;i++)
{
if(graph[i].size()==0)
que.push(i);
}
while(!que.empty())
{
int i=que.front();
que.pop();
res.push_back(i);
for(auto j:tem[i])
{
degree[j]--;
if(degree[j]==0)
que.push(j);
}
}
set<int>a(res.begin(),res.end());//set容器筛去重复节点并排序
res.assign(a.begin(),a.end());
return res;
}
};