39. Grafos eulerianos

Un recorrido euleriano utiliza cada arista exactamente una vez. La existencia de un camino o circuito de este tipo puede decidirse mediante conectividad y paridad de grados.

39.1 Introducción

Los recorridos eulerianos surgieron del problema de los siete puentes de Königsberg: ¿es posible cruzar cada puente exactamente una vez?

El foco está en las aristas. Los vértices pueden visitarse repetidamente, porque una intersección puede ser necesaria para acceder a conexiones todavía no recorridas.

39.2 Recorrido o sendero euleriano

Un sendero euleriano recorre todas las aristas del grafo exactamente una vez. Puede comenzar y terminar en vértices distintos.

Cada arista aparece una vez; los vértices pueden repetirse.

Una arista paralela cuenta como una conexión diferente y debe recorrerse por separado.

39.3 Circuito euleriano

Un circuito euleriano es un sendero euleriano cerrado: comienza y termina en el mismo vértice.

v₀, e₁, v₁, ..., eₘ, v₀, usando E exactamente una vez

Un grafo que contiene un circuito euleriano se denomina euleriano.

39.4 Por qué importa la paridad

Cada vez que el recorrido entra a un vértice intermedio por una arista, debe salir por otra distinta. Las aristas incidentes se consumen en parejas.

En un circuito, incluso el vértice inicial necesita una arista de salida y otra de regreso; por ello todos los grados deben ser pares.

39.5 Criterio para circuitos eulerianos

Un grafo no dirigido posee un circuito euleriano si y solo si todos los vértices de grado no nulo pertenecen a una misma componente conexa y todos tienen grado par.

Circuito euleriano ⇔ conectado sobre sus aristas y 0 vértices de grado impar

Los vértices aislados no afectan el recorrido de las aristas.

39.6 Simulación de un circuito euleriano

Avanza para recorrer una arista por vez. El ejemplo contiene tres ciclos unidos en A; todas sus aristas se integran en un circuito único.

Aristas

Recorrido

A

Acción actual

Comenzar en A.
Circuito preparado.
Aristas recorridas0 / 9
Vértice actualA
Aristas restantes9
ResultadoEn proceso

Celeste indica las aristas ya utilizadas y verde la última arista recorrida.

39.7 Criterio para senderos abiertos

Un grafo no dirigido conectado sobre sus aristas posee un sendero euleriano abierto si y solo si tiene exactamente dos vértices de grado impar.

2 vértices impares ⇒ comenzar en uno y terminar en el otro

Con más de dos vértices impares no existe un recorrido que utilice cada arista una sola vez.

39.8 Elección del vértice inicial

Vértices imparesResultadoInicio
0Circuito eulerianoCualquier vértice con aristas
2Sendero euleriano abiertoUno de los dos impares
Otro númeroNo existe

39.9 Algoritmo de Fleury

Fleury elige en cada paso una arista que no sea puente del grafo restante, salvo que no exista alternativa.

Evitar puentes mientras queden otras opciones.

Es intuitivo, pero detectar repetidamente puentes lo hace menos eficiente que Hierholzer.

39.10 Algoritmo de Hierholzer

Hierholzer comienza siguiendo aristas no utilizadas hasta cerrar un ciclo. Si quedan aristas, inicia otro ciclo desde un vértice del recorrido que todavía tenga conexiones y lo inserta en el anterior.

  1. Mantener una pila con el recorrido activo.
  2. Avanzar mientras el vértice superior tenga aristas.
  3. Si no tiene, retirarlo y agregarlo al circuito final.
  4. Invertir el resultado al terminar.

39.11 Implementación de Hierholzer

function hierholzer(adyacencia, inicio) {
  const grafo = adyacencia.map(lista => [...lista]);
  const pila = [inicio];
  const circuito = [];
  const usadas = new Set();

  while (pila.length) {
    const u = pila[pila.length - 1];
    if (grafo[u].length) {
      const { destino: v, id } = grafo[u].pop();
      if (usadas.has(id)) continue;
      usadas.add(id);
      pila.push(v);
    } else {
      circuito.push(pila.pop());
    }
  }
  return circuito.reverse();
}

El identificador de arista es necesario para distinguir aristas paralelas y marcar una arista no dirigida desde cualquiera de sus extremos.

39.12 Construcción de la adyacencia

function agregarArista(grafo, u, v, id) {
  grafo[u].push({ destino: v, id });
  grafo[v].push({ destino: u, id });
}

No basta con eliminar solo una aparición: una arista no dirigida figura en las listas de ambos extremos.

39.13 Complejidad

Con listas de adyacencia e identificadores de aristas, Hierholzer procesa cada arista una cantidad constante de veces.

Tiempo: O(V + E)
Espacio: O(V + E)

Fleury puede llegar a O(E²) si cada decisión vuelve a comprobar puentes.

39.14 Grafos dirigidos

Un grafo dirigido posee circuito euleriano cuando sus vértices con aristas pertenecen a una región adecuadamente conectada y cada vértice tiene igual grado de entrada y salida.

Para todo v: entrada(v) = salida(v)

Para un sendero abierto, el inicio tiene una salida adicional, el final una entrada adicional y los demás grados están equilibrados.

39.15 Bucles y aristas paralelas

Los multigrafos encajan naturalmente en el problema. Cada arista paralela posee identidad propia. Un bucle aporta 2 al grado de su vértice en un grafo no dirigido y se recorre una vez.

Las implementaciones deben identificar aristas, no solo pares de vértices.

39.16 Componentes y vértices aislados

Solo los vértices con grado positivo deben pertenecer a la misma componente. Un vértice aislado no contiene aristas pendientes y puede ignorarse.

Dos componentes que contienen aristas hacen imposible un único recorrido, aunque todos sus grados sean pares.

39.17 Problema del cartero chino

Si el grafo no es euleriano pero necesitamos cubrir todas las aristas, el problema del cartero chino permite repetir algunas minimizando el costo adicional.

En grafos no dirigidos se emparejan los vértices de grado impar mediante caminos mínimos para convertir todos los grados en pares.

39.18 Euleriano frente a hamiltoniano

PropiedadEulerianoHamiltoniano
Elemento recorrido una vezAristasVértices
Puede repetirVérticesAristas no seleccionadas son irrelevantes
DecisiónO(V + E)NP-completa
Criterio principalGrados y conectividadSin criterio completo simple

39.19 Aplicaciones, errores y puntos clave

  • Inspección de calles, tuberías o conexiones.
  • Dibujo de figuras sin levantar el lápiz.
  • Ensamblado de secuencias mediante recorridos de De Bruijn.
  • No confundir aristas con vértices.
  • No ignorar la conectividad al contar grados.
  • Con dos impares, comenzar obligatoriamente en uno de ellos.
  • Hierholzer construye el recorrido en O(V + E).
  • En grafos dirigidos se comparan grados de entrada y salida.

39.20 Conclusión

Los grafos eulerianos muestran cómo una condición global puede decidirse mediante propiedades locales de grado más una comprobación de conectividad. Hierholzer convierte esa caracterización en un algoritmo lineal.

En el próximo tema estudiaremos isomorfismo de grafos: cómo reconocer cuándo dos representaciones describen exactamente la misma estructura.