Clase 8 · Bipartición, prueba con BFS y conectividad en grafos dirigidos
Alcance de esta clase
Esta nota continúa directamente donde concluyó la clase anterior del 3 de septiembre (que cubrió las diapositivas 3–24 de 03Graphs.pdf). Desarrolla de forma exhaustiva las diapositivas 25 a 43:
- Testing bipartiteness (Diapositivas 25–32): Definición de grafos bipartitos, aplicaciones en emparejamiento y calendarización, obstrucción estructural por ciclos impares, el lema de capas BFS, construcción del ciclo impar mediante el ancestro común más cercano () y el algoritmo de prueba en tiempo lineal .
- Connectivity in directed graphs (Diapositivas 33–43): Digrafos, aplicaciones del mundo real (Web, citas, blogs, redes tróficas), alcanzabilidad orientada (), conectividad fuerte, lema del nodo testigo , algoritmo de 2 recorridos BFS en y componentes fuertemente conexas (Teorema de Tarjan 1972).
Pregunta central
¿Cómo podemos certificar con un algoritmo lineal si un grafo no dirigido es bipartito (o aislar un ciclo impar como testigo de imposibilidad), y cómo decidimos eficientemente si en una red dirigida todos los nodos pueden comunicarse mutuamente en ambos sentidos?
Idea de la clase
Un grafo no dirigido es bipartito si y solo si no contiene ciclos impares. Al ejecutar BFS, las capas de distancia intentan colorear el grafo de forma natural (capas pares de azul, capas impares de blanco); si aparece una arista interna dentro de una misma capa , sus extremos se unen en su ancestro común más cercano produciendo un ciclo impar de longitud . Por otra parte, en grafos dirigidos, la conectividad fuerte exige alcanzabilidad mutua ( y ). Gracias al lema del nodo testigo, basta elegir un vértice y verificar mediante dos BFS (uno en y otro en ) que alcance a todos y sea alcanzado por todos, resolviendo el problema en tiempo óptimo .
flowchart TD subgraph Biparticion["Bloque 1: Bipartición y 2-Colorabilidad"] G["Grafo no dirigido G"] --> BFS["BFS por capas: L0, L1, L2..."] BFS --> Q{"¿Hay aristas dentro de la misma capa Lj?"} Q -->|NO| BIP["G es Bipartito<br>(Pares = Azul, Impares = Blanco)"] Q -->|"SÍ: e = {x, y}"| LCA["Encontrar lca(x,y) en Li<br>Ciclo impar = 1 + 2(j - i)<br>G NO es bipartito"] end subgraph Digrafos["Bloque 2: Conectividad Fuerte en Digrafos"] D["Digrafo G = (V, E)"] --> S["Elegir nodo testigo s"] S --> B1["BFS 1 en G desde s:<br>¿s alcanza a todo V?"] B1 -->|NO| NO1["NO es fuertemente conexo"] B1 -->|SÍ| B2["BFS 2 en G_rev desde s:<br>¿Todo V alcanza a s?"] B2 -->|NO| NO2["NO es fuertemente conexo"] B2 -->|SÍ| SC["G es Fuertemente Conexo<br>u ⇝ s ⇝ v para todo u, v (O(m+n))"] end
1. Grafos bipartitos y 2-colorabilidad
Diapositivas 25–27.
1.1 Definición formal
Un grafo no dirigido es bipartito si su conjunto de vértices puede dividirse en dos subconjuntos disjuntos y ( con ) tales que cada arista tiene un extremo en y el otro extremo en .
Equivalentemente, un grafo es bipartito si es -coloreable: podemos asignar uno de dos colores (por ejemplo, blanco y azul) a cada nodo de modo que ningún par de vecinos comparta el mismo color.
Conjunto V1 (Azul) Conjunto V2 (Blanco)
(v2) ----------------- (v1)
(v4) ----------------- (v3)
(v5) ----------------- (v6)
(v7) -----------------
1.2 Aplicaciones del mundo real
- Emparejamiento estable (Stable Matching):
- Vértices azules = Estudiantes médicos postulantes.
- Vértices blancos = Hospitales con plazas de residencia.
- Aristas = Solicitudes o compatibilidades de postulación. No hay aristas entre dos estudiantes ni entre dos hospitales.
- Calendarización de tareas (Scheduling):
- Vértices azules = Máquinas o procesadores disponibles.
- Vértices blancos = Trabajos o tareas a ejecutar.
- Aristas = Compatibilidad técnica de la máquina para ejecutar dicho trabajo.
- Optimización computacional:
- Problemas intrínsecamente intratables (NP-completos) en grafos generales, como el Conjunto Independiente Máximo (Maximum Independent Set) o la Cobertura de Vértices (Vertex Cover), se vuelven computables en tiempo polinomial exacto cuando el grafo subyacente es bipartito (reduciéndose a problemas de flujo máximo en redes).
2. La obstrucción estructural: Ciclos impares
Diapositiva 28.
¿Qué le impide a un grafo ser bipartito? La respuesta radica en la paridad de sus ciclos.
Lema de la Obstrucción
Si un grafo contiene un ciclo simple de longitud impar, no puede ser bipartito (no es 2-coloreable).
Demostración formal:
Sea un ciclo simple con aristas y vértices (longitud impar, como un triángulo o un pentágono ).
- Supongamos que admite una -coloración válida con colores .
- Sin pérdida de generalidad, asignemos el color al nodo : .
- Como es vecino de , forzosamente .
- De forma inductiva, para cada nodo del ciclo:
- Todos los nodos con índice impar () deben tener color .
- Todos los nodos con índice par () deben tener color .
- Al llegar al último nodo del ciclo, (cuyo índice es impar), debe tener obligatoriamente:
- Sin embargo, en el ciclo existe la arista de cierre . Ambos extremos tienen color , lo cual viola la definición de -coloración.
- Por contradicción, ningún ciclo de longitud impar puede ser 2-coloreado.
3. El algoritmo de prueba de bipartición mediante capas BFS
Diapositivas 29–32.
El lema anterior demuestra que los ciclos impares impiden la bipartición. Pero, ¿es esta la única obstrucción posible? El siguiente teorema responde afirmativamente y proporciona un algoritmo lineal para certificarlo.
3.1 Teorema de caracterización por capas BFS
Sea un grafo conexo y sean las capas de distancia generadas por BFS a partir de un nodo inicial ().
Recordemos la propiedad fundamental del árbol BFS: para toda arista , los niveles de sus extremos difieren a lo más en (). Por tanto, cada arista de cae exclusivamente en uno de dos casos:
- Une vértices en niveles adyacentes ( y ).
- Une vértices en el mismo nivel ( y ).
Lema de Capas de Bipartición
Se cumple exactamente una de las siguientes dos afirmaciones:
- Caso (i): Ninguna arista de une dos nodos de la misma capa es bipartito.
- Caso (ii): Existe al menos una arista de que une dos nodos de la misma capa contiene un ciclo de longitud impar (y por tanto no es bipartito).
3.2 Demostración del Caso (i): Bipartición natural
Si no hay aristas que conecten nodos dentro de la misma capa, toda arista une necesariamente una capa con una capa contigua . Asignamos:
- Nodos azules: Vértices pertenecientes a capas pares ().
- Nodos blancos: Vértices pertenecientes a capas impares ().
Como cada arista conecta una capa par con una impar, ningún par de nodos del mismo color puede ser adyacente. La 2-coloración es válida y es bipartito.
3.3 Demostración del Caso (ii): Aislamiento del ciclo impar
Supongamos que existe una arista donde ambos nodos están en el mismo nivel: .
- En el árbol BFS generado, trazamos el camino único desde hacia la raíz , y el camino desde hacia la raíz .
- Sea el ancestro común más cercano (lowest common ancestor) de y en el árbol BFS, ubicado en algún nivel (donde necesariamente ).
- Consideremos el ciclo cerrado formado por:
- La arista directa (longitud ).
- El camino en el árbol de ascendiendo a (longitud ).
- El camino en el árbol de descendiendo a (longitud ).
- La longitud total de este ciclo simple es:
- Como , la diferencia es un entero mayor o igual a cero. La cantidad es forzosamente un número par. Al sumarle , obtenemos un número estrictamente impar.
- Por lo tanto, hemos aislado un ciclo simple de longitud impar en , certificando que no es bipartito.
Corolario fundamental
Un grafo no dirigido es bipartito si y solo si no contiene ningún ciclo de longitud impar. Los ciclos impares son la única obstrucción a la bipartición.
3.4 Algoritmo y tiempo de ejecución
def probar_biparticion(G):
color = {} # Guarda 0 (azul) o 1 (blanco)
for s in G.vertices:
if s not in color:
color[s] = 0
cola = [s]
while cola:
u = cola.pop(0)
for v in G.vecinos(u):
if v not in color:
color[v] = 1 - color[u] # Alternar color
cola.append(v)
elif color[v] == color[u]:
return False, "Grafo no bipartito: ciclo impar detectado"
return True, color- Complejidad temporal: Cada vértice se encola a lo más una vez y cada arista se examina dos veces (una por cada extremo). Utilizando listas de adyacencia, el tiempo total es .
- Complejidad espacial: para almacenar los colores y la cola de exploración.
4. Laboratorio interactivo: Bipartición y Conectividad Fuerte
Experimenta interactivamente con la prueba de 2-colorabilidad por capas de BFS y con el algoritmo de dos recorridos para digrafos.
Idea central si el laboratorio no carga:
- En la pestaña de Bipartición, el grafo se organiza en columnas que representan las capas . Si todas las aristas van entre columnas vecinas, el grafo es bipartito. Si aparece una arista vertical entre dos nodos de la misma columna (en rojo), el simulador encuentra su ancestro común más cercano y dibuja el ciclo impar de longitud .
- En la pestaña de Conectividad Fuerte, al seleccionar un nodo , el algoritmo recorre hacia adelante y luego hacia atrás. Si ambos recorridos alcanzan a todos los nodos, la red es fuertemente conexa.
5. Grafos dirigidos (Digrafos) y aplicaciones
Diapositivas 33–39.
5.1 Notación formal
Un grafo dirigido o digrafo se compone de vértices y aristas dirigidas . Cada arista es un par ordenado:
- Sale del nodo y entra al nodo .
- La orientación es crítica: no garantiza la existencia de .
5.2 Grados y apretón de manos en digrafos
- : Número de aristas que entran a .
- : Número de aristas que salen de .
5.3 Aplicaciones canónicas de digrafos
| Red / Dominio | Vértice | Arista dirigida | Importancia de la dirección |
|---|---|---|---|
| World Wide Web | Página web | Hipervínculo de hacia | Los motores de búsqueda (Google PageRank) usan la estructura de enlaces entrantes como medida de autoridad y relevancia. |
| Red vial urbana | Esquina / Intersección | Calle de sentido único | Si una calle es de un solo sentido, el tráfico solo puede fluir en una dirección. |
| Blogosfera política | Blog político | Enlace de citación | El estudio de Adamic y Glance (2004) demostró que el 91% de los enlaces se producen dentro de la misma comunidad ideológica (polarización). |
| Red trófica ecológica | Especie animal/vegetal | Relación presa depredador | La energía fluye unidireccionalmente del organismo consumido al consumidor. |
| Citas científicas | Artículo de investigación | El artículo cita al artículo | El grafo es necesariamente acíclico respecto al tiempo (un artículo no puede citar trabajos futuros). |
| Flujo de control | Bloque básico de código | Salto o transición | Modela la ejecución de instrucciones en compiladores y análisis estático. |
6. Alcanzabilidad y búsqueda en digrafos
Diapositiva 40.
- Alcanzabilidad dirigida: Dado un nodo origen , encontrar todos los nodos tales que existe un camino dirigido de a (denotado ).
- Camino más corto orientado: Longitud mínima (menor número de arcos dirigidos) para ir de a .
- Algoritmo: BFS se extiende de manera inmediata a grafos dirigidos considerando únicamente las aristas salientes de cada nodo explorado.
- Rastreador web (Web Crawler): Comienza en una página semilla y explora enlaces salientes de forma iterativa mediante BFS para indexar la web alcanzable.
7. Conectividad fuerte (Strong Connectivity)
Diapositivas 41–42.
En un grafo no dirigido, si existe camino de a , automáticamente existe camino de a . En grafos dirigidos esto ya no es cierto.
7.1 Definición formal
- Dos nodos y son mutuamente alcanzables si existe tanto un camino dirigido como un camino dirigido .
- Un digrafo es fuertemente conexo (strongly connected) si todo par de nodos es mutuamente alcanzable.
7.2 El Lema del Nodo Testigo
Comprobar directamente la definición evaluando todos los pares requeriría verificar caminos dirigidos (). El siguiente lema reduce el problema a un análisis centrado en un único nodo testigo:
Lema del Nodo Testigo
Sea un nodo cualquiera fijado arbitrariamente. El digrafo es fuertemente conexo si y solo si:
- Todo nodo es alcanzable desde ().
- El nodo es alcanzable desde todo nodo ().
Demostración:
- (Necesidad): Se sigue directamente de la definición: si todos los pares son mutuamente alcanzables, en particular y lo son para cualquier .
- (Suficiencia): Sean y dos nodos arbitrarios cualesquiera de .
- Por la condición (2), existe un camino dirigido .
- Por la condición (1), existe un camino dirigido .
- Concatenando ambos caminos pasando por el testigo , obtenemos un camino dirigido válido:
- De forma idéntica, concatenando el camino con , obtenemos:
- Como y fueron elegidos arbitrariamente, todo par es mutuamente alcanzable.
u ──────────> ( s ) ──────────> v
[camino u ⇝ s] [camino s ⇝ v]
Concatenación: u ⇝ s ⇝ v demuestra que u alcanza a v.
7.3 Algoritmo en tiempo mediante dos recorridos BFS
Para verificar si todo nodo alcanza a , construimos el grafo reverso invirtiendo el sentido de todas las aristas de . Notemos que:
def es_fuertemente_conexo(G):
s = G.vertices[0] # Tomar cualquier nodo como testigo
# 1. Primer BFS: explorar hacia adelante en G desde s
R1 = BFS(G, s)
if len(R1) < len(G.vertices):
return False # s no alcanza a todos
# 2. Invertir aristas para obtener G_rev
G_rev = construir_grafo_reverso(G)
# 3. Segundo BFS: explorar en G_rev desde s (equivale a quienes alcanzan a s en G)
R2 = BFS(G_rev, s)
if len(R2) < len(G.vertices):
return False # no todos los nodos alcanzan a s
return True # Pasa ambas pruebas: G es fuertemente conexoComplejidad:
- BFS en : .
- Construcción de : .
- BFS en : .
- Tiempo total: (óptimo y lineal).
8. Componentes fuertemente conexas (SCC)
Diapositiva 43.
Cuando un digrafo no es fuertemente conexo en su totalidad, suele descomponerse de forma única en subgrafos fuertemente conexos maximales.
8.1 Definición
Una componente fuertemente conexa (SCC) es un subconjunto maximal de vértices tales que para todo par , y son mutuamente alcanzables.
Maximal significa que no se puede agregar ningún otro vértice a sin destruir la propiedad de alcanzabilidad mutua. Las componentes fuertemente conexas forman una partición de los vértices de .
8.2 Teorema de Robert Tarjan (1972)
Teorema de Tarjan
Es posible identificar y etiquetar todas las componentes fuertemente conexas de cualquier grafo dirigido en tiempo lineal utilizando un único recorrido DFS asistido por una pila y dos números por vértice: tiempo de descubrimiento (discovery time) y el enlace bajo (low-link value).
9. Ejercicios resueltos paso a paso
Ejercicio 1: Identificación de bipartición y ciclo impar
Problema: Determinar si el grafo con y aristas es bipartito. Si no lo es, aislar el ciclo impar.
Procedimiento:
- Ejecutamos BFS con raíz :
- (Azul)
- Vecinos de : solo (Blanco)
- Vecinos de no visitados: (Azul)
- Vecinos de : (Blanco)
- Analizamos las aristas restantes:
- Arista : Conecta el nodo con el nodo (capas adyacentes, permitida).
- Arista : Conecta con (capas adyacentes, permitida).
- Pero observemos el ciclo formado por los vértices : .
- Contamos las aristas de este ciclo cerrado: son aristas (). Es un ciclo par de longitud .
- Sin embargo, ¿hay alguna arista conflictiva?
- Si coloreamos: , , , , .
- Revisemos la arista : el nodo es blanco y el es azul ¡Válida!
- Revisemos la arista : el nodo es azul y el es blanco ¡Válida!
- Conclusión: El grafo SÍ es bipartito con bipartición y . No contiene ciclos impares (el único ciclo tiene longitud 4).
Ejercicio 2: Prueba de conectividad fuerte con nodo testigo
Problema: Sea el digrafo con vértices y aristas: Demostrar mediante el lema del nodo testigo si es fuertemente conexo tomando .
Procedimiento:
- Paso 1: BFS en desde :
- De .
- De y .
- De (ya visitado).
- Nodos alcanzados: . Todos los nodos son alcanzables desde ().
- Paso 2: Invertir aristas ():
- .
- Paso 3: BFS en desde :
- De en .
- De y en .
- Nodos alcanzados en : . Todos los nodos son alcanzables desde en , lo que significa que en original, todos los nodos alcanzan a ().
- Conclusión: Por el lema del nodo testigo, es fuertemente conexo.
10. Errores conceptuales frecuentes
| Error conceptual | Corrección |
|---|---|
| Creer que un grafo es bipartito si tiene número par de vértices | La paridad de los vértices no importa; lo determinante es que todos los ciclos sean de longitud par. Un grafo de 4 vértices con un triángulo no es bipartito. |
| Pensar que para probar bipartición basta con verificar que no haya triángulos () | Cualquier ciclo impar () rompe la bipartición. Un pentágono no tiene triángulos y no es bipartito. |
| Confundir aristas entre niveles con aristas dentro del mismo nivel en BFS | Dos nodos en niveles contiguos ( y ) con arista entre ellos son normales en BFS y compatibles con bipartición; el conflicto ocurre solo cuando una arista une nodos en el mismo nivel ( y ). |
| Asumir que si alcanza a todos los nodos en un digrafo, el digrafo ya es fuertemente conexo | Es un error grave: el grafo puede tener un nodo sumidero del cual no se pueda regresar. Se requiere obligatoriamente la doble condición ( y ). |
11. Preguntas de autoevaluación
- Si un grafo tiene vértices y no contiene ningún ciclo, ¿es necesariamente bipartito?
- En la prueba de bipartición con BFS, si encontramos una arista entre dos nodos de la capa cuyo ancestro común más cercano está en , ¿cuál es la longitud del ciclo impar resultante?
- ¿Por qué el algoritmo de conectividad fuerte invierte las aristas para el segundo recorrido BFS en lugar de hacer recorridos desde cada nodo?
- Si un digrafo es fuertemente conexo, ¿cuántas componentes fuertemente conexas tiene?
Respuestas explicadas
- Sí, siempre. Si no contiene ciclos (es un bosque o árbol), en particular no contiene ciclos impares. Todo árbol es siempre bipartito.
- Longitud 5. La fórmula es (un pentágono).
- Porque hacer recorridos tomaría tiempo , lo cual es ineficiente; al invertir las aristas, un solo BFS desde explora en reversa todos los caminos que conducen a en tiempo lineal .
- Exactamente una sola componente fuertemente conexa que contiene a todos los vértices del grafo.
12. Recorrido diapositiva por diapositiva
| Diapositiva | Contenido original | Dónde se desarrolla |
|---|---|---|
| 25 | Agenda de Bipartición: Testing bipartiteness | §1 |
| 26 | Definición de grafo bipartito (2-colorable) y aplicaciones (matching, scheduling) | §1.1 y §1.2 |
| 27 | Dibujo alternativo de un grafo bipartito y complejidad de problemas | §1.1 |
| 28 | Lema de obstrucción: los ciclos impares no son 2-coloreables | §2 |
| 29 | Lema de capas BFS: Caso (i) y Caso (ii) | §3.1 |
| 30 | Demostración del Caso (i) (paridad de capas blancas y azules) | §3.2 |
| 31 | Demostración del Caso (ii) (construcción del ciclo impar con lca) | §3.3 |
| 32 | Corolario: es bipartito ssi no contiene ciclos impares | §3.3 y Laboratorio |
| 33 | Agenda de Grafos Dirigidos: Connectivity in directed graphs | §5 |
| 34 | Definición y notación de digrafos: pares ordenados | §5.1 |
| 35 | Ejemplo de la World Wide Web y motores de búsqueda | §5.3 |
| 36 | Ejemplo de red vial con calles de un solo sentido | §5.3 |
| 37 | Estudio de la blogosfera política (Adamic y Glance 2005) | §5.3 |
| 38 | Ejemplo de red trófica ecológica (presa a depredador) | §5.3 |
| 39 | Tabla de aplicaciones de grafos dirigidos | §5.3 |
| 40 | Alcanzabilidad dirigida, camino más corto y Web crawler | §6 |
| 41 | Conectividad fuerte: definición y Lema del nodo testigo | §7.1 y §7.2 |
| 42 | Algoritmo de conectividad fuerte en con BFS en y | §7.3 |
| 43 | Definición de componentes fuertemente conexas (SCC) y Teorema de Tarjan 1972 | §8 |
Conexiones
- Anterior: Clase del 3 de septiembre: Grafos, representaciones, árboles y BFS básico.
- Recurso interactivo de esta clase:
![[biparticion-y-conectividad-fuerte.htm]] - Siguiente clase: Clase del 10 de septiembre: DAGs y Ordenamiento Topológico.