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

Ejercicios resueltos de árboles de expansión mínima

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 los algoritmos de Kruskal y Prim al grafo ponderado GG con vértices {A,B,C,D,E}\{A, B, C, D, E\} y aristas con pesos: AB(6), AC(3), AD(9), BC(2), BD(4), BE(7), CD(1), CE(8), DE(5). Verificar que ambos producen el mismo peso total.

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

    Ordenar aristas por peso creciente:

    CD(1), BC(2), AC(3), BD(4), DE(5), AB(6), BE(7), CE(8), AD(9)

    PasoAristaPesoComponentes antes¿Añadir?Componentes después
    1CD1{A},{B},{C},{D},{E}Sí{A},{B},{C,D},{E}
    2BC2{A},{B},{C,D},{E}Sí{A},{B,C,D},{E}
    3AC3{A},{B,C,D},{E}Sí{A,B,C,D},{E}
    4BD4{A,B,C,D},{E}No{A,B,C,D},{E}
    5DE5{A,B,C,D},{E}Sí{A,B,C,D,E}

    MST de Kruskal: CD(1) + BC(2) + AC(3) + DE(5) = 11

  2. Paso 2
    Aplicar algoritmo de Prim (comenzando desde A)
    PasoVértices en MSTAristas candidatasMínimaAñadir
    1{A}AB(6), AC(3), AD(9)AC(3)C
    2{A,C}AB(6), AD(9), BC(2), CD(1), CE(8)CD(1)D
    3{A,C,D}AB(6), AD(9), BC(2), CE(8), DE(5)BC(2)B
    4{A,C,D,B}AB(6), AD(9), BE(7), CE(8), DE(5)DE(5)E

    MST de Prim: AC(3) + CD(1) + BC(2) + DE(5) = 11

  3. Paso 3
    Verificación

    Ambos algoritmos producen MSTs con el mismo peso total: 11

    Las aristas seleccionadas son las mismas (aunque en diferente orden):

    • Kruskal: {CD, BC, AC, DE}
    • Prim: {AC, CD, BC, DE}
  4. Paso 4
    Propiedades verificadas
    • Número de aristas: n−1=5−1=4n-1 = 5-1 = 4 ✓\checkmark
    • Conecta todos los vértices ✓\checkmark
    • No contiene ciclos ✓\checkmark
    • Peso mínimo entre todos los árboles de expansión posibles ✓\checkmark

Ejercicio 2

Dificultad: Intermedio

Demostrar que si todas las aristas de un grafo conexo tienen pesos diferentes, entonces el MST es único. Construir un contraejemplo cuando existen aristas con pesos iguales.

Ver solución paso a paso3 pasos
  1. Paso 1
    Demostración de unicidad con pesos diferentes

    Teorema: Si todas las aristas tienen pesos diferentes, el MST es único.

    Demostración por contradicción:

    Supongamos que existen dos MSTs diferentes: T1T_1 y T2T_2.

    Como T1≠T2T_1 \neq T_2, existe al menos una arista e∈T1e \in T_1 tal que e∉T2e \notin T_2.

    Sea ee la arista de menor peso de la diferencia simétrica T1△T2T_1 \triangle T_2 (aristas que están en uno de los dos árboles pero no en el otro). Sin pérdida de generalidad, e∈T1e \in T_1 y e∉T2e \notin T_2.

    Al añadir ee a T2T_2, se crea exactamente un ciclo CC.

    En este ciclo debe existir al menos una arista f≠ef \neq e tal que f∉T1f \notin T_1 (si no, T1T_1 contendría el ciclo CC).

    Análisis de pesos:

    • f∈T2f \in T_2 y f∉T1f \notin T_1, luego ff está en la diferencia simétrica; por la elección de ee y porque los pesos son distintos: w(e)<w(f)w(e) < w(f)
    • T2∪{e}\{f}T_2 \cup \{e\} \setminus \{f\} es también un árbol de expansión, de peso w(T2)+w(e)−w(f)<w(T2)w(T_2) + w(e) - w(f) < w(T_2)

    Pero esto contradice que T2T_2 sea un MST.

    Conclusión: El MST es único cuando todos los pesos son diferentes.

  2. Paso 2
    Contraejemplo con pesos iguales

    Considerar el grafo:

    • Vértices: {A, B, C, D}
    • Aristas: AB(1), AC(2), AD(2), BC(3), BD(3), CD(1)

    MST 1 (usando Kruskal):

    Orden de aristas: AB(1), CD(1), AC(2), AD(2), BC(3), BD(3)

    • Añadir AB(1) → componentes: {A,B}, {C}, {D}
    • Añadir CD(1) → componentes: {A,B}, {C,D}
    • Añadir AC(2) → componentes: {A,B,C,D}

    MST1_1 = {AB, CD, AC}, peso = 4

    MST 2 (modificando orden):

    Orden alternativo: CD(1), AB(1), AD(2), AC(2), BC(3), BD(3)

    • Añadir CD(1) → componentes: {A}, {B}, {C,D}
    • Añadir AB(1) → componentes: {A,B}, {C,D}
    • Añadir AD(2) → componentes: {A,B,C,D}

    MST2_2 = {CD, AB, AD}, peso = 4

  3. Paso 3
    Verificar que ambos son MSTs válidos

    Ambos árboles:

    • Conectan todos los vértices ✓\checkmark
    • Tienen n−1=3n-1 = 3 aristas ✓\checkmark
    • No contienen ciclos ✓\checkmark
    • Tienen el mismo peso total: 4 ✓\checkmark

    Conclusión: Cuando existen aristas con pesos iguales, pueden existir múltiples MSTs.

Ejercicio 3

Dificultad: Avanzado

Diseñar un algoritmo modificado de Prim que encuentra el segundo mejor árbol de expansión (segundo MST). Aplicar a un grafo de ejemplo con al menos 6 vértices.

Ver solución paso a paso5 pasos
  1. Paso 1
    Algoritmo para el segundo MST

    Estrategia: Para cada arista del MST, encontrar el mejor árbol de expansión que no incluye esa arista.

    Algoritmo:

    1. Encontrar el MST usando Prim → peso W1W_1
    2. Para cada arista eie_i en el MST:
      • Calcular el mejor árbol de expansión sin eie_i → peso WiW_i
    3. El segundo MST es el de menor peso entre todos los WiW_i
  2. Paso 2
    Grafo de ejemplo

    Vértices: {A, B, C, D, E, F}

    Aristas con pesos:

    AB(2), AC(3), AD(6), AE(8), AF(9)

    BC(1), BD(4), BE(7), BF(5)

    CD(2), CE(6), CF(8)

    DE(3), DF(4)

    EF(1)

  3. Paso 3
    Encontrar el MST principal

    Aplicando Prim desde A:

    PasoEn MSTCandidatasMínimaAñadir
    1{A}AB(2), AC(3), AD(6), AE(8), AF(9)AB(2)B
    2{A,B}AC(3), AD(6), AE(8), AF(9), BC(1), BD(4), BE(7), BF(5)BC(1)C
    3{A,B,C}AD(6), AE(8), AF(9), BD(4), BE(7), BF(5), CD(2), CE(6), CF(8)CD(2)D
    4{A,B,C,D}AE(8), AF(9), BE(7), BF(5), CE(6), CF(8), DE(3), DF(4)DE(3)E
    5{A,B,C,D,E}AF(9), BF(5), CF(8), DF(4), EF(1)EF(1)F

    MST principal: {AB(2), BC(1), CD(2), DE(3), EF(1)}, peso = 9

  4. Paso 4
    Encontrar árboles alternativos

    Para cada arista del MST, calcular el mejor árbol sin ella:

    Sin AB(2): Necesitamos conectar A al resto

    • Mejor opción: AC(3)
    • Árbol: {AC(3), BC(1), CD(2), DE(3), EF(1)}, peso = 10

    Sin BC(1): Necesitamos reconectar {A,B}\{A,B\} con {C,D,E,F}\{C,D,E,F\}

    • Mejor opción: AC(3)
    • Árbol: {AB(2), AC(3), CD(2), DE(3), EF(1)}, peso = 11

    Sin CD(2): Necesitamos alternativa C-D

    • Mejor opción: BD(4)
    • Árbol: {AB(2), BC(1), BD(4), DE(3), EF(1)}, peso = 11

    Sin DE(3): Necesitamos alternativa D-E

    • Mejor opción: DF(4) + EF(1) ya está
    • Árbol: {AB(2), BC(1), CD(2), DF(4), EF(1)}, peso = 10

    Sin EF(1): Necesitamos alternativa E-F

    • Mejor opción: DF(4)
    • Árbol: {AB(2), BC(1), CD(2), DE(3), DF(4)}, peso = 12
  5. Paso 5
    Resultado

    Segundo MST: Peso = 10 con dos opciones equivalentes:

    1. {AC(3), BC(1), CD(2), DE(3), EF(1)}
    2. {AB(2), BC(1), CD(2), DF(4), EF(1)}

Ejercicio 4

Dificultad: Experto

Analizar la complejidad temporal de los algoritmos de Kruskal y Prim en función del número de vértices nn y aristas mm. Determinar cuál es más eficiente para grafos densos y dispersos.

Ver solución paso a paso5 pasos
  1. Paso 1
    Análisis de complejidad del algoritmo de Kruskal

    Pasos principales:

    1. Ordenar aristas: O(mlog⁡m)O(m \log m)
    2. Procesar aristas: mm iteraciones
    3. Union-Find por arista: O(α(n))O(\alpha(n)) amortizado

    Complejidad total de Kruskal: O(mlog⁡m+m⋅α(n))O(m \log m + m \cdot \alpha(n))

    Como α(n)\alpha(n) es prácticamente constante: O(mlog⁡m)O(m \log m)

    En términos de nn: Como m≤(n2)=n(n−1)2m \leq \binom{n}{2} = \frac{n(n-1)}{2}:

    O(mlog⁡m)=O(mlog⁡n2)=O(mlog⁡n)O(m \log m) = O(m \log n^2) = O(m \log n)

  2. Paso 2
    Análisis de complejidad del algoritmo de Prim

    Con heap binario:

    1. Inicialización: O(n)O(n)
    2. Extraer mínimo: nn veces, O(log⁡n)O(\log n) cada vez → O(nlog⁡n)O(n \log n)
    3. Actualizar claves: Hasta mm actualizaciones, O(log⁡n)O(\log n) cada una → O(mlog⁡n)O(m \log n)

    Complejidad total de Prim: O((n+m)log⁡n)O((n + m) \log n)

    Con heap de Fibonacci:

    • Extraer mínimo: O(nlog⁡n)O(n \log n) total
    • Decrease-key: O(m)O(m) total amortizado
    • Complejidad total: O(nlog⁡n+m)O(n \log n + m)
  3. Paso 3
    Comparación para diferentes tipos de grafos

    Grafos dispersos (m=O(n)m = O(n)):

    • Kruskal: O(nlog⁡n)O(n \log n)
    • Prim (heap binario): O(nlog⁡n)O(n \log n)
    • Prim (heap Fibonacci): O(nlog⁡n)O(n \log n)

    Grafos densos (m=O(n2)m = O(n^2)):

    • Kruskal: O(n2log⁡n)O(n^2 \log n)
    • Prim (heap binario): O(n2log⁡n)O(n^2 \log n)
    • Prim (heap Fibonacci): O(n2+nlog⁡n)=O(n2)O(n^2 + n \log n) = O(n^2)
  4. Paso 4
    Análisis espacial

    Kruskal:

    • Lista de aristas: O(m)O(m)
    • Union-Find: O(n)O(n)
    • Total: O(m+n)O(m + n)

    Prim:

    • Heap: O(n)O(n)
    • Arrays auxiliares: O(n)O(n)
    • Total: O(n)O(n)
  5. Paso 5
    Recomendaciones prácticas

    Usar Kruskal cuando:

    • El grafo es disperso (m≪n2m \ll n^2)
    • Las aristas se pueden ordenar fácilmente
    • Se necesita paralelización (más fácil con Kruskal)

    Usar Prim cuando:

    • El grafo es muy denso
    • Se dispone de heap de Fibonacci
    • Se trabaja con grafos donde nn es pequeño pero mm es grande

    Caso especial - Prim con matriz de adyacencia:

    Para grafos muy densos, Prim se puede implementar con complejidad O(n2)O(n^2) sin usar heap:

    Para cada vértice no en MST:

    Encontrar el de menor distancia al MST: O(n)

    Total: n iteraciones ×\times O(n) = O(n²)

    Conclusión:

    • Grafos dispersos: Ambos O(nlog⁡n)O(n \log n), empate
    • Grafos densos: Prim es superior, especialmente con heap de Fibonacci o implementación O(n2)O(n^2)