class
Solution {
boolean
dfs(
int
u, List<List<Integer> > adj,
boolean
[] is_visited,
boolean
[] in_stack,
boolean
[] nodes_present_in_cycle)
{
is_visited[u] =
true
;
in_stack[u] =
true
;
for
(
int
v : adj.get(u)) {
if
(!is_visited[v]) {
boolean
is_cycle_present
= dfs(v, adj, is_visited, in_stack,
nodes_present_in_cycle);
if
(is_cycle_present) {
return
nodes_present_in_cycle[u] =
true
;
}
}
else
if
(is_visited[v] && in_stack[v]) {
return
nodes_present_in_cycle[u] =
true
;
}
}
in_stack[u] =
false
;
return
false
;
}
List<Integer>
eventualSafeNodes(
int
V, List<List<Integer> > adj)
{
List<Integer> safeNodes =
new
ArrayList<>();
boolean
[] is_visited =
new
boolean
[V];
boolean
[] in_stack =
new
boolean
[V];
boolean
[] nodes_present_in_cycle =
new
boolean
[V];
for
(
int
i =
0
; i < V; i++) {
if
(!is_visited[i]) {
dfs(i, adj, is_visited, in_stack,
nodes_present_in_cycle);
}
}
for
(
int
i =
0
; i < V; i++) {
if
(!nodes_present_in_cycle[i]) {
safeNodes.add(i);
}
}
return
safeNodes;
}
};