Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Buscador de componentes fuertemente conexas
Halla todas las componentes fuertemente conexas en un solo recorrido en profundidad
Selecciona un algoritmo y genera pasos para comenzar la visualización
El algoritmo de Tarjan halla todas las componentes fuertemente conexas (SCC) de un grafo dirigido en una sola búsqueda en profundidad. Una componente fuertemente conexa es un conjunto maximal de vértices donde cada vértice puede alcanzar a todos los demás por caminos dirigidos.
Durante una DFS el algoritmo asigna a cada nodo un índice de descubrimiento y un valor low-link, el menor índice alcanzable desde su subárbol usando a lo sumo una arista de retorno. Los nodos se apilan al visitarse. Cuando un nodo termina con un low-link igual a su propio índice es la raíz de una SCC, y la pila se vacía hasta ese nodo para emitir la componente. Todo ocurre en O(V + E) en una sola pasada.
La descomposición en SCC condensa un grafo dirigido en un grafo acíclico dirigido, primer paso para resolver 2-SAT, analizar grafos de llamadas en compiladores, detectar bloqueos y hallar ciclos de dependencia mutua en gestores de paquetes u hojas de cálculo. Los valores low-link de Tarjan son un tema clásico y difícil de entrevista.
Un solo DFS, una pila y dos números por vértice. La idea clave es que toda componente fuertemente conexa tiene una raíz única: el vértice de la componente que se descubre primero.
conectarFuerte(u):
desc[u] = low[u] = ++tiempo
pila.meter(u); enPila[u] = verdadero
para cada arista (u, v):
si v no visitado:
conectarFuerte(v)
low[u] = min(low[u], low[v])
si no, si enPila[v]:
low[u] = min(low[u], desc[v])
// si no: v está en una SCC ya cerrada, se ignora
si low[u] == desc[u]: // u es raíz de una SCC
sacar de la pila hasta u incluido
ese conjunto extraído es una SCCLa comprobación enPila es lo que separa a Tarjan de un esquema ingenuo de low-link. Una arista hacia un vértice visitado que ya pertenece a una componente cerrada no dice nada sobre tu propia componente y debe omitirse; incluirla fusionaría dos SCC genuinamente distintas. Fíjate además en la asimetría: una arista de árbol incorpora low[v], una arista de retroceso incorpora desc[v], y confundirlas es el otro fallo clásico.
Ejecuta Tarjan sobre un grafo dirigido que contiene un ciclo de tres vértices, un ciclo de dos y un vértice que no pertenece a ninguno.
Grafo de ejemplo: Aristas dirigidas A a B, B a C, C a A, B a D, D a E, E a D, y C a F.
Los low-link finales son A 1, B 1, C 1, F 4, D 5, E 5, y las componentes salen en el orden {F}, luego {D, E}, luego {A, B, C}. Hay dos cosas que merece la pena notar. Las componentes se emiten en orden topológico inverso de la condensación, y por eso Tarjan es el primer paso habitual para 2-SAT. Y F, alcanzable desde el ciclo pero sin camino de vuelta, forma correctamente su propia componente en lugar de quedar absorbido por {A, B, C}.
Tiempo: O(V + E) · Espacio: O(V)
Una única búsqueda en profundidad visita cada vértice una vez y examina cada arista dirigida exactamente una vez, lo que da O(V + E). Cada vértice se mete y se saca de la pila una sola vez, así que las operaciones de pila suman O(V) en toda la ejecución. El estado adicional es el tiempo de descubrimiento, el low-link y la marca de en pila por vértice, más la pila de recursión, todo O(V). Tarjan hace esto en una sola pasada, mientras que Kosaraju necesita dos recorridos completos más la construcción del grafo transpuesto, razón por la cual Tarjan suele preferirse en la práctica aunque ambos sean lineales.
Los tres algoritmos lineales de SCC tienen el mismo coste asintótico, así que la elección va de constantes, memoria y facilidad de implementar sin errores.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Kosaraju | Quieres el algoritmo más fácil de explicar e implementar. Dos pasadas de DFS más una transposición. | O(V + E), dos pasadas |
| SCC basado en caminos | Quieres un algoritmo de una pasada como Tarjan pero con dos pilas en lugar de aritmética de low-link. | O(V + E) |
| Union-Find | El grafo es no dirigido. Las componentes conexas son mucho más fáciles que las fuertemente conexas. | O(E·α(V)) |
| Condensación más orden topológico | Quieres el DAG de componentes y no solo las componentes. Tarjan ya las emite en orden topológico inverso. | O(V + E) |
Algoritmos relacionados: Algoritmo de Kosaraju (CFC), Búsqueda en Profundidad, Ordenación Topológica