Está en la página 1de 51

UPC

COMPLEJIDAD ALGORTIMICA – CC76

Árbol de Expansión Mínima

UNIDAD III. ANÁLISIS MATEMÁTICO DE ALGORITMOS


Mapa Conceptual del Curso

ANÁLISIS
FUNCIONES,
GRAFOS Y MATEMÁTICO DE
NOTACIÓN ESTRATEGIAS DE
BÚSQUEDA EN ALGORITMOS;
ASINTÓTICA Y BUSQUEDA
GRAFOS. ALGORITMOS EN
BACKTRACKING
GRAFOS

2
Tabla de Contenido
• MOTIVACIÓN • ALGORITMO DE PRIM
– ¿Cómo conectar N ciudades? – Algoritmo de Prim
– ¿Cómo conectar una ciudad? – Análisis
– ¿Cómo diseño de circuitos electrónicos?
– ¿Cómo diseñar de transporte de flujo? • ALGORITMO DE KRUSKAL
– Algoritmo de Kruskal
• ÁRBOL DE EXPANSIÓN – Análisis
– Árbol de Expansión

• ÁRBOL DE EXPANSIÓN MÍNIMA


– Árbol de Expansión Mínima
– Requerimiento
– Propiedades
– Algoritmos

3
MOTIVACIÓN
2
2 b d 3

s 4
1 t
3 3 2
a c
¿Cómo conectar N ciudades?

5
¿Cómo conectar una ciudad?

6
¿Cómo diseño de circuitos electrónicos?
• Usar la menor cantidad posible de cable.

Fuente: http://www.hexapolis.com/wp-content/uploads/2015/02/Reconfigurable-Electronic-Circuits-51.jpg

7
¿Cómo diseñar de transporte de flujo?
• De computadoras, transporte, flujo hídrico, etc.
• Minimizar el uso de recursos de construcción.

Fuente: http://www.ecritel.fr/IMG/jpg/network2.jpg

8
Aplicaciones
• Diseño de redes de telecomunicaciones nacionales e
internacionales.

• Diseño de redes de transporte nacional o internacional,


para minimizar el costo total de los desplazamientos.

• Diseño de redes de transmisión de energía.

• Diseño de redes de tuberías de agua o desagüe.

9
Requerimiento
• Sea un grafo no dirigido, con pesos. a
6 5

b 1 d
5 5
f
3 6 4 2

c e
6

• Conectar todos los nodos de una red, de tal forma que no


formen ciclos entre ellos. a

b 1 d
5
f
3 4 2

c e
Solución= 3+5+1+4+2 = 15
10
ÁRBOL DE EXPANSIÓN
Árbol de Expansión
• Un árbol de expansión de un grafo G=(V, A) no dirigido y
conexo es un subgrafo G’=(V, A’) conexo y sin ciclos.
4
1 2
1 1
3
3 2 4 3 2
4 5
2 5 3 5 2 5 3 5

5 2 5 3 5 2 5 3

• Los árboles de expansión en profundidad y en anchura de


un grafo conexo.

12
Árbol de Expansión

• En grafos con pesos, el coste del árbol de expansión es la


suma de los costes de las aristas.

13
Árbol de Expansión
• Sea el grafo:

A T

O B D

C E

14
Árbol de Expansión
A T

O B D
Red no conexa. No es árbol

C E

A T
B DD
O

C E Red con ciclo, no es un árbol

15
Árbol de Expansión

A T
B DD
O

C E

Un árbol de expansión: Tiene n nodos y n-1 arcos

16
ÁRBOL DE EXPANSIÓN
MÍNIMA
Árbol de Expansión Mínima
• Árbol de expansión mínima.

• Árbol de cubrimiento de costo mínimo.

• Árbol recubridor mínimo

18
Requerimiento
• Dado un grafo G = (V, A)

– No dirigido

– Valorado, con pesos no negativos

19
Árbol de Expansión Mínima
• Para un grafo G = (V, A) no dirigido y conexo

• El árbol de expansión mínima:


– Es un subgrafo G’=(V, A’) conexo y sin ciclos.
– Tal que la suma de sus aristas sea mínima.

• Problema:
– Dado un grafo ponderado no dirigido, encontrar el árbol
de expansión de menor coste.

20
Propiedades
Propiedad:
• Sea G = (V, E) un grafo conectado con pesos.
• Sea U un subconjunto del conjunto de vértices V.
– Si e=(u, v) es la arista de menor costo considerando
que: u  U y v  V-U
– Entonces hay un árbol de expansión mínima que
incluye (u, v) como arista.

V-U

U
e
21
Algoritmos
• Algoritmos comunes para resolver el problema:
– Prim
– Kruskal

• Ambos algoritmos
– utilizan la propiedad anterior.
– son de tipo voraz: se selecciona uno de los candidatos
con el criterio que es mejor en cada momento (menor
costo).

22
Ejercicio
• Calcular todos los servidores, de tal forma que se pueda
llegar a todos los otros servidores, desde cualquier
servidor.

2
3
1 6 2
3
5 4
5

23
ALGORITMO DE PRIM
Algoritmo de Prim
1. Empezar en un vértice cualquiera v. El árbol
consta inicialmente sólo del nodo v.

2. En el resto de vértices, buscar el que esté más


próximo a v (es decir, con la arista (v, w) de coste
mínimo). Añadir w y la arista (v, w) al árbol.

3. Buscar el vértice más próximo a cualquiera de


estos dos. Añadir ese vértice y la arista al árbol de
expansión.

4. Repetir sucesivamente hasta añadir los n vértices.


25
Algoritmo de Prim
Prim (G, T )
{
T=
U = {1}
while U  V
{
seleccionar la arista (u, v) de menor costo
tal que u  U y v  V-U
T = T  {(u, v)}
U = U  {v}
d[v] = dv
}
}

26
Algoritmo de Prim
• El árbol T aumenta un vértice cada vez.

• El array d[v] contiene el menor costo de la arista


que conecta v con el árbol.

• Tiene una complejidad O(n2).

27
Ejemplo

1 2
3
2
3 6 2
1
5 3
5 4
5
6
4
6

28
Ejemplo

1 2
2
3 2
1
5 3
5
6
4

29
Análisis
• La solución se construye poco a poco,
empezando con una solución “vacía”.

• Implícitamente, el algoritmo maneja los


conjuntos:
– V: Vértices del grafo.
– U: Vértices añadidos a la solución.
– V-U: Vértices que quedan por añadir.

• ¿Cómo implementar eficientemente la búsqueda:


encontrar el vértice de V-U más próximo a alguno
de los de U?

30
Ejercicio
• Encontrar el árbol de expansión mínima por el algoritmo de
Prim

31
Ejercicio

32
Ejercicio

A 7 T
2 5
2
5 B 4 D
O
3 1 7
1
4
C E
4

33
Ejercicio

A 7 T
2 5
2
5 B 4 D
O
3 1 7
1
4
C E
4

34
ALGORITMO DE KRUSKAL
Algoritmo de Kruskal
• Sea el grafo G= (V, A)

• Empezar con un grafo sin aristas: G’= (V, Ø)

• Seleccionar la arista de menor coste de A.


– Si la arista seleccionada forma un ciclo en G’, eliminarla.
– Si no, añadirla a G’.

• Repetir los dos pasos anteriores hasta tener n-1 aristas.

• ¿Cómo saber si una arista (v, w) provocará un ciclo en el


grafo G’?

36
Algoritmo de Kruskal
Kruskal (G, T)
{
for cada vértice v en G
C(v) = {v} /* grupo de vértices */
Q = cola de prioridad { (u, v)  G, clave = w(u, v) }
T=
while Q  0
{
Extraer de Q la arista (v, u) con menor peso
if C(v)  C(u) /* no forma ciclo */
T=T  { (v, u) }
C(v) = C(v)  C(u)
}
}

37
Algoritmo de Kruskal
• Añade una arista cada vez por orden de peso.
• Acepta una arista si no produce un ciclo.
• Se implementa usando una cola de prioridad.
• Tiene una complejidad O(e log e).

• Sabemos que en el árbol de expansión deben aparecer


todos los vértices de G
• Lo que no sabemos aún es qué arcos escoger para unirlos
• Lo que a Kruskal le interesara elegir son los arcos, no los
vértices, como en Prim

38
Ejemplo

1 2
3
2
3 6 2
1
5 3
5 4
5
6
4
6

39
Ejercicio

1 2
1 2 3

6 5
4 4 6
3 8
4 5 6

7
4 3
7

40
Ejercicio

1 2
1 2 3

4
3
4 5 6

4 3
7

41
Ejercicio
• Calcular el árbol de expansión mínima por Kruskal

42
Ejercicio

43
Ejercicio

44
Ejercicio

45
Análisis
• Implementación del algoritmo

• Necesitamos:
– Ordenar las aristas de G, de menor a mayor:
O(a log a).
– Saber si una arista dada (v, w) provocará un ciclo.

46
Análisis
• ¿Cómo comprobar rápidamente si (v, w) forma un ciclo?

• Una arista (v, w) forma un ciclo si v y w están en el mismo


componente conexo.

• La relación “están en el mismo componente conexo” es


una relación de equivalencia.

47
Análisis
Connected_Components(G)
for (cada vertice v en V[G] )
Make_Set(v);
for (cada arco (u,v) en E [G])
Union(u,v);

a b e f h j

c d g i

• Considerando que los arcos se procesan en el orden: (b,d); (e,g); (a,c);


(h,i); (a,b); (e,f); (b,c)

48
Referencias
• Cormen, Thomas H. and Others. Introduction to
Algorithms, Second Edition. 2001.

• Halim Steven & Felix. Competitive Programming.


Increasing the Lower Bound of Programming Contests

49
Visualización
PRIM
• https://www.cs.usfca.edu/~galles/visualization/Prim.html

Kruskal
• https://www.cs.usfca.edu/~galles/visualization/Kruskal.html

50
PREGUNTAS