Find Eventual Safe States

MediumDepth-First SearchBreadth-First SearchGraphTopological Sort

Solution

import { range } from '@algorithm/lib';
 
export function eventualSafeNodes(graph: number[][]): number[] {
  const n = graph.length;
  const visited = new Array<boolean>(n).fill(false);
  const inStack = new Array<boolean>(n).fill(false);
 
  const dfs = (node: number): boolean => {
    if (inStack[node]) {
      return true;
    }
    if (visited[node]) {
      return false;
    }
    visited[node] = true;
    inStack[node] = true;
    for (const neighbor of graph[node]) {
      if (dfs(neighbor)) {
        return true;
      }
    }
    inStack[node] = false;
    return false;
  };
 
  for (const node of range(n)) {
    dfs(node);
  }
 
  return [...range(n)].filter((node) => !inStack[node]);
}