25. Clausura transitiva

La clausura transitiva responde todas las preguntas de alcanzabilidad de un grafo: indica para cada par de vértices si existe algún camino que conecte el primero con el segundo.

25.1 Introducción

Una arista informa una conexión directa, pero muchas aplicaciones necesitan conocer conexiones indirectas. Si A apunta a B y B apunta a C, sabemos que A puede alcanzar a C aunque no exista la arista A → C.

La clausura transitiva reúne toda esa información. Conserva los vértices del grafo y agrega conceptualmente una arista u → v siempre que exista algún camino dirigido desde u hasta v.

25.2 Definición

La clausura transitiva G⁺ de un grafo dirigido G = (V, E) posee el mismo conjunto de vértices y contiene la arista u → v si v es alcanzable desde u en G.

(u, v) ∈ E⁺ ⇔ existe un camino dirigido de u hasta v en G

No se inventan relaciones arbitrarias: cada nueva arista resume un camino que ya existía en el grafo original.

25.3 Propiedad transitiva

Una relación es transitiva cuando encadenar dos relaciones permite deducir una tercera:

Si u alcanza a k y k alcanza a v, entonces u alcanza a v.

Esta regla puede aplicarse repetidamente. Un camino A → B → C → D permite deducir A → C, B → D y A → D en la clausura.

25.4 Alcanzabilidad directa e indirecta

TipoCondiciónEjemplo
DirectaExiste una arista u → vA → B
IndirectaExiste un camino de dos o más aristasA → B → C
TotalDirecta o indirectaInformación almacenada en la clausura

25.5 Clausura transitiva y reflexiva

Existen dos convenciones habituales:

  • Clausura transitiva G⁺: considera caminos de longitud positiva. u alcanza a u solo si existe un ciclo.
  • Clausura reflexiva-transitiva G*: también admite caminos de longitud cero, por lo que todo vértice se alcanza a sí mismo.
G* incluye siempre la diagonal R[i][i] = verdadero.

En programación suele utilizarse la versión reflexiva porque simplifica la composición de caminos. El laboratorio de este tema sigue esa convención.

25.6 Representación mediante una matriz booleana

La clausura puede almacenarse en una matriz R de V × V:

R[i][j] = 1 si j es alcanzable desde i
R[i][j] = 0 en caso contrario

La fila i responde todos los destinos alcanzables desde i. La columna j muestra todos los orígenes capaces de llegar hasta j.

25.7 Simulación interactiva: algoritmo de Warshall

Avanza paso a paso. En cada etapa se permite utilizar un nuevo vértice como intermediario. Pulsa un nodo para elegir el origen cuyos destinos alcanzables deseas resaltar.

Matriz de alcanzabilidad

Acción actual

Matriz inicial: identidad y aristas directas.
Origen seleccionado: A.
Intermediarios usados0 / 5
Último intermediario
Pares alcanzables10
Nuevos en el paso0

Celeste representa un par alcanzable; rosa, un par descubierto en el último paso. En el grafo, verde es el origen seleccionado y celeste señala sus destinos alcanzables según el estado actual de la matriz.

25.8 Idea del algoritmo de Warshall

Warshall analiza los vértices uno por uno como posibles intermediarios. Al procesar k pregunta, para cada par i, j:

R[i][j] = R[i][j] OR (R[i][k] AND R[k][j])

Si i llega hasta k y k llega hasta j, queda demostrado que i alcanza a j. Las conclusiones se conservan para las etapas siguientes.

25.9 Warshall en JavaScript

function clausuraTransitiva(matrizAdyacencia) {
  const n = matrizAdyacencia.length;
  const alcance = matrizAdyacencia.map(fila => [...fila]);

  // Clausura reflexiva-transitiva
  for (let i = 0; i < n; i++) alcance[i][i] = true;

  for (let k = 0; k < n; k++) {
    for (let i = 0; i < n; i++) {
      for (let j = 0; j < n; j++) {
        alcance[i][j] = alcance[i][j] ||
                         (alcance[i][k] && alcance[k][j]);
      }
    }
  }
  return alcance;
}

25.10 Por qué importa el orden de los bucles

El bucle de k debe ser el exterior. Después de la etapa k, la matriz representa todos los caminos cuyos vértices intermedios pertenecen al conjunto ya procesado.

Invariante: al terminar k, R[i][j] considera intermediarios 0, 1, ..., k.

Cambiar arbitrariamente el orden de los tres bucles puede romper esta interpretación y producir resultados incompletos cuando la actualización se realiza sobre la misma matriz.

25.11 Clausura con DFS o BFS

Otra posibilidad es ejecutar un recorrido desde cada vértice. Todo nodo visitado desde el origen i se marca como alcanzable en la fila i.

function clausuraConDFS(grafo) {
  const vertices = Object.keys(grafo);
  const alcance = {};

  for (const origen of vertices) {
    const visitados = new Set([origen]);
    const pila = [origen];

    while (pila.length) {
      const actual = pila.pop();
      for (const vecino of grafo[actual]) {
        if (!visitados.has(vecino)) {
          visitados.add(vecino);
          pila.push(vecino);
        }
      }
    }
    alcance[origen] = visitados;
  }
  return alcance;
}

25.12 Complejidad

MétodoTiempoEspacio del resultadoConveniente para
WarshallO(V³)O(V²)Grafos densos y representación matricial
DFS/BFS desde cada vérticeO(V(V + E))O(V²)Grafos dispersos y listas de adyacencia

La propia clausura puede contener Θ(V²) pares, incluso cuando el grafo original tiene pocas aristas. Por eso almacenar el resultado completo requiere espacio cuadrático en el peor caso.

25.13 Clausura y componentes fuertemente conexas

Dos vértices u y v pertenecen a la misma componente fuertemente conexa exactamente cuando la matriz indica alcanzabilidad en ambos sentidos.

u y v están en la misma SCC ⇔ R[u][v] = 1 y R[v][u] = 1

En la matriz de clausura, una componente fuerte aparece como un bloque cuadrado de unos si agrupamos consecutivamente sus vértices.

25.14 Clausura y reducción transitiva

La clausura transitiva agrega relaciones implícitas. La reducción transitiva intenta hacer lo contrario: eliminar aristas redundantes sin modificar la alcanzabilidad.

Clausura: explicita todos los pares alcanzables
Reducción: conserva solo conexiones esenciales

En un DAG, la reducción transitiva es única. En grafos dirigidos con ciclos, el problema requiere más cuidado y puede no tener una única solución.

25.15 Consultas y actualizaciones

Una vez construida la matriz, responder “¿v es alcanzable desde u?” cuesta O(1). La inversión inicial es útil cuando se realizarán muchas consultas sobre un grafo que cambia poco.

Si se agregan o eliminan aristas constantemente, recalcular toda la clausura puede ser costoso. Existen algoritmos dinámicos especializados, y la elección depende de la frecuencia de consultas y modificaciones.

25.16 Aplicaciones

  • Determinar dependencias directas e indirectas entre tareas.
  • Consultar permisos heredados en jerarquías.
  • Analizar rutas posibles en redes de comunicación.
  • Responder consultas de ancestros y descendientes.
  • Detectar recursión indirecta entre módulos o funciones.
  • Analizar relaciones en bases de datos y sistemas expertos.

25.17 Errores comunes

  • Confundir adyacencia directa con alcanzabilidad mediante caminos.
  • No definir si se desea clausura transitiva o reflexiva-transitiva.
  • Colocar el bucle del intermediario k en una posición incorrecta.
  • Usar suma aritmética en lugar de operaciones booleanas.
  • Interpretar R[i][j] en la dirección contraria.
  • Suponer que la clausura conserva la cantidad de aristas del grafo.
  • Usar una matriz cuadrática sin considerar el tamaño del grafo.

25.18 Qué debes recordar de este tema

  • La clausura transitiva representa todos los pares alcanzables.
  • Una nueva arista de la clausura resume un camino existente.
  • Warshall actualiza una matriz booleana usando cada vértice como intermediario.
  • Su recurrencia es R[i][j] OR (R[i][k] AND R[k][j]).
  • También puede calcularse ejecutando DFS o BFS desde cada vértice.
  • La matriz permite responder consultas de alcanzabilidad en O(1).
  • La clausura requiere O(V²) de espacio en el peor caso.

25.19 Conclusión

La clausura transitiva transforma los caminos de un grafo en respuestas explícitas de alcanzabilidad. Warshall ofrece una solución matricial clara, mientras que los recorridos repetidos aprovechan mejor las representaciones dispersas.

En el próximo tema introduciremos el problema del camino mínimo, donde no solo preguntaremos si un destino es alcanzable, sino cuál es la mejor ruta para llegar hasta él.