class Solution {
public:
bool vis[40005];//vis[i]表示从节点i开始的所有可能路径是否可以到达终端节点
vector<int>regraph[40005];
map<int,int>mp;
bool id_num[40005];
bool dfs(vector<vector<int>>& graph,int st)
{
if(mp[st] || vis[st])//如果到达终端节点或者vis[i]已经为true
{
return true;
}
if(id_num[st])//如果已经访问过,直接返回结果
{
return vis[st];
}
id_num[st]=true;
for(int i=0;i<graph[st].size();i++)
{
int y=graph[st][i];
if(!id_num[y])//如果节点y没有被访问过
{
if(dfs(graph,y))
{
vis[y]=true;
}
else{
vis[st]=false;
return false;
}
}
else{//如果节点y被访问过,且vis[y]的结果为false,那么可以得到 vis[st]=false;
if(!vis[y])
{
vis[st]=false;
return false;
}
}
}
vis[st]=true;
id_num[st]=true;
return true;
}
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
vector<int>res;
memset(vis,false,sizeof(vis));
int n=graph.size();
for(int i=0;i<graph.size();i++)
{
if(graph[i].size()==0)
{
mp[i]=1;
}
}
for(int i=0;i<graph.size();i++)
{
if(vis[i])
{
res.push_back(i);
}
else{
if(dfs(graph,i))
{
res.push_back(i);
}
}
}
return res;
}
};