Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ndice general:
1. Caminos Mnimos en un Grafo sin Pesos
Tema 15 - Soluciones Greedy 2. Caminos Mnmos en un Grafo ponderado
para Problemas de Optimizacin 1. Algoritmo de Dijkstra
sobre un Grafo 3. Ordenacin Topolgica
4. Algoritmos para obtener el rbol generador mnimo
1. Algoritmos de Prim y Kruskal
Germn Molt
Escuela Tcnica Superior de Ingeniera Informtica
Universidad Politcnica de Valencia
1 2
5 6
Reformulacin del BFS para el Clculo Traza de Camino Mnimo Sin Pesos
del Camino Mnimo Sin Pesos (distanciaMin)
Recorrido en Anchura o Breadth First Search (BFS) del Vrtice origen:V2 Vertices distanciaMin
Vrtice dado, vOrigen, en el que visitados pasa a ser 0 1 2 3 4 5 6
v0 v1
distanciaMin. 2 | q = 2| q = 0
- - - - - -
distanciaMin[i] representa la Distancia mnima desde el Vrtice 2| q = 0 , 5 1- - - - - 1 -
vv2 v3 v4 0| q = 5 , 1 , 3 2 2
dado vOrigen al Vrtice i. - - - - - -
5| q = 1 , 3 - - - - - -
distanciaMin[vOrigen] == 0 1| q = 3 , 4 - - - - 3- - -
v5 v6
si distanciaMin[i] == el Vrtice i no se ha visitado an - - - - - - -
- - - - - - -
si distanciaMin[i] != el Vrtice i s se ha visitado, desde un como distanciaMin[3] != - - - - - - -
cierto vrtice vAnterior: NO cambia su valor a 3 1 2 0 2 3 1
distanciaMin[i]=distanciaMin[vAnterior]+1
De esta manera el algoritmo controla los vrtices que ya han
sido visitados anteriormente. Aunque en esta traza los
vrtices se numeren de 0..N, de
normal los numeramos de 1..N
7 8
Traza de Camino Mnimo Sin Pesos Traza de Camino Mnimo Sin Pesos
(distanciaMin): Tabla Final (caminoMin)
Vrtice distanciaMin Cola Para guardar el camino, utilizamos un vector llamado
1 2 3 4 5 6 7 caminoMin:
caminoMin[i] == -1 si el Vrtice i an NO es del Camino Mnimo.
0 3 caminoMin[i] == vAnterior si el Vrtice i se alcanza desde
3: 1 6 1 0 1 16 vAnterior en el Camino Mnimo.
Vertices distanciaMin caminoMin
1: 2 4 1 2 0 2 1 624
0 1 2 3 4 5 6 0 1 2 3 4 5 6
6: 1 2 0 2 1 24 v0 v1 2 | q =2| 0 -1 -1 -1 -1 -1 -1 -1
2: 4 5 1 2 0 2 3 1 45 2 | q =0 1 - - - - - - -2 - - - - - -
2 | q =0, 5 - - - - - 1 - - - - - - 2- -
4: 3 5 6 7 1 2 0 2 3 1 3 57 v2 v3 v4 0 | q =5, 1 - 2 - - - - - - -0 - - - - -
5: 7 1 2 0 2 3 1 3 7 0 | q =5, 1, 3 - - - 2 - - - - - - 0- - - -
v1 v2 5 | q =1, 3 - - - - - - - - - - - - - -
7: 6 1 2 0 2 3 1 3 v5 v6 1 | q =3, 4 - - - - 3 - - - - - - 1- - -
3 | q =4, 6 - - - - - - 3 - - - - - - 3-
v3 v4 v5 4 | q =6 - - - - - - - - - - - - - -
6|q= - - - - - - - - - - - - - -
9 1 2 0 2 3 1 3 2 0 -1 0 1 2 3
v6 v7 10
eda
mda 5
5 9
9
27 28
Ejemplo de Ordenacin Topolgica Ejemplo de Ordenacin Topolgica
Vrtice Visitados Pila pVrecorridos
Si representamos la secuencia de vrtices obtenida en lnea y dibujamos las
123456789 aristas, se puede apreciar mejor el orden topolgico.
000000000
1: 2 3 4 5 100000000 <> 7
2
2: {} 120000000 <2>
6
3: 2 6 8 123000000 <2> 3
6: 7 123004000 <2> Grafo Original
1
7: 2 123004500 <7, 2>
8
--- 123004500 <6,7,2> 4
8: 6 123004560 <8,6,7,2>
5 9 Grafo mostrado en orden topolgico
--- 123004560 <3,8,6,7,2>
4: 3 8 123704560 <4,3,8,6,7,2>
5: {} 123784560 <5,4,3,8,6,7,2>
--- 123784560 <1,5,4,3,8,6,7,2>
9 1 5 4 3 8 6 7 2
9: 5 8 123784569 <9,1,5,4,3,8,6,7,2>
29 30
31 32
Implementacin de Ordenacin
Topolgica (2) rbol Generador Mnimo: Introduccin
protected void ordenacionTopologica(int origen, Un grafo no dirigido es conexo si cualquier par de vrtices
Pila<Integer> pVRecorridos) { estn conectados por un camino.
visitados[origen] = ordenVisita++; Un rbol es un grafo no dirigido acclico y conexo.
ListaConPI<Adyacente> aux = adyacentesDe(origen); Un rbol generador mnimo (o rbol recubridor mnimo
for (aux.inicio(); !aux.esFin(); aux.siguiente()) { (minimum spanning tree)) de un grafo es un subgrafo que es
int destino = aux.recuperar().destino; un rbol y permite conectar todos los vrtices donde la suma
del peso de sus aristas debe ser lo ms pequea posible.
if (visitados[destino] == 0)
El rbol generador mnimo de un grafo tiene:
ordenacionTopologica(destino, pVRecorridos); El mismo nmero de vrtices
} Un subconjunto de sus aristas
pVRecorridos.apilar(new Integer(origen)); Dos algoritmos de clculo del rbol generador mnimo.
} Algoritmo de Kruskal
Algoritmo de Prim
33 34
El rbol generador mnimo permite conectar todos los vrtices con coste Complejidad temporal:
mnimo. Tkruskal(|E|, |V|) = O(|E| * log2(|V|))
35 36
Ejemplo Animado del Algoritmo de
Kruskal Algoritmo de Prim
El algoritmo de Kruskal siempre selecciona la arista de menor
3
7 8 3 peso, causando una construccin desordenada del rbol.
2 7
7 2 El algoritmo de Prim provoca un crecimiento ordenado a
3
2 6 3
1 3 2 6 partir de un determinado vrtice (elegido de forma arbitraria).
9 1 3
1 8
9 Pasos:
2 1
5 8 2
5
1. El rbol resultante (V, E) contiene inicialmente un solo
4 8
13 4 vrtice (arbitrario) y ninguna arista.
4
5 9
4 2. Mientras |V| < |V| hacer
3 5 9 1. Buscar la arista e = (u,v) de coste mnimo, con u V y v no
3
pertenece a V.
Se van eligiendo las aristas de menor de coste y, si no forman 2. E = E + e
ciclos, se aaden al rbol. 3. V = V + v
A igualdad de coste, las aristas se escogen de forma arbitraria. Complejidad temporal: Tprim(|E|, |V|) = O(|E| * log2(|V|))
37 38