Matemáticas II · Tema 7 · Sección 7.2

Ejercicios resueltos de algoritmos de búsqueda

4 ejercicios resueltos paso a paso del tema 7 de Matemáticas II (Teoría de grafos). El enunciado está a la vista y la solución, plegada: intenta cada ejercicio antes de abrirla.

Ejercicio 1

Dificultad: Básico

Aplicar BFS y DFS al grafo GG con vértices {1,2,3,4,5,6}\{1, 2, 3, 4, 5, 6\} y aristas {{1,2},{1,3},{2,4},{3,5},{4,6},{5,6}}\{\{1{,}2\}, \{1{,}3\}, \{2{,}4\}, \{3{,}5\}, \{4{,}6\}, \{5{,}6\}\} comenzando desde el vértice 11. Comparar los órdenes de visita y las distancias obtenidas.

Ver solución paso a paso4 pasos
  1. Paso 1
    Construir la representación del grafo

    Lista de adyacencia:

    • 11: [2, 3]
    • 22: [1, 4]
    • 33: [1, 5]
    • 44: [2, 6]
    • 55: [3, 6]
    • 66: [4, 5]
  2. Paso 2
    Aplicar BFS desde vértice 1
    IteraciónCola QProcesandoVisitadosDistancias
    0[1]-{1}d(1)=0
    1[2,3]1{1,2,3}d(2)=1, d(3)=1
    2[3,4]2{1,2,3,4}d(4)=2
    3[4,5]3{1,2,3,4,5}d(5)=2
    4[5,6]4{1,2,3,4,5,6}d(6)=3
    5[6]5{1,2,3,4,5,6}-
    6[]6{1,2,3,4,5,6}-

    Orden BFS: 1 → 2 → 3 → 4 → 5 → 6

  3. Paso 3
    Aplicar DFS desde vértice 1 (recursivo)

    Asumiendo orden lexicográfico en listas de adyacencia:

    PasoVisitandoStackAcción
    11[1]Ir a vecino 2
    22[1,2]Ir a vecino 4
    34[1,2,4]Ir a vecino 6
    46[1,2,4,6]Ir a vecino 5
    55[1,2,4,6,5]Ir a vecino 3
    63[1,2,4,6,5,3]Sin vecinos no visitados
    7-[1,2,4,6,5]Retroceder
    8-...Continúa retroceso

    Orden DFS: 1 → 2 → 4 → 6 → 5 → 3

  4. Paso 4
    Comparar resultados

    BFS (por niveles):

    • Nivel 0: {1}
    • Nivel 1: {2, 3}
    • Nivel 2: {4, 5}
    • Nivel 3: {6}

    DFS (en profundidad): Explora un camino completamente antes de retroceder

    Distancias desde vértice 1: d(1)=0, d(2)=1, d(3)=1, d(4)=2, d(5)=2, d(6)=3

Ejercicio 2

Dificultad: Intermedio

Determinar el número de componentes conexas del grafo HH con vértices {A,B,C,D,E,F,G,H}\{A, B, C, D, E, F, G, H\} y aristas {{A,B},{B,C},{D,E},{F,G},{F,H},{G,H}}\{\{A,B\}, \{B,C\}, \{D,E\}, \{F,G\}, \{F,H\}, \{G,H\}\}. Para cada componente, encontrar un árbol de expansión.

Ver solución paso a paso4 pasos
  1. Paso 1
    Aplicar algoritmo de componentes conexas

    Inicializar todos los vértices como no visitados.

    DFS desde A:

    • Visita A → B → C
    • Componente 1: {A, B, C}

    DFS desde D (primer no visitado):

    • Visita D → E
    • Componente 2: {D, E}

    DFS desde F (primer no visitado):

    • Visita F → G → H
    • Componente 3: {F, G, H}
  2. Paso 2
    Identificar componentes

    El grafo HH tiene 3 componentes conexas:

    1. Componente 1: {A, B, C}
    2. Componente 2: {D, E}
    3. Componente 3: {F, G, H}
  3. Paso 3
    Encontrar árboles de expansión para cada componente

    Componente 1: {A, B, C} con aristas {AB, BC}

    • Árbol de expansión: A—B—C
    • Aristas del árbol: {AB, BC}

    Componente 2: {D, E} con arista {DE}

    • Árbol de expansión: D—E
    • Aristas del árbol: {DE}

    Componente 3: {F, G, H} con aristas {FG, FH, GH}

    • Es un ciclo, necesitamos eliminar una arista
    • Árbol de expansión posible: F—G—H
    • Aristas del árbol: {FG, GH} (eliminamos FH)
  4. Paso 4
    Verificación

    Para cada árbol con nn vértices, debe tener exactamente n−1n-1 aristas:

    • Componente 1: 3 vértices, 2 aristas ✓\checkmark
    • Componente 2: 2 vértices, 1 arista ✓\checkmark
    • Componente 3: 3 vértices, 2 aristas ✓\checkmark

Ejercicio 3

Dificultad: Avanzado

Usar DFS para detectar ciclos en un grafo dirigido DD con vértices {1,2,3,4,5}\{1, 2, 3, 4, 5\} y aristas dirigidas {(1,2),(2,3),(3,4),(4,2),(1,5),(5,4)}\{(1{,}2), (2{,}3), (3{,}4), (4{,}2), (1{,}5), (5{,}4)\}. Implementar el algoritmo de clasificación de aristas.

Ver solución paso a paso4 pasos
  1. Paso 1
    Algoritmo DFS para detección de ciclos en grafos dirigidos

    Estados de vértices:

    • Blanco: No visitado
    • Gris: En proceso (en el stack de recursión)
    • Negro: Completamente procesado

    Regla: Si durante DFS encontramos una arista hacia un vértice gris, hay un ciclo.

  2. Paso 2
    Implementar DFS con clasificación de aristas

    Lista de adyacencia:

    • 1: [2, 5]
    • 2: [3]
    • 3: [4]
    • 4: [2]
    • 5: [4]

    Ejecutar DFS desde vértice 1:

    TiempoAcciónVérticeEstadoAristaTipo de arista
    1Iniciar1Gris--
    2Visitar2Gris(1,2)Tree edge
    3Visitar3Gris(2,3)Tree edge
    4Visitar4Gris(3,4)Tree edge
    5Encontrar2Gris(4,2)Back edge
    6Retroceder4Negro--
    7Retroceder3Negro--
    8Retroceder2Negro--
    9Visitar5Gris(1,5)Tree edge
    10Encontrar4Negro(5,4)Cross edge
    11Retroceder5Negro--
    12Terminar1Negro--
  3. Paso 3
    Identificar ciclos

    Ciclo detectado: La arista (4,2) es una back edge porque conecta el vértice 4 (actual) con el vértice 2 (antepasado en el árbol DFS).

    Ciclo encontrado: 2 → 3 → 4 → 2

  4. Paso 4
    Clasificación completa de aristas
    • (1,2): Tree edge
    • (2,3): Tree edge
    • (3,4): Tree edge
    • (4,2): Back edge (indica ciclo)
    • (1,5): Tree edge
    • (5,4): Cross edge

    Conclusión: El grafo dirigido contiene un ciclo.

Ejercicio 4

Dificultad: Experto

Diseñar un algoritmo para encontrar todos los puentes (aristas críticas) de un grafo conexo usando DFS. Aplicar el algoritmo al grafo con vértices {a,b,c,d,e,f}\{a, b, c, d, e, f\} y aristas {{a,b},{b,c},{c,d},{d,e},{e,f},{f,c},{b,e}}\{\{a,b\}, \{b,c\}, \{c,d\}, \{d,e\}, \{e,f\}, \{f,c\}, \{b,e\}\}.

Ver solución paso a paso5 pasos
  1. Paso 1
    Algoritmo de Tarjan para encontrar puentes

    Un puente es una arista cuya eliminación aumenta el número de componentes conexas.

    Conceptos clave:

    • disc[v]disc[v]: tiempo de descubrimiento del vértice vv
    • low[v]low[v]: menor tiempo de descubrimiento alcanzable desde vv
    • Una arista (u,v)(u,v) es puente si low[v]>disc[u]low[v] > disc[u]
  2. Paso 2
    Aplicar DFS desde vértice aa

    Lista de adyacencia:

    • a: [b]
    • b: [a, c, e]
    • c: [b, d, f]
    • d: [c, e]
    • e: [d, f, b]
    • f: [e, c]
  3. Paso 3
    Ejecutar algoritmo de Tarjan
    VérticePadreDiscLowAcción
    a-00Inicio
    ba11Desde a
    cb21Desde b; hereda low[d]=1low[d] = 1
    dc31Desde c; hereda low[e]=1low[e] = 1
    ed41Desde d, actualiza low por back edge a b
    fe52Desde e, actualiza low por back edge a c
  4. Paso 4
    Verificar condiciones de puente

    Para cada arista (u,v)(u,v) en el árbol DFS:

    • (a,b): low[b]=1>disc[a]=0low[b] = 1 > disc[a] = 0 → Puente
    • (b,c): low[c]=1≯disc[b]=1low[c] = 1 \not> disc[b] = 1 → No es puente
    • (c,d): low[d]=1≯disc[c]=2low[d] = 1 \not> disc[c] = 2 → No es puente
    • (d,e): low[e]=1≯disc[d]=3low[e] = 1 \not> disc[d] = 3 → No es puente
    • (e,f): low[f]=2≯disc[e]=4low[f] = 2 \not> disc[e] = 4 → No es puente

    Aristas back:

    • (e,b): No es puente (crea ciclo)
    • (f,c): No es puente (crea ciclo)
  5. Paso 5
    Resultado final

    Puentes encontrados: {(a,b)}\{(a,b)\}

    Verificación:

    • Eliminar (a,b): separa {a} de {b,c,d,e,f}
    • Eliminar (b,c): no desconecta, porque queda el camino b–e–d–c
    • Eliminar (c,d): no desconecta, porque queda el camino c–f–e–d

    Solo la eliminación de (a,b) aumenta las componentes conexas de 1 a 2.