Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Buscador de ciclos en el grafo
Detecta ciclos en grafos dirigidos y no dirigidos
Selecciona un algoritmo y genera pasos para comenzar la visualización
La detección de ciclos determina si un grafo contiene un ciclo, un camino que regresa a su vértice inicial. Las técnicas difieren entre grafos dirigidos, donde los ciclos significan dependencias circulares, y no dirigidos, donde cualquier arista extra más allá de un árbol crea un ciclo.
En grafos dirigidos, DFS clasifica las aristas: una arista de retorno a un vértice aún en la pila de recursión prueba un ciclo, rastreado con tres estados de vértice (no visitado, en proceso, hecho). En grafos no dirigidos, DFS halla un ciclo cuando encuentra un vértice visitado distinto de su padre, y Union-Find detecta uno cuando una arista une dos vértices ya en el mismo conjunto. Todos los enfoques se ejecutan en O(V + E), con Union-Find casi constante por arista.
La detección de ciclos previene bloqueos en sistemas operativos, atrapa importaciones circulares en herramientas de compilación y gestores de paquetes, valida hojas de cálculo y definiciones de flujo de trabajo, y es el guardián de la ordenación topológica. La variante de la liebre y la tortuga de Floyd para listas enlazadas es una de las preguntas de entrevista más solicitadas.
Los grafos dirigidos y no dirigidos necesitan pruebas realmente distintas. La versión dirigida sigue la pila de recursión; la no dirigida sigue al padre.
// Dirigido: DFS de tres colores
BLANCO = no visitado, GRIS = en la pila, NEGRO = terminado
tieneCiclo(u):
color[u] = GRIS
para cada vecino v de u:
si color[v] == GRIS: devolver verdadero // retroceso
si color[v] == BLANCO y tieneCiclo(v):
devolver verdadero
color[u] = NEGRO
devolver falso
// No dirigido: DFS que arrastra el padre
tieneCiclo(u, padre):
visitados.añadir(u)
para cada vecino v de u:
si v == padre: continuar
si v en visitados: devolver verdadero
si tieneCiclo(v, u): devolver verdadero
devolver falsoLa distinción importa más de lo que parece. En un grafo dirigido, alcanzar un nodo NEGRO es una arista cruzada y está perfectamente libre de ciclos, así que la comprobación ingenua de visitados informa de ciclos que no existen. En un grafo no dirigido, omitir al padre es lo que impide que cada arista se lea como un ciclo de dos nodos.
Ejecuta la prueba dirigida de tres colores sobre un grafo que contiene un ciclo y una arista cruzada engañosa.
Grafo de ejemplo: Aristas dirigidas A a B, A a C, B a D, C a D y D a B.
El grafo sí contiene un ciclo, B a D a B, hallado mediante la prueba GRIS. El camino A a C a D no es un ciclo, y solo la distinción de colores separa ambos casos.
Tiempo: O(V + E) · Espacio: O(V)
Ambas variantes son un único DFS con trabajo extra constante por arista, así que el coste es el del recorrido. El vector de colores o el conjunto de visitados es O(V), más O(V) de pila de recursión. La alternativa con Union-Find para grafos no dirigidos corre en O(E alfa(V)), efectivamente lineal, y es preferible cuando las aristas llegan de una en una y quieres rechazar la arista que cierra el ciclo en el momento en que aparece, sin volver a recorrer el grafo entero.
Elige la prueba que corresponda tanto a la dirección de tus aristas como a si el grafo es estático o llega por partes.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Union-Find | No dirigido y las aristas llegan de forma incremental. Rechaza la arista que cierra el ciclo en tiempo casi constante al añadirla. | O(E·α(V)) |
| Orden topológico de Kahn | Dirigido, y además quieres la ordenación cuando no hay ciclo. Los nodos sobrantes al vaciarse la cola son exactamente la parte cíclica. | O(V + E) |
| SCC de Tarjan | Dirigido, y quieres saber qué nodos están en ciclos y no solo si existe alguno. Cualquier componente de tamaño mayor que uno es un ciclo. | O(V + E) |
| Detección de ciclos de Floyd | Un grafo funcional o una lista enlazada donde cada nodo tiene exactamente un sucesor. Usa O(1) de memoria. | O(n) |
Leer el artículo completo: Graph Algorithms in Coding Interviews
Algoritmos relacionados: Búsqueda en Profundidad, Ordenación Topológica, Algoritmo de Kruskal