Sunteți pe pagina 1din 17

Grafos

Árbol de expansión de
costo mínimo
ESTRUCTURAS DE DATOS Y PROGRAMACIÓN (LSI/PI)
PROGRAMACIÓN (PUI)
Un grafo es un árbol?
Un grafo se dice que es un árbol si es conexo y acíclico (no tiene
ciclos).
Los primeros dos grafos son árboles:

2
Árboles y bosque
Por tanto, un grafo es un árbol  entre cada par de vértices existe un camino y
sólo uno.
Un grafo se dice un bosque si sus componentes conexas son árboles.
Teorema.- Sea G(V,E) un grafo. Son equivalentes…
a) G es un árbol
b) Cada par de vértices distintos de V esta conectado por un único camino.
c) G es conexo y toda arista de G es de separación
d) G no tiene ciclos y |V| = |E| + 1
e) G es conexo y |V| = |E| + 1
f) G no tiene ciclos pero al añadirle una arista a G se crea un único circuito

3
Árbol de expansión
Definición.- Sea G un grafo, un árbol de expansión o generador de G es un subgrafo
conexo de G que tiene los mismos vértices que G y no tiene circuitos.

4
Árbol de expansión
Un árbol de expansión para un grafo G = (V, E) no dirigido conectado con pesos
es un árbol libre que conecta todos los vértices en V.
El costo de un árbol de expansión está determinado por la suma de los costos
de las aristas en el árbol.
Problema: hallar el árbol de expansión de costo mínimo para G.
Problema común en el planeamiento de redes de distribución y comunicación.
Árbol de expansión
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 de costo mínimo
que incluye (u, v) como arista.

V-U

U
e
Árbol de expansión
Supongamos que a cada arista se le asocia un número positivo (su peso). Un
árbol de expansión se dice de peso mínimo si la suma de los pesos de las aristas
que lo componen es lo menor posible
Para calcular el árbol de peso mínimo existen 2 algoritmos:
◦ Kruskal: Se van escogiendo las aristas de menor peso hasta conseguir un
árbol de peso mínimo
◦ Prim: Consiste en ir borrando las aristas de mayor peso posible y que no sean
aristas de separación.
Puede haber más de un árbol de expansión de peso mínimo, pero todos deben
tener el mismo peso.

7
Algoritmo de Prim
Similar al algoritmo de Dijkstra.
Aumenta el árbol T 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).
Algoritmo de Prim
La idea básica consiste en añadir, en cada paso, una arista de peso mínimo a un
árbol previamente construido. Más explícitamente:

Paso 1. Se elige un vértice u de G y se considera el árbol S={u}

Paso 2. Se considera la arista e de mínimo peso que une un vértice de S y un vértice


que no es de S, y se hace S=S+e

Paso 3. Si el nº de aristas de T es n-1 el algoritmo termina. En caso contrario se


vuelve al paso 2

9
ALGORITMO DE PRIM

10
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}
}
}
Algoritmo de Prim
1 1 1
6 5 6 5 6 5
1 1 1
2 5 5 4 2 5 5 4 2 5 5 4
3 3 3
3 6 4 2 3 6 4 2 3 6 4 2

5 6 5 6 5 6
6 6 6

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

5 6 5 6 5 6
6 6 6
Costo Total = 15
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).
Algortimo de Kruskal
La idea básica consiste en elegir sucesivamente las aristas de mínimo peso sin
formar ciclos.

Paso 1. Se elige la arista de mínimo peso e y se considera S={e}.

Paso 2. Sea e’ la arista de mínimo peso tal que e’ no existe en S y S+e' es un grafo
acíclico. Se hace S=S+e'.

Paso 3. Si S tiene n-1 aristas, el algoritmo termina. En caso contrario se vuelve al


paso 2.

14
ALGORITMO DE KRUSKAL

15
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)
T=T  { (v, u) }
C(v) = C(v)  C(u)
}
}
Algoritmo de Kruskal
1 1 1
6 5 6 5 6 5
1 1 1
2 5 5 4 2 5 5 4 2 5 5 4
3 3 3
3 6 4 2 3 6 4 2 3 6 4 2

5 6 5 6 5 6
6 6 6

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

5 6 5 6 5 6
6 6 6
Costo Total = 15

S-ar putea să vă placă și