class Solution {
public:
void dfs(int node, vector<vector<int>>& graph, vector<bool>& safe, vector<bool>& vis)
{
if(vis[node]) return;
vis[node] = true;
if(graph[node].size() == 0)
{
safe[node] = true;
}
bool res = true;
for(auto v : graph[node])
{
dfs(v, graph, safe, vis);
res &= safe[v];
}
safe[node] = res;
}
vector<int> eventualSafeNodes(vector<vector<int>>& graph) {
vector<bool> safe(graph.size(), false), vis(graph.size(), false);
int n = graph.size();
for(int i = 0; i < n; i++)
{
dfs(i, graph, safe, vis);
}
vector<int> ans;
for(int i = 0; i < n; i++)
{
if(safe[i]) ans.push_back(i);
}
return ans;
}
};