Three-colour DFS
Time O(V + E) Space O(V)safe(u): if coloured, return colour == black. Mark grey; if any successor is unsafe, return false (leave grey). Else mark black.
import java.util.*;
class Solution {
private int[] state;
public List<Integer> eventualSafeNodes(int[][] graph) {
state = new int[graph.length];
List<Integer> out = new ArrayList<>();
for (int i = 0; i < graph.length; i++) if (safe(graph, i)) out.add(i);
return out;
}
private boolean safe(int[][] g, int u) {
if (state[u] != 0) return state[u] == 2;
state[u] = 1;
for (int v : g[u]) if (!safe(g, v)) return false;
state[u] = 2;
return true;
}
}Verdict: Each node is resolved once.