Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Generador de orden topológico
Ordena los vértices de un grafo acíclico dirigido de modo que cada arista apunte hacia adelante
Selecciona un algoritmo y genera pasos para comenzar la visualización
La ordenación topológica produce un orden lineal de los vértices de un grafo acíclico dirigido (DAG) tal que cada arista apunta de un vértice anterior a uno posterior. Responde a la pregunta: ¿en qué orden pueden realizarse las tareas cuando algunas dependen de otras?
Existen dos enfoques estándar. El algoritmo de Kahn elimina repetidamente un vértice sin aristas entrantes, lo añade al orden y reduce el grado de entrada de sus vecinos; una cola contiene los vértices con grado de entrada cero. El enfoque DFS realiza una búsqueda en profundidad y emite los vértices en orden inverso a sus tiempos de finalización. Ambos se ejecutan en O(V + E). Si quedan vértices sin procesar (Kahn) o aparece una arista de retorno (DFS), el grafo tiene un ciclo y no existe orden válido.
El orden topológico planifica sistemas de compilación como Make y Gradle, resuelve el orden de instalación de paquetes, secuencia asignaturas con prerrequisitos, ordena la evaluación de celdas de hojas de cálculo y programa la ejecución de instrucciones en compiladores. Está entre las preguntas de entrevista de dificultad media más comunes sobre grafos dirigidos.
Dos formulaciones estándar, ambas lineales. Kahn avanza desde los nodos sin prerrequisitos; la versión con DFS trabaja hacia atrás desde los tiempos de finalización.
// Kahn: quita repetidamente un nodo sin aristas entrantes
calcular gradoEntrada[v] para cada vértice
cola = todos los vértices con gradoEntrada 0
orden = []
mientras la cola no esté vacía:
u = cola.sacar()
orden.añadir(u)
para cada arista (u, v):
gradoEntrada[v] -= 1
si gradoEntrada[v] == 0: cola.meter(v)
si orden.longitud < V: el grafo tiene un ciclo
// Variante DFS: inverso del orden de finalización
ejecutar DFS; apilar cada vértice al terminarlo
la pila, desapilada, es un orden topológico válidoKahn tiene una ventaja práctica que conviene conocer: como detecta el ciclo contando cuántos nodos logró emitir, los vértices sobrantes son exactamente los implicados en un ciclo o situados aguas abajo de él. Eso lo hace mucho más útil que un booleano cuando necesitas informar de qué dependencias son circulares.
Ejecuta Kahn sobre un pequeño grafo de dependencias de compilación, donde una arista X a Y significa que X debe compilarse antes que Y.
Grafo de ejemplo: Aristas dirigidas A a C, B a C, C a D y B a D.
Un orden válido es A, B, C, D. Fíjate en que B, A, C, D es igualmente válido: A y B no tienen prerrequisitos y su orden relativo no está restringido. El orden topológico no es único salvo que el grafo sea una única cadena, y por eso las pruebas deberían comprobar que cada arista apunta hacia adelante en lugar de comparar contra una secuencia esperada.
Tiempo: O(V + E) · Espacio: O(V)
Calcular todos los grados de entrada requiere un recorrido de todas las aristas, O(E). Cada vértice se encola y desencola exactamente una vez, O(V). Cada arista se examina exactamente una vez, cuando se emite su origen y se decrementa el grado de entrada del destino, otro O(E). El espacio guarda el vector de grados de entrada, la cola y la lista de salida, todos O(V). La variante con DFS tiene las mismas cotas, con la pila de recursión en lugar de la cola. Ninguna puede mejorarse, ya que cualquier algoritmo correcto debe leer todas las aristas para conocer las restricciones.
Kahn y DFS producen órdenes igualmente válidos. Elige según lo que necesites además de la ordenación.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Kahn (estilo BFS) | Quieres diagnóstico de ciclos, o el orden lexicográficamente menor mediante una cola de prioridad, o necesitas evitar recursión profunda. | O(V + E) |
| Orden de finalización con DFS | Ya estás ejecutando un DFS por otros motivos, o quieres la implementación más corta posible. | O(V + E) |
| SCC de Tarjan | El grafo tiene ciclos y quieres condensarlos en un DAG en lugar de rechazar la entrada. | O(V + E) |
| Camino más largo / CPM | Los nodos tienen duraciones y quieres el camino crítico. Es un orden topológico seguido de una pasada de programación dinámica. | O(V + E) |
Leer el artículo completo: Graph Algorithms in Coding Interviews
Algoritmos relacionados: Búsqueda en Profundidad, Detección de Ciclos, Método de la Ruta Crítica (CPM)