LeetCode 210 — Course Schedule II

Noveno problema del patrón Graphs. Extensión de 207-course-schedule: en lugar de bool, devolver el orden en que tomar los cursos. Es topological sort clásico.

Enunciado

Como LC 207 pero devuelve un orden válido de cursos, o [] si imposible.


Solución — Kahn’s algorithm

from collections import defaultdict, deque
 
class Solution:
    def findOrder(self, numCourses, prerequisites):
        graph = defaultdict(list)
        in_degree = [0] * numCourses
        for a, b in prerequisites:
            graph[b].append(a)
            in_degree[a] += 1
 
        q = deque(i for i in range(numCourses) if in_degree[i] == 0)
        order = []
        while q:
            course = q.popleft()
            order.append(course)
            for nb in graph[course]:
                in_degree[nb] -= 1
                if in_degree[nb] == 0:
                    q.append(nb)
        return order if len(order) == numCourses else []

Análisis: O(V + E).

Topological sort en una frase

“Procesa los nodos sin prerequisites pendientes; al hacerlo, decrementa el in-degree de los nodos que dependen de él; si alguno llega a 0, está listo”.

Funciona porque BFS por niveles de in-degree garantiza que un nodo solo se procesa después de todos sus prerrequisitos.


Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode