Académique Documents
Professionnel Documents
Culture Documents
Alberto Verdejo
Dpto. Sistemas Informticos y Programacin a o Universidad Completense de Madrid Enero de 2002
Caminos m nimos
Dado un grafo G = N, A dirigido y valorado, con N = {1, 2, . . . , n} y aristas con longitud positiva, Determinar la longitud de los caminos mnimos que van desde el origen hasta cada uno de todos los dems nodos a del grafo.
Algoritmo de Dijkstra Mantiene dos conjuntos: S, nodos seleccionados (la distancia desde el origen ya es conocida); y C, el resto. Inicialmente S slo contiene el origen. o Al terminar S = N . En cada paso, se selecciona aquel nodo de C cuya distancia al origen sea m nima y se aade a S. n
coste si i j A + si i j A
fun Dijkstra(G[1..n, 1..n]) dev D[2..n], P [2..n] C := {2, 3, . . . , n} para i = 2 hasta n hacer D[i] := G[1, i] P [i] := 1 fpara repetir n 2 veces v := nodo en C tal que D[v] sea m nimo C := C {v} para cada w C hacer si D[v] + G[v, w] < D[w] entonces D[w] := D[v] + G[v, w] P [w] := v fsi fpara frepetir ffun Complejidad: O(n2), n nodos.
100
50
Paso v
inic. {2, 3, 4, 5} [50, 30, 100, 10] [1, 1, 1, 1] 1 2 3 4 5 4 3 2 {2, 3, 4} {2, 3} {2} {} [50, 30, 20, 10] [1, 1, 5, 1] [40, 30, 20, 10] [4, 1, 5, 1] [35, 30, 20, 10] [3, 1, 5, 1] [35, 30, 20, 10] [3, 1, 5, 1]
PSfrag replacements
x S v
d(1, v) = d(1, x) + d(x, v) = D[x] + d(x, v) D[v] Paso inductivo (b): Cuando v se aade a S o bien el camino n especial ms corto a w no cambia, o bien ahora pasa por v. a El algoritmo compara D[w] con D[v] + G[v, w] y se queda con el menor.
Sfrag replacements
S v w
Un grafo conexo con n nodos debe tener al menos n1 aristas. Un grafo con n nodos y ms de n 1 aristas contiene al menos a un ciclo.
= T debe tener n 1 aristas, y como G es conexo, T es un arbol. G se denomina rbol de recubrimiento de coste mnimo (ARM). a
10
subconjunto B N . T A, conjunto prometedor de aristas tal que no haya ninguna arista de T que salga de B. e arista ms corta que sale de B. a
Entonces T {e} es prometedor. Demostracin: o Sea U un ARM de G tal que T U. Si e U, T {e} es prometedor. Si no, aadiendo e a U creamos un ciclo. n
ements
e
Eliminando e el ciclo desaparece y formamos un arbol V que abarca a G. V = U {e} {e } La longitud de V no sobrepasa la de U.
e B N \B
11
12
Kruskal: Ejemplo
1
4 1 6 3 4
2
4
2 5 8 3
3
6
Componentes conexas {1} {2} {3} {4} {5} {6} {7} {1, 2} {3} {4} {5} {6} {7} {1, 2, 3} {4} {5} {6} {7} {1, 2, 3} {4, 5} {6} {7} {1, 2, 3} {4, 5} {6, 7} {1, 2, 3, 4, 5} {6, 7} rechazada {1, 2, 3, 4, 5, 6, 7}
13
Kruskal: Correccin o
El algoritmo de Kruskal halla un arbol de recubrimiento de coste m nimo de un grafo G = N, A . Por induccin sobre el nmero de aristas de T probamos o u que T es siempre prometedor. Base: T = es prometedor, porque G es conexo. Hiptesis de induccin: T es prometedor antes de aadir la o o n arista e = u, v . Paso inductivo: Sea B el conjunto de nodos de la componente conexa que contiene a u.
B es un subconjunto estricto de N . T es prometedor y ninguna arista de T sale de B. e es una de las aristas ms cortas que sale de B. a
14
Kruskal: Algoritmo
Estructura de particin para mantener componentes conexas. o Grafo representado mediante vector de aristas con sus longitudes. fun Kruskal(G = N, A , longitud ) dev T { inicializacin } o ordenar A por longitudes crecientes n := nmero de nodos en N u T := inicializar particin {1} {2} . . . {n} o { bucle voraz } repetir e := u, v arista ms corta an no considerada a u compu := buscar(u) ; compv := buscar(v) si compu = compv entonces unir(compu, compv) T := T {e} fsi hasta T tiene n 1 aristas ffun Complejidad: O(a log n), n nodos y a aristas, porque Ordenar : O(a log a) = O(a log n) Bucle repetir : O(a)
15
16
Prim: Ejemplo
1
4 1 6 3 4
2
4
2 5 8 3
3
6
Paso Inic. 1 2 3 4 5 6
u, v 1, 2 2, 3 1, 4 4, 5 4, 7 7, 6
17
Prim: Correccin o
El algoritmo de Prim halla un arbol de recubrimiento m nimo de un grafo G = N, A . Probamos que T siempre es prometedor por induccin sobre el o nmero de aristas de T . u Base: El conjunto vac es prometedor. o Hiptesis de induccin: T es prometedor antes de aadir la o o n arista e = u, v . Paso inductivo:
18
Prim: Algoritmo, 1
Representacin del grafo mediante su matriz de adyacencia: o G[i, j] =
coste si i, j A + si i, j A
Para los nodos i B ms-prximo[i] es el nodo de B ms prximo a i. a o a o dist-mnima[i] tiene la distancia de i a este nodo. Para los nodos i B, dist-mnima[i] = 1. Se elige el nodo 1 como nodo inicial a partir del cual se construye el arbol.
19
Prim: Algoritmo, 2
fun Prim(G[1..n, 1..n]) dev T T := para i = 2 hasta n hacer ms-prximo[i] := 1 ; dist-mnima[i] := G[1, i] a o fpara repetir n 1 veces min := + para j = 2 hasta n hacer si 0 dist-mnima[j] min entonces min := dist-mnima[j] ; k := j fsi fpara T := T ms-prximo[k], k a o dist-mnima[k] := 1 para j = 2 hasta n hacer si G[k, j] < dist-mnima[j] entonces dist-mnima[j] := G[k, j] ms-prximo[j] := k a o fsi fpara frepetir ffun Complejidad: O(n2), n nodos.
20
ARM: Comparacin o
Grafo denso: a O(n2)
21
Prctica de programacin a o
La prctica de programacin, voluntaria y puntuable para la nota a o nal de la asignatura, consiste en elegir uno de los dos siguientes algoritmos: Algoritmo de Dijkstra Algoritmo de Prim e implementarlo de dos formas distintas: con la implementacin o vista en clase (O(n2)) y con la implementacin planteada en la o hoja de problemas (O(a log n)). Los resultados de la prctica deber ser, adems de la propia a an a implementacin, una comparacin emp o o rica de las complejidades en tiempo de las dos implementaciones, tanto para grafos dispersos como para grafos densos.