Está en la página 1de 42

Grafos en Data Science

Semestre 02/2022

Clase 06 - Minimum Spanning Trees

23/08/2022

Profesor: Miguel Romero


Correo: miguel.romero.o@uai.cl

Ayudante: Dora Jimenez


Correo: doramariela@gmail.com
Minimum spanning trees: motivación
Red eléctrica:
- Nodos: casas
- Aristas: posibilidad de instalar un cable entre dos casas
- Costo de arista: costo de instalar el cable

9 8

1 3 3

4 7
2

• ¿Cómo conectamos todos los nodos de manera que el costo sea mínimo?
• ¿Entre qué casas instalamos cables?
Minimum spanning trees: motivación
Red eléctrica:
- Nodos: casas
- Aristas: posibilidad de instalar un cable entre dos casas
- Costo de arista: costo de instalar el cable
Costo = 22
No conecta todas las casas
5

9 8

1 3 3

4 7
2

• ¿Cómo conectamos todos los nodos de manera que el costo sea mínimo?
• ¿Entre qué casas instalamos cables?
Minimum spanning trees: motivación
Red eléctrica:
- Nodos: casas
- Aristas: posibilidad de instalar un cable entre dos casas
- Costo de arista: costo de instalar el cable
Costo = 37
Sí conecta todas las casas
5

9 8

1 3 3

4 7
2

• ¿Cómo conectamos todos los nodos de manera que el costo sea mínimo?
• ¿Entre qué casas instalamos cables?
Minimum spanning trees: motivación
Red eléctrica:
- Nodos: casas
- Aristas: posibilidad de instalar un cable entre dos casas
- Costo de arista: costo de instalar el cable
Costo = 20
Sí conecta todas las casas
5

9 8

1 3 3

4 7
2

• ¿Cómo conectamos todos los nodos de manera que el costo sea mínimo?
• ¿Entre qué casas instalamos cables?
Minimum spanning trees: motivación
Red eléctrica:
- Nodos: casas
- Aristas: posibilidad de instalar un cable entre dos casas
- Costo de arista: costo de instalar el cable
Costo = 17
Sí conecta todas las casas
5

9 8

1 3 3

4 7
2

• ¿Cómo conectamos todos los nodos de manera que el costo sea mínimo?
• ¿Entre qué casas instalamos cables?
Minimum spanning trees: de niciones

Decimos que T es un spanning tree (árbol cobertor) de un grafo G si:

• T es un subgrafo de G
• T es un árbol
• T contiene todos los nodos de G

Decimos que T es un minimum spanning tree (árbol cobertor)


de un grafo con pesos G si es un spanning tree de peso mínimo

Observaciones:
• El peso de un spanning tree es la suma de los pesos de sus aristas
• Un grafo que no es conexo no puede tener un spanning tree
(pero cada una de sus componentes conexas sí)
fi
Minimum spanning trees: propiedades

• ¿Cuántas aristas tiene un minimum spanning tree?


n−1

• ¿Siempre existe un único minimum spanning tree?


No! Por ejemplo, si todas las aristas tienen el mismo peso, van a existir varios

• Si los pesos de todas las aristas son distintos,


entonces sí existe un único minimum spanning tree

• Propiedad de Corte:
Para cualquier corte del grafo (separación de los nodos en dos partes),
si e es una arista con menor peso que todas las otras en el corte,
entonces e es parte de todos los minimum spanning trees
(en caso de unicidad, e es parte del único minimum spanning tree)

En caso de empate, es decir, si e tiene peso mínimo entre las aristas del corte,
pero hay otra artista con igual peso en el corte,
tenemos que e es parte de algún minimum spanning tree (no necesariamente todos)
Minimum spanning trees: algoritmos

¿Dado un grafo con pesos G, cómo calculamos un minimum spanning tree de G?

Algoritmos clásicos:

• Algoritmo de Prim (1957)


(Inventado en 1930 por Jarník, y redescubierto en 1957 por Prim y en 1959 por Dijkstra)

• Algoritmo de Kruskal (1956)


Algoritmo de Prim

En cada fase del algoritmo mantenemos una solución parcial


- Solución parcial: un árbol (no necesariamente cobertor)

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim

En cada fase del algoritmo mantenemos una solución parcial


- Solución parcial: un árbol (no necesariamente cobertor)

T
5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim

En cada fase del algoritmo mantenemos una solución parcial


- Solución parcial: un árbol (no necesariamente cobertor)

Dada una solución parcial tenemos aristas de corte

- Aristas de corte: conectan un nodo de la solución parcial


con otro nodo afuera de la solución parcial

T
5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim

En cada fase del algoritmo mantenemos una solución parcial


- Solución parcial: un árbol (no necesariamente cobertor)

Dada una solución parcial tenemos aristas de corte

- Aristas de corte: conectan un nodo de la solución parcial


con otro nodo afuera de la solución parcial

Ejemplo:
Aristas de corte de T = { {A,B}, {B,C}, {C,E}, {D,F}, {E,F} }

T
5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim

En cada fase del algoritmo mantenemos una solución parcial


- Solución parcial: un árbol (no necesariamente cobertor)

Dada una solución parcial tenemos aristas de corte

- Aristas de corte: conectan un nodo de la solución parcial


con otro nodo afuera de la solución parcial

Idea del algoritmo:


• Partimos con una solución parcial base:
- Un árbol que contiene un sólo nodo u, donde u es escogido arbitrariamente

• En cada fase expandimos nuestra solución parcial,


hasta terminar con un spanning tree
- Dada la solución parcial actual T, escogemos la arista de corte de T
con peso mínimo, la cual llamamos e.
- Agregamos e a la solución parcial T y volvemos a iterar.
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Al comienzo T contiene sólo el nodo F


Arista de corte de T con peso mínimo = {E,F}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {C,E}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {B,C}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {D,E}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {A,C}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Obtenemos la solución nal (peso 17)

5
B D
9 8

A 1 3 3 F

4 7
C E
2
fi
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Al comienzo T contiene sólo el nodo A


Arista de corte de T con peso mínimo = {A,C}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {B,C}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {C,E}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {D,E}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Arista de corte de T con peso mínimo = {E,F}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Prim: ejemplos

Solución parcial
Aristas de corte

Obtenemos la solución nal (peso 17)

5
B D
9 8

A 1 3 3 F

4 7
C E
2
fi
Algoritmo de Prim: observaciones nales

• La forma clásica de implementar Prim es usando una cola de prioridad

- En cada iteración, utilizamos la cola para obtener la artista de corte con peso mínimo

• La complejidad depende de la implementación de la cola de prioridad


(recordar que asumimos representación por listas de adyacencias):

- Naive con arreglo: O(n 2)


- Heap binario en arreglo: O(m log n)
- Fibonacci heaps: O(m + n log n)

fi
Algoritmo de Kruskal

Un bosque es un grafo acíclico


(cada componente conexa de un bosque es un árbol)

Solución parcial = un bosque

Idea del algoritmo:


• Partimos con una solución parcial base:
Un bosque F donde cada nodo es una componente conexa
Algoritmo de Kruskal

Un bosque es un grafo acíclico


(cada componente conexa de un bosque es un árbol)

Solución parcial = un bosque

Idea del algoritmo:


• Partimos con una solución parcial base:
Un bosque F donde cada nodo es una componente conexa
• Visitamos cada arista en orden de menor a mayor peso:
Dada una arista e, la agregamos a F sólo si no genera un ciclo
(es decir, si sus extremos están en componentes conexas distintas de F)
• Retornamos F
Algoritmo de Kruskal: ejemplo

{B,C}, {C,E}, {B,E}, {D,E}, {A,C}, {B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{C,E}, {B,E}, {D,E}, {A,C}, {B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{B,E}, {D,E}, {A,C}, {B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{D,E}, {A,C}, {B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{A,C}, {B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{B,D}, {E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{E,F}, {D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{D,F}, {A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

{A,B}

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

5
B D
9 8

A 1 3 3 F

4 7
C E
2
Algoritmo de Kruskal: ejemplo

Obtenemos la solución nal (peso 17)

5
B D
9 8

A 1 3 3 F

4 7
C E
2
fi
Algoritmo de Kruskal: observaciones nales

• Para la implementación necesitamos manipular las componentes de un bosque


- Necesitamos chequear cuándo dos nodos están en la misma componente
- Necesitamos ser capaces de juntar dos componentes en una

• Existen varias estructuras de datos para manipular conjuntos distintos


y hacer las operaciones antes mencionados.
La más clásica es una estructura llamada Union-Find

• Utilizando la implementación clásica de Union-Find,


es posible implementar el algoritmo de Kruskal con complejidad O(m log n)

fi
Prim vs Kruskal
En teoría:

• Prim es O(m + n log n) usando Fibonacci heaps y O(m log n) usando binary heaps

• Kruskal es O(m log n) usando estructura Union-Find


• El tiempo de Prim crece más lento asintóticamente que el de Kruskal

En la práctica:
• Los dos son utilizados ampliamente
• Prim puede funcionar mejor cuando el grafo tiene una gran cantidad
de aristas, por ejemplo, cuando m = O(n 2)
• Kruskal puede funcionar mejor cuando hay pocas aristas (m = O(n)),
o cuando las aristas ya están ordenadas. Las estructuras de datos utilizadas
en Kruskal son en general más simples que las de Prim (Fibonacci heaps)

Los dos algoritmos son útiles e interesantes


y cuál de los dos utilizar depende del contexto

También podría gustarte