Вы находитесь на странице: 1из 38

Algoritmos y Estructuras de Datos III

Facultad de Inform atica, Grupo 2B Universidad Polit ecnica de Valencia

Tema 5: Algoritmos en Grafos


Enrique Vidal Ruiz evidal@iti.upv.es Diciembre, 2000

E. Vidal UPV

AD3-Grafos-5

Diciembre, 2000

Algoritmos en Grafos: Indice


1. Recorridos b asicos de grafos: Profundidad, Anchura y Orden Topol ogico 2. Arbol de recubrimiento m nimo: algoritmos de Kruskal y Prim 3. Caminos m nimos: algoritmo de Dijkstra

Bibliograf a:
Cormen Leiserson y Rivest: Introduction to Algorithms, MIT press, 1990. Aho, Hopcroft y Ullman: The Design and Analysis of Computer Algorithms, AddisonWesley, 1974.

E. Vidal UPV

P agina 5.1

AD3-Grafos-5

Diciembre, 2000

Recorrido en Profundidad
Dado un grafo G = (V, A) y un v ertice v V , la estrategia de recorrido en Profundidad, o Depth-First Search (DFS), explora sitem aticamente las aristas de G de manera que primero se visitan los v ertices adyacentes a los visitados mas recientemente. De esta forma se va profundizando en el grafo; es decir, alejandose progresivamente de v . Esta estrategia admite una implementaci on simple en forma recursiva, utilizando globalmente un contador (n) y un vector de Naturales (R) para marcar los v ertices ya visitados (Rv > 0) y almacenar el orden de recorrido. funci on RP(G) { n = 0; v V Rv = 0 v V si (Rv = 0) DFS(v ) devolver(R) } // Coste temporal: O(|V | + |A|) algoritmo DFS(v ) { n = n+1; Rv = n w adyacentes(v ) si (Rw = 0) DFS(w) }

E. Vidal UPV

P agina 5.2

AD3-Grafos-5

Diciembre, 2000

Recorrido en Profundidad: Ejemplo Grafo Recorrido en Profundidad


nodos v/w 1 0 1 1 2 0 2 2 3 0 3 3 4 0 7 7 R 5 0 8 8 6 0 4 4 7 0 5 5 8 0 6 6 9 0 9 9

2 1 3

7 6
1/2,3,4,5 2 3/2,6,8 6/7 7/2 8/6 4/3,8 5/ 9/5,8 R

8 4 5 9

Orden de Visita de Nodos: 1, 2, 3, 6, 7, 8, 4, 5, 9


E. Vidal UPV P agina 5.3

AD3-Grafos-5

Diciembre, 2000

Traza Recorrido en Profundidad


2:0 1:1 4:0 5:0 3:0 8:0 9:0 9:0 5:0 6:0 7:0 1:1 4:0 3:0 8:0 6:0 7:0 2:2

Traza DFS: v=1, n=1

Traza DFS: v=2, n=2

2:2 1:1 4:0 5:0 3:3 8:0 9:0 9:0 5:0 6:0 7:0 1:1 4:0 3:3 8:0 6:4 7:0

2:2

Traza DFS: v=3, n=3

Traza DFS: v=6, n=4

2:2 1:1 4:0 5:0 3:3 8:0 9:0 9:0 5:0 6:4 7:5 1:1 4:0 3:3 8:6 6:4 7:5

2:2

Traza DFS: v=7, n=5

Traza DFS: v=8, n=6

E. Vidal UPV

P agina 5.4

AD3-Grafos-5

Diciembre, 2000

Traza Recorrido en Profundidad (cont.)


2:2 1:1 4:7 5:0 3:3 8:6 9:0 9:0 5:8 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5 2:2

Traza DFS: v=4, n=7

Traza DFS: v=5, n=8

2:2 1:1 4:7 5:8 3:3 8:6 9:9 9:9 5:8 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5

2:2

Traza DFS: v=9, n=9

Resultado: Nodos etiquetados segn orden de recorrido

E. Vidal UPV

P agina 5.5

AD3-Grafos-5

Diciembre, 2000

Recorridos de Grafos: recorrido en Anchura


Dado un grafo G = (V, A) y un v ertice v V , la estrategia de recorrido en Anchura, o Breadth-First Search (BFS), explora sitem aticamente las aristas de G de manera que primero se visitan los v ertices mas cercanos a v . La funci on RA obtiene un recorrido en anchura de G llamando a la rutina BF S . Se utiliza globalmente un contador (n) y un vector de Naturales (R) para marcar los v ertices ya visitados (Rv > 0) y almacenar el orden de recorrido. BF S usa una cola auxiliar (Q) para gestionar v ertices no visitados. funci on RA(G) { n=0 v V Rv = 0 v V si (Rv = 0) BFS(v ) devolver(R) } algoritmo BFS(v ) { n = n+1; Rv = n; encolar(Q,v ) mientras (Q = Q) { u = cabeza(Q); descabezar(Q) w adyacentes(u) si (Rw = 0) { n=n+1; Rw = n; encolar(Q,w) } } } // Coste temporal: O(|V | + |A|)

E. Vidal UPV

P agina 5.6

AD3-Grafos-5

Diciembre, 2000

Recorrido en Anchura: Ejemplo


v 1 u
1 2 3 4 5

2 1 3

7 6

2 3 2 6 8 4 3 8 5 6

8 4 5 9
9 9 9 9

7 8 6 7

5 8

1 1 1

2 0 2 2

3 0 3 3

4 0 4 4

5 0 5 5

6 0 6 6

7 0 8 8

8 0 7 7

9 0 9 9

<1> <> <2> < 2, 3 > < 2, 3, 4 > < 2, 3, 4, 5 > < 3, 4, 5 > < 4, 5 > < 4, 5, 6 > < 4, 5, 6, 8 > < 5, 6, 8 > < 6, 8 > <8> < 8, 7 > <7> <> <9> <>

E. Vidal UPV

P agina 5.7

AD3-Grafos-5

Diciembre, 2000

Traza Recorrido en Anchura


2:0 1:1 4:0 5:0 3:0 8:0 9:0 9:0 5:5 6:0 7:0 1:1 4:4 3:3 8:0 6:0 7:0 2:2

Traza BFS: v=1, n=1, cabeza(Q)=1

Traza BFS: v=1, n=5, cabeza(Q)=2

2:2 1:1 4:4 5:5 3:3 8:0 9:0 9:0 5:5 6:0 7:0 1:1 4:4 3:3 8:7 6:6 7:0

2:2

Traza BFS: v=1, n=5, cabeza(Q)=3

Traza BFS: v=1, n=7, cabeza(Q)=4

2:2 1:1 4:4 5:5 3:3 8:7 9:0 9:0 5:5 6:6 7:0 1:1 4:4 3:3 8:7 6:6 7:0

2:2

Traza BFS: v=1, n=7, cabeza(Q)=5

Traza BFS: v=1, n=7, cabeza(Q)=6

E. Vidal UPV

P agina 5.8

AD3-Grafos-5

Diciembre, 2000

Traza Recorrido en Anchura (cont.)


2:2 1:1 4:4 5:5 3:3 8:7 9:0 9:0 5:5 6:6 7:8 1:1 4:4 3:3 8:7 6:6 7:8 2:2

Traza BFS: v=1, n=8, cabeza(Q)=8

Traza BFS: v=1, n=8, cabeza(Q)=7

2:2 1:1 4:4 5:5 3:3 8:7 9:9 9:9 5:5 6:6 7:8 1:1 4:4 3:3 8:7 6:6 7:8

2:2

Traza BFS: v=9, n=9, cabeza(Q)=9

Resultado: Nodos etiquetados segn orden de recorrido

E. Vidal UPV

P agina 5.9

AD3-Grafos-5

Diciembre, 2000

Orden Topol ogico en Grafos Ac clicos


Dado un grafo ac clico G = (V, A) el recorrido profundidad puede usarse directamente para ordenar los v ertices de V seg un un orden (parcial) , tal que u, v V , si (u, v ) A entonces u v . Basta con ir anotando en una pila global (P ) los v ertices completamente explorados por DFS.

funci on OTP(G) { n = 0; v V Rv = 0; P=P v V si (Rv = 0) DFS(v ) devolver(P) } // Coste temporal: O(|V | + |A|)

algoritmo DFS(v ) { n = n+1; Rv = n w adyacentes(v ) si (Rw = 0) DFS(w) apilar(P,v ) }

E. Vidal UPV

P agina 5.10

AD3-Grafos-5

Diciembre, 2000

Orden Topol ogico en Grafos Ac clicos: Ejemplo


nodos v/w 1/2,3,4,5 2 3/2,6,8 6/7 7/2 8/6 4/3,8 5/ 9/5,8

2 1 3

7 6

8 4 5 9

1 0 1 -

2 0 2 -

3 0 3 -

4 0 7 -

R 5 0 8 -

6 0 4 -

7 0 5 -

8 0 6 -

9 0 9

P <> <> <2> <2> <2> < 7, 2 > < 6, 7, 2 > < 8, 6, 7, 2 > < 3, 8, 6, 7, 2 > < 4, 38, 6, 7, 2 > < 5, 4, 3, 8, 6, 7, 2 > < 1, 5, 4, 3, 8, 6, 7, 2 > < 9, 1, 5, 4, 3, 8, 6, 7, 2 >

Grafo ordenado Topo ogicamente

E. Vidal UPV

P agina 5.11

AD3-Grafos-5

Diciembre, 2000

Traza Orden Topol ogico


2:0 1:1 4:0 5:0 3:0 8:0 9:0 9:0 5:0 6:0 7:0 1:1 4:0 3:0 8:0 6:0 7:0 2:2

Traza OTP: v=1, n=1, top(Q)=1

Traza OTP: v=2, n=2, top(Q)=1

2:2 1:1 4:0 5:0 3:0 8:0 9:0 9:0 5:0 6:0 7:0 1:1 4:0 3:3 8:0 6:0 7:0

2:2

Traza OTP: v=2, n=2, top(Q)=2

Traza OTP: v=3, n=3, top(Q)=2

2:2 1:1 4:0 5:0 3:3 8:0 9:0 9:0 5:0 6:4 7:0 1:1 4:0 3:3 8:0 6:4 7:5

2:2

Traza OTP: v=6, n=4, top(Q)=2

Traza OTP: v=7, n=5, top(Q)=2

E. Vidal UPV

P agina 5.12

AD3-Grafos-5

Diciembre, 2000

Traza Orden Topol ogico (cont.)


2:2 1:1 4:0 5:0 3:3 8:0 9:0 9:0 5:0 6:4 7:5 1:1 4:0 3:3 8:0 6:4 7:5 2:2

Traza OTP: v=7, n=5, top(Q)=7

Traza OTP: v=6, n=5, top(Q)=6

2:2 1:1 4:0 5:0 3:3 8:6 9:0 9:0 5:0 6:4 7:5 1:1 4:0 3:3 8:6 6:4 7:5

2:2

Traza OTP: v=8, n=6, top(Q)=6

Traza OTP: v=8, n=6, top(Q)=8

2:2 1:1 4:0 5:0 3:3 8:6 9:0 9:0 5:0 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5

2:2

Traza OTP: v=3, n=6, top(Q)=3

Traza OTP: v=4, n=7, top(Q)=3

E. Vidal UPV

P agina 5.13

AD3-Grafos-5

Diciembre, 2000

Traza Orden Topol ogico (cont.)


2:2 1:1 4:7 5:0 3:3 8:6 9:0 9:0 5:8 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5 2:2

Traza OTP: v=4, n=7, top(Q)=4

Traza OTP: v=5, n=8, top(Q)=4

2:2 1:1 4:7 5:8 3:3 8:6 9:0 9:0 5:8 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5

2:2

Traza OTP: v=5, n=8, top(Q)=5

Traza OTP: v=1, n=8, top(Q)=1

2:2 1:1 4:7 5:8 3:3 8:6 9:9 9:9 5:8 6:4 7:5 1:1 4:7 3:3 8:6 6:4 7:5

2:2

Traza OTP: v=9, n=9, top(Q)=1

Traza OTP: v=9, n=9, top(Q)=9

E. Vidal UPV

P agina 5.14

AD3-Grafos-5

Diciembre, 2000

Traza Orden Topol ogico (cont.)


2:2 1:1 4:7 5:8 3:3 8:6 9:9 6:4 7:5 4:4 1:2 3:5 9:1 5:3 8:6 6:7 7:8 2:9

Resultado: Nodos etiquetados segn orden de recorrido

OTP: Nodos etiquetados segn rango topolgico

E. Vidal UPV

P agina 5.15

AD3-Grafos-5

Diciembre, 2000

Algoritmos en Grafos
1. Recorridos b asicos de grafos: Profundidad, Anchura y Orden Topol ogico 2. Arbol de recubrimiento m nimo: algoritmos de Kruskal y Prim 3. Caminos m nimos: algoritmo de Dijkstra

E. Vidal UPV

P agina 5.16

AD3-Grafos-5

Diciembre, 2000

Arbol de Recubrimiento de Peso M nimo


Arbol de Recubrimiento de un grafo no Dirigido G = (V, A, p) es un arbol libre T = (V A ) tal que V = V y A A. Problema: Dado un Grafo Conexo Ponderado No Dirigido G = (V, A, p), encontrar un Arbol de Recubribiento de G, tal que la suma de los pesos de sus |V | 1 aristas sea m nimo.

Ejemplo

a 8 b 6 6 c 4 9 4 5 1 d 2 e 3 b 6 6 c 8 4

a 9 2 5 1 d e 3

Grafo Ponderado No Dirigido


E. Vidal UPV

Arbol de Recubrimiento de Peso M nimo (= 11)


P agina 5.17

AD3-Grafos-5

Diciembre, 2000

Arbol de Recubrimiento de Peso M nimo: Algoritmo de Kruskal Idea Voraz:


Empezando por cualquier arista, construir incrementalmente un bosque (de recubrimiento), seleccionando en cada paso una arista (u, v ) A tal que: No cree ning un ciclo, Produzca el menor incremento de peso posible. El resultado se obtiene cuando se han seleccionado exactamente |V | 1 aristas v alidas.

E. Vidal UPV

P agina 5.18

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Kruskal: Esquema B asico


Dado un grafo G = (V, A, p) dirigido y ponderado por p : A R0, (p(u, v ) = + si (u, v ) A), la funci on KRUSKAL obtiene un arbol T = (V, A ) cuyo peso total D es m nimo. funci on KRUSKAL(G=(V,A,p)) { A = A; A = ; D = 0; mientras (|A | < |V | 1) { (u, v ) = argmin(x,y)A p(x, y ) // argmin(x,y)A D + p(x, y ) A = A {(u, v )} si ((u, v ) no crea un ciclo en A ) {A = A {(u, v )}; D = D + p(u, v ) } } devolver(T,D) } // Coste temporal: O(n4), n = |V | ... ? Coste dominado por la operaci on argmin y por la comprobaci on de no crear ciclo!

E. Vidal UPV

P agina 5.19

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Kruskal: Estructuras de datos


Problema: C omo vericar ecientemente la condici on de no crear ciclo? Soluci on: Mantener una colecci on de subconjuntos (disjuntos) con los v ertices incluidos en cada arbol parcial: Una arista (u, v ) no crear a ciclo si u y v est an en distintos subconjuntos. Una implementaci on eciente de la comprobaci on de no crear ciclo puede obtenerse estructurando el conjunto S como un MFSET de v ertices. Por otra parte, le operaci on de selecci on (argmin) puede acelerarse signicativamente manteniendo A como un Min-Heap de aristas organizadas seg un su peso.

E. Vidal UPV

P agina 5.20

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Kruskal
funci on KRUSKAL(G=(V,A,p)) { H = BuildHeap(p, A); S = BuildMFSET(V ); A = ; D = 0 mientras (|A | < |V | 1) { (q, (u, v )) = extraeMinHeap(H ) // leer y eliminar el m nimo x =FIND(u); y =FIND(v ) si (x = y ) { MergeSet(x, y ); A = A (u, v ); D = D + q } } devolver(T,D) // T = (V, A ) } // O(a log a), (a = |A|) El coste es en general bastante inferior a la cota O(a log a). Si m es el n umero de iteraciones del mientras, t picamente m n a n2 . En la pr actica, el coste est a mas cercano a a + n log n que a a log a.

E. Vidal UPV

P agina 5.21

AD3-Grafos-5

Diciembre, 2000

Traza algoritmo de Kruskal


90 90

50 80 1 20 40 3 40 10 40 3 2 60 60 4 1 20 30 5 80 2 60 60

50 30 4 10 40 5

Grafo Inicial

Traza Kruskal: (u,v) = (3,5); peso=10;

find(3) != find(5)

90

90

50 80 1 20 40 3 40 10 40 3 2 60 60 4 1 20 30 5 80 2 60 60

50 30 4 10 40 5

Traza Kruskal: (u,v) = (1,4); peso=20;

find(1) != find(4)

Traza Kruskal: (u,v) = (4,5); peso=30;

find(4) != find(5)

E. Vidal UPV

P agina 5.22

AD3-Grafos-5

Diciembre, 2000

Traza algoritmo de Kruskal (cont.)


90 90

50 80 1 20 40 3 40 10 40 3 2 60 60 4 1 20 30 5 80 2 60 60

50 30 4 10 40 5

Traza Kruskal: (u,v) = (1,3); peso=40; find(1) == find(3)

Traza Kruskal: (u,v) = (3,4); peso=40;

find(3) == find(4)

90

90

50 80 1 20 40 3 40 10 40 3 2 60 60 4 1 20 30 5 80 2 60 60

50 30 4 10 40 5

Traza Kruskal: (u,v) = (2,5); peso=50;

find(2) != find(5)

Resultado Final: pesoTotal=110

E. Vidal UPV

P agina 5.23

AD3-Grafos-5

Diciembre, 2000

Prestaciones algoritmo de Kruskal: Grafos aleatorios, grado jo


# Prestaciones Algoritmo de Kruskal, versiones Sort (a=1) y Heap (a=2). # g=grado, N=Num.Nodos t~=Num.Aristas # for t in 100 300 1000 3000 10000 ; do do echo; for a in 1 2 ; do kruskalTime -a $a -t $t -g 16 -n 1000000 -T 10 ; done; done a: 1 g: 16 a: 2 g: 16 a: 1 g: 16 a: 2 g: 16 a: 1 g: 16 a: 2 g: 16 a: 1 g: 16 a: 2 g: 16 a: 1 g: 16 a: 2 g: 16
E. Vidal UPV

N: 100 N: 100 N: 300 N: 300 N: 1000 N: 1000 N: 3000 N: 3000

t: 1009 t: 998 t: 3043 t: 3046 t: 10137 t: 10111 t: 30202 t: 30202

: : : : : : : :

1751 instancias en 2513 instancias en 471 instancias en 626 instancias en 123 instancias en 143 instancias en 32 instancias en 32 instancias en 7 instancias en 8 instancias en

10.00 segundos 10.00 segundos 10.01 segundos 10.01 segundos 10.07 segundos 10.02 segundos 10.16 segundos 10.04 segundos 10.05 segundos 11.52 segundos
P agina 5.24

N: 10000 t: 101242 : N: 10000 t: 101255 :

AD3-Grafos-5

Diciembre, 2000

Prestaciones algoritmo de Kruskal: impacto del grado del grafo


# Impacto de la Densidad de los grafos en el Algoritmo de Kruskal, # vers. Sort (a=1) y Heap (a=2). g=grado, N=Num.Nodos t~=Num.Aristas # for g in 4 8 16 32 64 128 ; do echo; for a in 1 2 ; do kruskalTime -a $a -t 1000 -g $g -n 1000000 -T 10 done; done a: 1 g: 4 a: 2 g: 4 a: 1 g: 8 a: 2 g: 8 a: 1 g: 16 a: 2 g: 16 a: 1 g: 32 a: 2 g: 32 a: 1 g: 64 a: 2 g: 64 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 N: 1000 t: 2568 t: 2567 t: 5124 t: 5069 : : : : 477 instancias en 324 instancias en 245 instancias en 203 instancias en 122 instancias en 144 instancias en 58 instancias en 99 instancias en 24 instancias en 66 instancias en 10 instancias en 43 instancias en 10.01 segundos 10.03 segundos 10.01 segundos 10.00 segundos 10.06 segundos 10.03 segundos 10.04 segundos 10.10 segundos 10.25 segundos 10.11 segundos 10.11 segundos 10.04 segundos
P agina 5.25

t: 10180 : t: 10187 : t: 20265 : t: 20244 : t: 40564 : t: 40627 : t: 80919 : t: 80983 :

a: 1 g: 128 N: 1000 a: 2 g: 128 N: 1000


E. Vidal UPV

AD3-Grafos-5

Diciembre, 2000

Arbol de Recubrimiento de Peso M nimo: Algoritmo de Prim Idea Voraz:


Empezando por cualquier v ertice, construir incrementalmente un arbol de recubrimiento seleccionando en cada paso una arista (u, v ) A tal que: Si se a nade (u, v ) al conjunto de aristas A obtenido hasta el momento no se cree ning un ciclo, Produzca el menor incremento de peso posible. La primera condici on puede garantizarse f acilmente si la arista (u, v ) seleccionada en cada caso es tal que u es un v ertice ya seleccionado en alg un paso anterior y v es un v ertice a un no seleccionado.

E. Vidal UPV

P agina 5.26

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Prim: Esquema B asico


Dado un grafo G = (V, A, p) dirigido y ponderado por p : A R0, (p(u, v ) = + si (u, v ) A), la funci on PRIM obtiene un arbol T = (V, A ) cuyo peso total D es m nimo. Se usa un conjunto auxiliar de v ertices seleccionados S . funci on PRIM(G=(V,A,p)) { u = elemento-arbritario(V); mientras (S = V ) { (u, v ) = argmin(x,y)(S V S ) p(x, y ) // argmin(x,y)(S V S ) D + p(x, y ) S = S {v }; A = A {(u, v )}; D = D + p(u, v ) } devolver(T, D) // T = (V, A ) } // Coste temporal: O(n3), n = |V | (u, v ) = argmin(x,y)(S V S ) p(x, y ) { m = +; x S y V S si (p(x, y ) < m) { m = p(x, y ); (u, v ) = (x, y ) } }
E. Vidal UPV P agina 5.27

S = {u}; A = ; D = 0

AD3-Grafos-5

Diciembre, 2000

Correcci on del Algoritmo de Prim


Teorema. Dado un grafo conexo ponderado y no dirigido G = (V, A, p), el conjunto de aristas A obtenido por el algoritmo de Prim forma un arbol de recubrimiento de G, T = (V , A ), cuyo peso es m nimo.

E. Vidal UPV

P agina 5.28

AD3-Grafos-5

Diciembre, 2000

Demostraci on: 1. T es un arbol de recubrimiento de G: Por construcci on, V = V, A A y no existen ciclos. 2. El peso de T es m nimo: Consecuencia directa del siguiente Lema: Lema. Sea S V . Si (u, v ) = argmin(x,y)(S V S ) p(x, y ), entonces (u, v ) forma parte de un arbol de recubrimiento de G de peso m nimo.
Demostraci on: Supongamos que T es un arbol de rtecubrimiento m nimo de G que no incluye a (u, v ). Si se a nadiera (u, v ) a T se crear a un ciclo C (seg un Teorema 1). Como u S y v V S , existir a en C una arista (x, y ) de T tal que x S y y V S . Entonces, si se eliminara (x, y ) de T se abrir a el ciclo C obteniendose un nuevo arbol T = T cuyo peso ser a: p(T ) = p(T ) + p(u, v ) p(x, y ). Pero por hip otesis p(u, v ) p(x, y ), por lo que p(T ) p(T ). Si p(T ) < p(T ) se tiene una contradicci on con la suposici on de que p(T ) es m nimo, mientras que en caso de igualdad (p(T ) = p(T )) se comprueba que T es un Arbol de Recubrimiento de Peso M nimo, que es lo que se trataba de demostrar.

y x S u v C V-S

E. Vidal UPV

P agina 5.29

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Prim: Reducci on del Coste


El coste c ubico del algoritmo b asico de Prim est a dominado por el coste cuadr atico de la operaci on de selecci on (argmin), que debe considerar todos los pares de vertices de S y V S . Esta operaci on puede implementarse con un coste lineal mediante la idea de Prim: Mantener para cada v ertice no seleccionado v V S el identicador de un v ertice ya seleccionado u S mas pr oximo a el; es decir, u = argminxS p(x, v ), v V S Estos identicadores se pueden mantener en un vector (P ). Como en cada iteraci on solo se a nade un nuevo v ertice a S , P se puede actualizar en |V S | = O(n) pasos.

E. Vidal UPV

P agina 5.30

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Prim
funci on PRIM(G=(V,A,p)) { u = elemento-arbritario(V); v V S Pv = u; mientras (S = V ) { v = argminyV S p(Py , y ); u = Pv S = S {v }; A = A {(u, v )}; D = D + p(u, v ) u = v; v V S si (p(u, v ) < p(Pv , v )) Pv = u } devolver(T, D) // T = (V, A )// } // Coste temporal: O(n2) S = {u} A = ; D = 0

Coste temporal mejorable a O(a log n) (a = |A|) mediante el uso de Heaps.

E. Vidal UPV

P agina 5.31

AD3-Grafos-5

Diciembre, 2000

Algoritmos en Grafos
1. Recorridos b asicos de grafos: Profundidad, Anchura y Orden Topol ogico 2. Arbol de recubrimiento m nimo: algoritmos de Kruskal y Prim 3. Caminos m nimos: algoritmo de Dijkstra

E. Vidal UPV

P agina 5.32

AD3-Grafos-5

Diciembre, 2000

Caminos de M nimo Peso en Grafos Dirigidos: Algoritmo de Dijkstra Problema: Dado un Grafo Conexo Ponderado Dirigido G = (V, A, p) y un
v ertice v0 V , obtener v V un camino de v0 a v en G cuyo peso sea m nimo.

Idea Voraz: Empezando en v0, construir incrementalmente caminos a los


dem as v ertices seleccionando en cada paso un v ertice v no seleccionado anteriormente tal que: Exista alg un v ertice u V ya seleccionado previamente tal que (u, v ) A. Al a nadir (u, v ) al camino que terminaba en u se produzca el menor incremento de peso posible.

E. Vidal UPV

P agina 5.33

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Dijkstra: Esquema B asico


Dado un grafo G = (V, A, p) dirigido y ponderado por p : A R0, (p(u, v ) = + si (u, v ) A), y un v ertice v0 V , la funci on DIJKSTRA obtiene v V un camino (lista de v ertices, Cv ) de v0 a v en G cuyo peso es m nimo. Cada componente v del vector de caminos C [v ] contiene la lista de v ertices que preceden a v en el camino correspondiemnte. Se usa un conjunto auxiliar S de v ertices ya visitados y un vector auxiliar D para mantener el menor peso de un camino de v0 a cada nodo v (Dv ). funci on DIJKSTRA(G=(V,A,p)) { S = {v0}; Cv0 = a nadir(L, v0); Dv0 = 0 mientras (S = V ) { (u, v ) = argmin(x,y)(S V S ) Dx + p(x, y ) S = S {v }; Cv = a nadir(Cu, v ); } devolver(C,D) } // Coste temporal: O(n3), n = |V |
E. Vidal UPV P agina 5.34

Dv = Du + p(u, v )

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Dijkstra: Mejora del Coste


De manera similar al algoritmo de Prim, el coste c ubico del algoritmo de Dijkstra esta dominado por el coste cuadr atico de la operaci on de selecci on (argmin). Tambi en en este caso la operaci on puede implementarse con un coste lineal mediante la t ecnica de Dijkstra (similar a la de Prim): Para cada v ertice a un no seleccionado (v V S ), mantener en Dv , el peso del camino de m nimo peso que llega de v0 a v a trav es de v ertices u ya seleccionados (u S ). Adem as, como todos los prejos de un camino de m nimo peso de v0 a v son tambi en caminos m nimos, el vector de listas resultado puede resumirse en un simple vector de v ertices predecesores (C ).

E. Vidal UPV

P agina 5.35

AD3-Grafos-5

Diciembre, 2000

Algoritmo de Dijkstra
funci on DIJKSTRA(G=(V,A,p)) { S = {v0}; Cv0 = v0; Dv0 = 0; v V S {Dv = p(v0, v ); Cv = v0 } mientras (S = V ) { w = argminvV S Dv ; S = S {w}; v V S si (Dw + p(w, v ) < Dv ) { Dv = Dw + p(w, v ); Cv = w } } devolver(C,D) } // Coste temporal: O(n2) Coste temporal mejorable a O(a log n) mediante el uso de Heaps (n = |V |, a = |A|).

E. Vidal UPV

P agina 5.36

AD3-Grafos-5

Diciembre, 2000

Traza algoritmo de Dijkstra


10 40 1 1:0 90 3 1:90 80 40 50 4 1:80 70 Traza dijk: w=1 30 2 0:INF 60 20 5 0:INF
1 1:0 90 3 1:90 80 50 4 1:-80 70 Traza dijk: w=4 10 40 40 30 2 4:110 60

20 5 4:140

10 1 1:0 90 3 1:-90 80 40 40 50 4 1:-80 70 Traza dijk: w=3 30 2 4:110 60


1 1:0 90 3 1:-90 80

10 40 40 50 4 1:-80 70 Traza dijk: w=2 30 2 4:-110 60

20 5 4:140

20 5 2:130

10 1 1:0 90 3 1:-90 80 40 40 50 4 1:-80 70 Traza dijk: w=5 30 2 4:-110 60 1 1:0 5 2:-130 90 3 1:-90 80

10 40 40 50 4 1:-80 70 Resultado: Nodos etiquetados con predecesor y peso camino minimo 30 2 4:-110 60

20

20 5 2:-130

E. Vidal UPV

P agina 5.37

Вам также может понравиться