Back to all solutions

#2192 - All Ancestors of a Node in a Directed Acyclic Graph

Problem Description

You are given a positive integer n representing the number of nodes of a Directed Acyclic Graph (DAG). The nodes are numbered from 0 to n - 1 (inclusive).

You are also given a 2D integer array edges, where edges[i] = [fromi, toi] denotes that there is a unidirectional edge from fromi to toi in the graph.

Return a list answer, where answer[i] is the list of ancestors of the ith node, sorted in ascending order.

A node u is an ancestor of another node v if u can reach v via a set of edges.

Solution

/**
 * @param {number} n
 * @param {number[][]} edges
 * @return {number[][]}
 */
var getAncestors = function(n, edges) {
  const graph = Array.from({ length: n }, () => []);
  const ancestors = Array.from({ length: n }, () => new Set());

  for (const [from, to] of edges) {
    graph[to].push(from);
  }

  for (let i = 0; i < n; i++) {
    findAncestors(i);
  }

  return ancestors.map(set => [...set].sort((a, b) => a - b));

  function findAncestors(node) {
    if (ancestors[node].size > 0) return;

    for (const parent of graph[node]) {
      ancestors[node].add(parent);
      findAncestors(parent);
      for (const ancestor of ancestors[parent]) {
        ancestors[node].add(ancestor);
      }
    }
  }
};