Aprendizaje Interactivo de Teoría de Grafos
Aprendizaje Interactivo de Teoría de Grafos
Guest User
Using app without sign in
Buscador de caminos y circuitos eulerianos
Halla un recorrido que usa cada arista exactamente una vez en grafos no dirigidos
Selecciona un algoritmo y genera pasos para comenzar la visualización
Un camino euleriano recorre cada arista de un grafo exactamente una vez; un circuito euleriano lo hace y regresa a su inicio. Leonhard Euler fundó la teoría de grafos en 1736 al demostrar que los Siete Puentes de Konigsberg no admiten tal recorrido.
La existencia es fácil de comprobar: un grafo no dirigido conexo tiene un circuito euleriano exactamente cuando todo vértice tiene grado par, y un camino euleriano cuando exactamente cero o dos vértices tienen grado impar. El algoritmo de Hierholzer construye el recorrido en O(E): seguir aristas no usadas hasta regresar al inicio, y luego insertar repetidamente ciclos de desvío desde vértices que aún tienen aristas sin usar.
Los caminos eulerianos resuelven problemas de inspección de rutas como el quitanieves, el barrido de calles y el reparto postal, reconstruyen secuencias de ADN a partir de k-meros en bioinformática y generan secuencias de De Bruijn. La prueba de existencia basada en la paridad es una pregunta de entrevista clásica que lo distingue del problema hamiltoniano, mucho más difícil.
La prueba de existencia es pura cuenta y ocupa una sola pasada. Solo si esa prueba tiene éxito construyes el recorrido, usando Hierholzer en lugar de retroceso ingenuo.
// Existencia, grafo no dirigido y conexo:
// 0 vértices de grado impar -> circuito euleriano
// 2 vértices de grado impar -> camino euleriano
// cualquier otro caso -> ninguno de los dos
Hierholzer(grafo, inicio):
pila = [inicio]; recorrido = []
mientras la pila no esté vacía:
u = pila.cima
si u tiene alguna arista incidente sin usar (u,v):
marcar esa arista como usada
pila.meter(v)
si no:
recorrido.añadir(pila.sacar())
invertir(recorrido)Hierholzer funciona porque nunca tiene que adivinar. Camina hasta quedarse atascado, lo que en un grafo con todos los grados pares solo puede ocurrir de vuelta en el inicio, y luego injerta desvíos desde los vértices que aún tienen aristas sin usar. Cada vértice se entra y se sale el mismo número de veces, que es exactamente lo que garantiza el grado par, así que las piezas siempre se funden en un único recorrido cerrado.
Construye un circuito euleriano sobre dos triángulos que comparten un único vértice, tomando los vecinos por orden alfabético.
Grafo de ejemplo: Aristas no dirigidas A-B, B-C, C-A formando un triángulo, y C-D, D-E, E-C formando un segundo, unidos por C.
El circuito euleriano es A a B a C a D a E a C a A, usando las seis aristas exactamente una vez y regresando al inicio. Fíjate en que C aparece dos veces en el recorrido, algo permitido y esperado: un recorrido euleriano puede revisitar vértices libremente, lo único que no puede es reutilizar una arista. Esa es toda la diferencia con un camino hamiltoniano, que visita cada vértice una vez y no se preocupa por las aristas.
Tiempo: O(V + E) · Espacio: O(V + E)
El recuento de grados es una pasada sobre las aristas con O(E), y la comprobación de conectividad es un recorrido con O(V + E). Hierholzer mete y saca cada aparición de vértice una vez y marca cada arista como usada exactamente una vez, así que es O(E) siempre que cada vértice mantenga un puntero dentro de su lista de adyacencia en lugar de volver a escanearla desde el principio. Sin ese puntero, la búsqueda interior degrada a O(V·E). El espacio son las marcas de aristas usadas más la pila y el recorrido, que guardan O(E) entradas. Merece la pena señalar el contraste con los caminos hamiltonianos: el euleriano es lineal, el hamiltoniano es NP-completo, y la razón es puramente que las aristas se pueden contar localmente por grado y los vértices no.
Los problemas eulerianos son fáciles; los hamiltonianos, superficialmente parecidos, no lo son. Comprueba cuál tienes en realidad.
| Alternativa | Prefiérela cuando | Coste |
|---|---|---|
| Camino hamiltoniano | Debes visitar cada VÉRTICE una vez en lugar de cada arista. Es NP-completo, así que se aplican métodos completamente distintos. | exponencial |
| Problema del cartero chino | Hay vértices de grado impar pero aún quieres una ruta cerrada que cubra todas las aristas, permitiendo repeticiones al mínimo coste. | O(V^3) |
| Algoritmo de Fleury | Quieres construir un recorrido sin pila. Conceptualmente más simple pero más lento, ya que evita los puentes comprobándolos. | O(E^2) |
| Grafos de De Bruijn | Ensamblaje de genomas y similares, donde los caminos eulerianos en un grafo de De Bruijn reconstruyen una secuencia. | O(V + E) |
Leer el artículo completo: Eulerian Paths and Circuits
Algoritmos relacionados: Camino Hamiltoniano, Búsqueda en Profundidad