Clase 10 · Ordenamiento topológico con DFS, componentes fuertemente conexas y gráfica de condensación ()

Alcance y fuentes de esta clase

Esta sesión articula tres bloques fundamentales desarrollados en el pizarrón y en el material de referencia (03Graphs.pdf y CLRS):

  1. Ordenamiento topológico mediante DFS (TopoSort-DFS): Demostración formal del lema de corrección mediante el análisis exhaustivo de los tres casos de coloración al procesar una arista dirigida ( gris, blanco, negro), probando que y que la lista ordenada por tiempos de finalización decrecientes es un orden topológico válido.
  2. Componentes Fuertemente Conexas (SCC): Definición formal de subconjunto maximal de vértices mutuamente alcanzables, análisis del digrafo canónico de 13 nodos de Robert Tarjan (1972) en , y comparación con el algoritmo de Kosaraju-Sharir.
  3. Gráfica de componentes conexas ( o condensación): Definición formal del grafo de supernodos, demostración de que es siempre un DAG, y la perspectiva unificada de descomposición jerárquica de digrafos generales.

Pregunta central

¿Cómo podemos calcular un orden topológico aprovechando el orden de finalización de una búsqueda en profundidad (DFS), cómo demostramos formalmente que los tiempos de finalización satisfacen para toda arista, y cómo descomponemos cualquier grafo dirigido arbitrario (incluso con ciclos) en una jerarquía acíclica de componentes fuertemente conexas ()?

Idea de la clase

En un DAG, realizar una búsqueda en profundidad (DFS) y ordenar los vértices de mayor a menor tiempo de finalización () produce un orden topológico estricto. La prueba analiza los tres colores posibles del destino al procesar desde un nodo gris : gris es imposible porque cerraría un ciclo (arista hacia atrás); si es blanco, su recursión concluye antes de retornar a (); y si es negro, ya concluyó en el pasado (). Por otro lado, cuando un digrafo contiene ciclos, se descompone en componentes fuertemente conexas (SCC), calculables en tiempo (Tarjan 1972). Al colapsar cada SCC en un supernodo se obtiene la gráfica de componentes conexas , la cual es garantizadamente un DAG, unificando la teoría de grafos dirigidos: todo digrafo es un DAG a nivel macro cuyas componentes internas son fuertemente conexas a nivel micro.

flowchart TD
  subgraph TOPOSORT["1. Ordenamiento Topológico con DFS"]
    DAG["Grafo dirigido acíclico (DAG)"] --> DFS["Ejecutar DFS(G) con marcas de tiempo"]
    DFS --> COLOR["Colores: Blanco, Gris, Negro"]
    COLOR --> EDGE["Examinar arista (u,v) con u gris"]
    EDGE --> C1["v gris: Arista atrás ⟹ Ciclo (Contradicción ⟂)"]
    EDGE --> C2["v blanco: Llamada recursiva ⟹ u.f > v.f"]
    EDGE --> C3["v negro: Ya finalizó ⟹ u.f > v.f"]
    C2 & C3 --> RES["∀(u,v) ∈ E : u.f > v.f"]
    RES --> L["Lista L: v₁.f > v₂.f > ... > vₙ.f (Orden Topológico)"]
  end

  subgraph SCC["2. Digrafos con Ciclos y Descomposición"]
    GEN["Digrafo General G (puede tener ciclos)"] --> TARJAN["Algoritmo de Tarjan (1972) / Kosaraju O(n + m)"]
    TARJAN --> COMPS["Componentes Fuertemente Conexas (SCC):\nSubconjuntos maximales mutuamente alcanzables"]
    COMPS --> GCC["Gráfica de Componentes Conexas G_cc\n(Condensación)"]
    GCC --> TH_DAG["Teorema:\nG_cc es SIEMPRE un DAG"]
    TH_DAG --> TOPO_GCC["Orden Topológico sobre componentes en G_cc"]
  end

  L -.->|"Puente conceptual"| TOPO_GCC

1. De Kahn a DFS: Una perspectiva dual del ordenamiento topológico

En la clase anterior estudiamos el algoritmo de Kahn (Topo-Iterativo-Mejorado), cuya intuición es frontal y extractiva:

  1. Identifica nodos con grado de entrada cero (, fuentes).
  2. Extrae una fuente, la coloca al final de la lista de salida , y “elimina” sus aristas salientes.
  3. Repite hasta vaciar el grafo o detectar un ciclo si .

En esta clase abordamos la formulación clásica basada en Búsqueda en Profundidad (DFS) (atribuida a Tarjan y Cormen et al.):

  • En lugar de buscar fuentes que no tengan dependencias pendientes, DFS avanza en profundidad hasta topar con un sumidero local (un vértice que no puede avanzar más a nodos no visitados).
  • Cuando un vértice agota todas sus opciones de exploración y la recursión se repliega, dicho vértice ha completado todas sus dependencias posteriores.
  • Al registrar el instante de repliegue de cada vértice (su tiempo de finalización ), los vértices que terminan al último son precisamente aquellos de los que dependen los demás.
  • Por ende, ordenar los vértices de mayor a menor tiempo de finalización produce un orden topológico válido.

2. El algoritmo TopoSort con DFS

Basado en la evidencia del pizarrón (Fotografía 1) y CLRS Sección 22.4.

2.1 Colores y marcas de tiempo en DFS

Durante la ejecución de DFS sobre un grafo dirigido , cada vértice mantiene:

  • Color:
    • : El vértice aún no ha sido descubierto.
    • : El vértice ha sido descubierto y está actualmente en la pila de llamadas recursivas (su exploración está activa).
    • : La llamada recursiva de ha finalizado (todos sus vecinos salientes han sido completamente procesados).
  • Tiempos del reloj global:
    • : Tiempo de descubrimiento (discovery time), cuando pasa de blanco a gris.
    • : Tiempo de finalización (finishing time), cuando pasa de gris a negro.

Para todo vértice , los intervalos de descubrimiento y finalización están bien ordenados:

2.2 Pseudocódigo formal

def TopoSort_DFS(G):
    # Inicialización de estructuras
    for u in G.V:
        color[u] = BLANCO
        u.d = None
        u.f = None
    
    tiempo = 0
    L = []  # Lista enlazada que contendrá el orden topológico
    
    # Recorrido general del bosque DFS
    for u in G.V:
        if color[u] == BLANCO:
            DFS_Visit(G, u, tiempo, L)
            
    return L
 
def DFS_Visit(G, u, tiempo, L):
    tiempo += 1
    u.d = tiempo
    color[u] = GRIS
    
    for v in G.Adj[u]:  # Procesar cada arista dirigida (u, v)
        if color[v] == BLANCO:
            # Caso 2: Descubrimiento de nuevo subárbol
            DFS_Visit(G, v, tiempo, L)
        elif color[v] == GRIS:
            # Caso 1: Arista hacia atrás detectada
            error "G contiene un ciclo dirigido; no es un DAG"
        elif color[v] == NEGRO:
            # Caso 3: Vértice ya procesado en el pasado
            pass
            
    tiempo += 1
    u.f = tiempo
    color[u] = NEGRO
    
    # Inserción al frente de la lista L
    L.insertar_al_frente(u)

2.3 Estructura de la lista de salida

Como cada nodo se inserta al frente de en el instante exacto en que pasa a negro y se fija su tiempo , la lista resultante:

cumple estrictamente que los tiempos de finalización decrecen de izquierda a derecha:

(Anotación literal del pizarrón, Fotografía 1).


3. Lema y Demostración Formal: Los tres casos del pizarrón

Transcripción y desarrollo formal de las Fotografías 3 y 5.

Lema de Corrección de TopoSort-DFS

Si es un grafo dirigido acíclico (DAG), entonces la lista producida por el algoritmo TopoSort-DFS(G) es un orden topológico válido de .

3.1 Planteamiento de la prueba

Para demostrar que es un orden topológico, debemos verificar que para toda arista dirigida , el vértice aparece antes que el vértice en la lista .

Dado que los vértices se ordenan en en orden decreciente de sus tiempos de finalización, la condición de precedencia equivale exactamente a demostrar que:

Consideremos el momento exacto en que el algoritmo DFS_Visit ejecutado sobre procesa la arista dirigida . En ese instante:

  • El nodo es GRIS (está activo en la pila de llamadas, y su tiempo de finalización todavía no ha sido asignado).
  • Evaluamos los tres casos posibles según el color del vértice destino en ese momento:
                  ┌─────────────────┐
                  │ Examinar (u, v) │  (u es GRIS)
                  └────────┬────────┘
                           │
       ┌───────────────────┼───────────────────┐
       ▼                   ▼                   ▼
 1) v es GRIS        2) v es BLANCO       3) v es NEGRO
  Arista atrás         Subárbol DFS         Ya finalizó
  v rightsquigarrow u     recursivo          v.f < ahora
       │                   │                   │
  Ciclo v ↻ u       v termina antes       u terminará
  ¡CONTRADICCIÓN!      u.f > v.f          después ⟹ u.f > v.f

3.2 Caso 1: es GRIS (Imposible en un DAG)

  • Si es gris cuando se explora la arista , significa que ya fue descubierto pero su llamada DFS_Visit(v) aún no concluye.
  • Por la naturaleza de la pila de llamadas recursivas de DFS, es un ancestro de en el árbol DFS actual.
  • En consecuencia, ya existe un camino dirigido desde hasta en el árbol DFS:
  • Al examinar la arista , esta arista apunta de un descendiente a un ancestro, por lo que es una arista hacia atrás (back edge).
  • La concatenación del camino de árbol con la arista forma un ciclo dirigido simple:
  • Contradicción: Por hipótesis del lema, es un DAG (no contiene ciclos dirigidos).
  • Conclusión del Caso 1: Este caso no puede ocurrir durante la ejecución de TopoSort sobre un DAG. Si este caso llegara a presentarse, certificaría de inmediato que el grafo no es un DAG.

3.3 Caso 2: es BLANCO (Llamada recursiva descendente)

  • Si es blanco, significa que no ha sido descubierto aún por el recorrido.
  • Como la arista existe y es gris, el algoritmo invoca de forma inmediata la llamada recursiva DFS_Visit(G, v).
  • En este subárbol, se convierte en un descendiente de en el bosque DFS.
  • Toda la exploración que parte de (incluyendo a todos los nodos alcanzables desde ) debe completarse en su totalidad antes de que la llamada recursiva de retorne el control a .
  • En el instante en que DFS_Visit(v) termina:
    1. Se le asigna a su tiempo de finalización .
    2. El nodo se pinta de negro.
    3. El control retorna a .
  • Dado que a todavía le resta terminar de examinar sus demás aristas salientes antes de concluir su propia llamada:
  • Por lo tanto, se cumple estrictamente:

3.4 Caso 3: es NEGRO (Finalización previa)

  • Si es negro, significa que la exploración de ya concluyó en su totalidad en una etapa anterior del recorrido (ya sea en una rama previa del árbol DFS actual o en un árbol DFS disjunto explorado anteriormente).
  • Por lo tanto, el tiempo de finalización ya fue calculado y fijado en el pasado:
  • Por otro lado, como sigue siendo gris en este instante, su tiempo de finalización todavía no se ha fijado; se le asignará un valor del reloj estrictamente en el futuro:
  • Comparando ambas cotas temporales:

3.5 Conclusión de la Demostración

Habiendo agotado todos los casos posibles:

  1. El Caso 1 ( gris) es imposible porque violaría la aciclicidad de .
  2. En el Caso 2 ( blanco), la recursión garantiza .
  3. En el Caso 3 ( negro), la finalización previa garantiza .

Por lo tanto, para toda arista , se cumple invariablemente que . Al ordenar los vértices de mayor a menor tiempo de finalización en la lista , precede a para toda arista .

Concluimos que la lista es un ordenamiento topológico válido de .


4. Componentes Fuertemente Conexas (SCC)

Diapositiva 43 de 03Graphs.pdf (Fotografía 4).

4.1 Definición formal

Componente Fuertemente Conexa (SCC)

En un grafo dirigido , una componente fuertemente conexa (Strongly Connected Component o SCC) es un subconjunto maximal de vértices tales que para todo par de nodos , y son mutuamente alcanzables:

La condición de maximalidad: Decir que es maximal significa que no existe ningún superconjunto estricto tal que todos los nodos de sigan siendo mutuamente alcanzables entre sí. Si añadimos cualquier nodo externo , se rompe la propiedad de alcanzabilidad mutua con al menos un nodo de .

4.2 Partición del conjunto de vértices

La relación de alcanzabilidad mutua () es una relación de equivalencia:

  1. Reflexiva: (camino trivial de longitud 0).
  2. Simétrica: .
  3. Transitiva: Si y , concatenando caminos dirigidos obtenemos y , luego .

Como toda relación de equivalencia sobre un conjunto finito, las componentes fuertemente conexas forman una partición disjunta del conjunto de vértices : Cada vértice del grafo pertenece a exactamente una componente fuertemente conexa.


4.3 El digrafo canónico de Robert Tarjan (1972)

En la diapositiva 43 de Kleinberg & Tardos (presentada en clase), se analiza el siguiente digrafo de 13 vértices :

      [0] ───────────────> [6] <════> [8] ───────> [7]
     ^ |  \                 |
    /  |   v                |
  [1]  |   [2]              v
   ^   |  /   \           [9] ───────> [10]
    \  v v     v           ^  \          |
    [5] <───── [4]         |   v         v
        \                 [11] <────── [12]
         └─────────────────┘

Descomposición en sus 4 componentes conexas maximales:

ComponenteVérticesEstructura interna
Ciclos entrelazados: y . Todos se alcanzan mutuamente.
Par bidireccional simple: aristas y .
Nodo individual sumidero: recibe aristas desde pero no tiene aristas salientes hacia ningún otro nodo.
Ciclo dirigido de 4 nodos: con arista cruzada .

4.4 Teorema de Tarjan (1972)

Teorema de Robert Tarjan (1972)

Todas las componentes fuertemente conexas de un grafo dirigido pueden encontrarse en tiempo lineal óptimo: utilizando una sola pasada de DFS que mantiene valores de descubrimiento y números de ancestro más bajo alcanzable (low-link values).

Referencia histórica: Tarjan, R. (1972), Depth-First Search and Linear Graph Algorithms, SIAM Journal on Computing, Vol. 1, No. 2, pp. 146–160.


5. La Gráfica de Componentes Conexas ()

Basado en la definición y diagramas del pizarrón (Fotografía 2).

5.1 Definición formal de (Condensación de un digrafo)

Definición formal de

Dada una digráfica , su gráfica de componentes conexas (también conocida en la literatura como grafo de condensación o Kernel DAG) se define como:

  1. Vértices: Cada vértice de corresponde a una componente fuertemente conexa completa de :
  2. Aristas: Existe una arista dirigida dirigida entre dos componentes distintas () si y solo si existe al menos una arista dirigida en que parte de algún nodo de y llega a algún nodo de :
 Componente X                    Componente Y
┌──────────────┐                ┌──────────────┐
│  (u1)  (u2)  │  (u1, v1)      │  (v1)  (v2)  │
│    \   /     │───────────────>│    \   /     │
│     (u3)     │  (u3, v2)      │     (v3)     │
│              │- - - - - - - ->│              │
└──────────────┘                └──────────────┘
  En G_cc se colapsa a una única macro-arista:
              [ X ] ──────────────> [ Y ]

5.2 Teorema Fundamental: es siempre un DAG

Teorema de Aciclicidad de la Condensación

Para cualquier grafo dirigido arbitrario , su gráfica de componentes conexas es siempre un grafo dirigido acíclico (DAG).

Demostración formal por contradicción:

  1. Supongamos, por contradicción, que no es un DAG.
  2. Si no es un DAG, entonces contiene al menos un ciclo dirigido simple compuesto por componentes distintas:
  3. Por la definición de arista en :
    • Como , existe una arista con y .
    • Como , existe una arista con y .
    • Como , existe una arista con y .
  4. Ahora, elijamos dos nodos cualesquiera . Supongamos sin pérdida de generalidad que e :
    • Para ir de a : Dentro de , como es fuertemente conexa, existe un camino . Luego tomamos la arista hacia . Repitiendo este proceso a lo largo del ciclo de componentes, llegamos a . Finalmente, dentro de existe un camino de a . Por lo tanto:
    • Para ir de a : Continuando el recorrido por el resto del ciclo de componentes desde hasta de manera análoga, obtenemos:
  5. Por lo tanto, todos los vértices de la unión son mutuamente alcanzables entre sí en .
  6. Esto significa que el conjunto unificado forma una única región fuertemente conexa estrictamente más grande que cualquiera de las componentes individuales.
  7. ¡Contradicción directa! Esto viola la maximalidad de cada componente , pues por definición una SCC no puede ser extendida a un conjunto mayor de nodos mutuamente alcanzables.
  8. Por lo tanto, no puede contener ciclos dirigidos: es obligatoriamente un DAG.

5.3 La Gran Síntesis: Descomposición jerárquica de digrafos

Este resultado revela la estructura universal de cualquier grafo dirigido:

  1. Nivel Micro (Componentes Fuertes): Los ciclos dirigidos quedan totalmente confinados dentro de las componentes fuertemente conexas individuales.
  2. Nivel Macro (Condensación ): La relación entre las distintas componentes es puramente acíclica (un DAG).
  3. Consecuencia algorítmica: Dado que es un DAG, siempre admite un ordenamiento topológico. Podemos ordenar las componentes completas de tal forma que ninguna componente dependa circularmente de otra.

En el ejemplo canónico de Tarjan: Un ordenamiento topológico válido de las componentes en es: (o equivalentemente ).


6. Laboratorio interactivo: Simulador de TopoSort DFS y Condensación en

El siguiente simulador permite ejecutar paso a paso el algoritmo TopoSort-DFS sobre un DAG observando la pila de recursión, los tiempos / y la clasificación de los 3 casos de aristas en tiempo real, así como alternar a la pestaña de componentes fuertemente conexas para visualizar la condensación del grafo de 13 nodos en .

Idea central si el laboratorio no carga

  • En TopoSort-DFS: El simulador muestra cómo los nodos descubiertos pasan a gris y entran a la pila. Al topar con un nodo sin aristas no visitadas, pasa a negro y se le asigna su tiempo de finalización , insertándose al frente de . Si se selecciona el modo con ciclo, se visualiza el Caso 1 (arista hacia atrás a nodo gris), demostrando por qué no puede existir en un DAG.
  • En Condensación (): Se visualiza el grafo de 13 nodos particionado en sus 4 SCCs ( a ). Al pulsar “Condensar”, los nodos colapsan en 4 supernodos conectados por macro-aristas que forman un DAG perfecto sin ciclos.

7. Comparación sistemática: Enfoques de Ordenamiento y Conectividad

CriterioAlgoritmo de Kahn (Topo-Iterativo)TopoSort con DFS
Estrategia fundamentalBúsqueda de fuentes ()Rastreo en profundidad hasta sumideros locales
Estructura directrizCola de nodos con grado 0Pila de llamadas recursivas / tiempos de finalización
Tiempo
Espacio (vector in-degree y cola ) (pila de recursión y marcas de tiempo)
Detección de ciclosCardinalidad final: $L
Orden de generaciónDe izquierda a derecha (añade al final)De derecha a izquierda (inserta al frente al finalizar)

8. Ejercicios resueltos paso a paso

Ejercicio 1: Traza completa de TopoSort con DFS

Problema: Dado el DAG con vértices y aristas: Realizar la traza de TopoSort-DFS iniciando la exploración en (y resolviendo empates alfabéticamente).

Procedimiento:

  1. : DFS_Visit(A) es GRIS, . Pila: .
  2. Arista : es BLANCO (Caso 2).
    • : DFS_Visit(B) es GRIS, . Pila: .
  3. Arista : es BLANCO (Caso 2).
    • : DFS_Visit(D) es GRIS, . Pila: .
  4. Arista : es BLANCO (Caso 2).
    • : DFS_Visit(E) es GRIS, . Pila: .
  5. no tiene aristas salientes:
    • : pasa a NEGRO, . Pila: . Insertar en : .
  6. Se regresa a . no tiene más aristas salientes:
    • : pasa a NEGRO, . Pila: . Insertar al frente: .
  7. Se regresa a . no tiene más aristas salientes:
    • : pasa a NEGRO, . Pila: . Insertar al frente: .
  8. Se regresa a . Arista : es BLANCO (Caso 2).
    • : DFS_Visit(C) es GRIS, . Pila: .
  9. Arista : es NEGRO (Caso 3).
    • Como ya finalizó () y es gris, será . No se hace llamada recursiva.
  10. no tiene más aristas salientes:
    • : pasa a NEGRO, . Pila: . Insertar al frente: .
  11. Se regresa a . no tiene más aristas salientes:
    • : pasa a NEGRO, . Pila: . Insertar al frente: .

Resultado:

  • Tiempos de finalización: .
  • Orden topológico resultante:

Ejercicio 2: Construcción de la Gráfica de Componentes Conexas ()

Problema: Sea con y aristas: Determinar las SCCs, construir y verificar que es un DAG.

Procedimiento:

  1. Identificación de ciclos dirigidos:
    • Ciclo 1: . Los nodos son mutuamente alcanzables.
    • Ciclo 2: . Los nodos son mutuamente alcanzables.
  2. Componentes Fuertemente Conexas maximales:
  3. Aristas entre componentes:
    • Existe la arista , donde y .
    • No existe ninguna arista de ningún nodo de hacia ningún nodo de .
  4. Construcción de :
    • Vértices: .
    • Aristas: .
  5. Verificación:
    • consta de dos supernodos conectados por una sola arista dirigida: .
    • No contiene ciclos dirigidos; es estrictamente un DAG.
    • Su orden topológico trivial es: .

9. Errores conceptuales frecuentes

Error conceptualCorrección rigurosa
Creer que implica que precede a en un orden topológicoFalso. Los tiempos de descubrimiento no preservan el orden topológico. Si y están en ramas distintas de un árbol DFS o en árboles distintos del bosque, puede ocurrir pero no existir camino entre ellos, o incluso que deba preceder a . Son exclusivamente los tiempos de finalización los que garantizan .
Confundir componente conexa (no dirigida) con fuertemente conexa (dirigida)En grafos dirigidos, la conectividad no es simétrica. Dos nodos pueden estar en la misma componente conexa débil (ignorando la dirección de los arcos) pero pertenecer a componentes fuertemente conexas totalmente separadas si no pueden regresar el uno al otro.
Pensar que puede tener ciclos si el grafo original tenía muchos ciclosImposible. Si existiera un ciclo entre componentes en , por transitividad todos los vértices de esas componentes serían mutuamente alcanzables entre sí y habrían formado una única SCC por maximalidad. es siempre un DAG.
Asumir que toda arista examinada en DFS con negro es una arista hacia adelanteLas aristas con negro pueden ser aristas de cruce (cross edges) entre diferentes ramas del árbol o incluso entre diferentes árboles del bosque DFS.

10. Preguntas de autoevaluación

  1. Durante la ejecución de TopoSort-DFS, si al examinar una arista el nodo es gris, ¿qué conclusión matemática se deduce de inmediato?
  2. Si un grafo dirigido ya es de por sí un DAG, ¿cómo son sus componentes fuertemente conexas?
  3. ¿Por qué es necesario insertar los nodos al frente de la lista cuando pasan a negro en lugar de agregarlos al final cuando pasan a gris?
  4. En la gráfica de componentes conexas de cualquier digrafo, ¿cuál es el número mínimo y máximo posible de vértices que puede tener ?
Respuestas explicadas
  1. Se concluye que contiene al menos un ciclo dirigido y por lo tanto no es un DAG. Un nodo gris es un ancestro activo en la pila de recursión (). La arista es una arista hacia atrás que cierra el ciclo .
  2. Cada componente fuertemente conexa consta de exactamente un solo vértice (). Si alguna componente tuviera 2 o más vértices, existiría un ciclo dirigido entre ellos, lo cual contradice que sea un DAG. En este caso, es isomorfo a .
  3. Porque los tiempos de descubrimiento no garantizan la relación de precedencia, mientras que los de finalización sí. Un nodo puede descubrirse antes que , pero quedar a la espera de que termine. Al insertar al frente en el momento en que se vuelve negro, el nodo que termina al final de toda la recursión quedará colocado en la primera posición de , asegurando el orden decreciente de .
  4. Mínimo 1 y máximo . Si el grafo es fuertemente conexo en su totalidad, colapsa en un solo supernodo (). Si el grafo es un DAG sin ciclos, cada vértice es su propia componente y .

11. Recorrido de diapositivas y evidencias del pizarrón

FuenteEvidencia originalDónde se desarrolla
Pizarrón (Foto 1) con §2.3
Pizarrón (Foto 3)Lema: TopoSort-DFS produce un orden topológico. Prueba: §3.1
Pizarrón (Foto 3 y 5)Análisis de los 3 casos: 1) gris (arista atrás/ciclo), 2) blanco, 3) negro§3.2, §3.3 y §3.4
Pizarrón (Foto 5)Diagrama de recursión: gris llamada a termina regresa a §3.3
03Graphs: 43 (Foto 4)Strong components: maximal subset of mutually reachable nodes. Digrafo de 13 nodos§4.1 y §4.3
03Graphs: 43 (Foto 4)Teorema de Tarjan (1972): SCCs en en SIAM J. Comput.§4.4
Pizarrón (Foto 2)Def. Gráfica de componentes conexas : vértices son SCCs, aristas si §5.1
Pizarrón (Foto 2)Diagrama de blobs de componentes e con aristas dirigidas§5.1 y §5.2

Conexiones