Topological Sort

Trees & Graphs

Signal

Prerequisites, ordering, can-you-finish, dependencies

Template

Indegree + queue (Kahn); leftovers mean a cycle.

Worked example (1)

#14

Topological Sort

Topological Sort (Kahn's)

Given a number of courses and prerequisite pairs, decide whether all courses can be completed.

function canFinish(numCourses: number, prerequisites: number[][]): boolean {
  const adj: number[][] = Array.from({ length: numCourses }, () => []);
  const indegree = new Array<number>(numCourses).fill(0);
  for (const [course, prereq] of prerequisites) { adj[prereq].push(course); indegree[course]++; }
  const queue: number[] = [];
  for (let i = 0; i < numCourses; i++) if (indegree[i] === 0) queue.push(i);
  let head = 0, done = 0;          // index pointer, not shift() (O(1) dequeue)
  while (head < queue.length) {
    const node = queue[head++];
    done++;
    for (const nb of adj[node]) if (--indegree[nb] === 0) queue.push(nb);
  }
  return done === numCourses;
}
Insight

"Can you finish?" is really "is this dependency graph acyclic?"