Grafo dirigido acíclico

Definición

Un grafo dirigido acíclico o DAG (Directed Acyclic Graph) es un grafo dirigido que no contiene ningún ciclo dirigido simple; es decir, no existe ninguna secuencia de vértices con tal que y .

Intuición y aplicaciones: Restricciones de precedencia

Los DAGs son el modelo matemático universal para representar dependencias y precedencias donde una tarea, proceso o elemento debe completarse obligatoriamente antes de poder iniciar otro:

  • Mapa curricular universitario: La materia es prerrequisito obligatorio de la materia . Si hubiera un ciclo (), ningún estudiante podría graduarse.
  • Sistemas de compilación (Makefiles, Bazel): El módulo fuente debe compilarse antes de enlazar la biblioteca .
  • Pipelines de datos y aprendizaje automático: La salida del paso alimenta la entrada del modelo .
  • Sistemas de control de versiones (Git): El historial de commits forma un DAG de ancestros.

Lema fundamental: Existencia de una fuente (Source Lemma)

Lema de la Fuente

En todo DAG finito con al menos un vértice (), existe al menos un vértice con grado de entrada cero ().

Dicho vértice no depende de ningún otro y se denomina fuente (source). Análogamente, existe al menos un vértice con grado de salida cero, denominado sumidero (sink).

Demostración por contradicción (Paseo hacia atrás)

  1. Supongamos que es un DAG pero todo nodo tiene al menos una arista de entrada ( para todo ).
  2. Elijamos un nodo inicial cualquiera . Como tiene aristas entrantes, podemos retroceder a lo largo de una arista entrante hacia un nodo predecesor .
  3. Como también tiene al menos una arista entrante, retrocedemos hacia , y así sucesivamente:
  4. Dado que el conjunto de vértices es finito (), por el principio del palomar, tras dar a lo más pasos hacia atrás nos veremos forzados a visitar por segunda vez algún nodo ya visitado .
  5. La subsecuencia de aristas recorrida entre la primera y la segunda visita al nodo forma un ciclo dirigido, lo cual contradice la hipótesis de que es un DAG.
  6. Por contradicción, debe existir al menos un nodo sin aristas de entrada.
flowchart RL
  v["v (inicia paseo)"] --> u["u"]
  u --> x["x"]
  x --> w((w))
  w --> y1["..."]
  y1 --> y2["..."]
  y2 --> w

Relaciones

Procedencia