8/17/2019 4 - Grafos.pdf
1/60
Algorítmica y Complejidad
Tema 4 – Algoritmos sobre grafos.
8/17/2019 4 - Grafos.pdf
2/60
Algorítmos sobre grafos
1. Conceptos, Definiciones y Representación.
2. Conectividad y recorrido.
3. Árboles de expansión.4. Caminos mínimos.
2
8/17/2019 4 - Grafos.pdf
3/60
1. Conceptos, Definiciones y Representación.
2. Conectividad y recorrido.
3. Árboles de expansión.4. Caminos mínimos.
3
Algorítmos sobre grafos
8/17/2019 4 - Grafos.pdf
4/60
Conceptos, Definiciones y Representación
Algoritmos sobre grafos 4
El problema de los puentes de Königsberg (1736)
Resuelto por Eulerl
¿es posible dar un paseo comenzando desde cualquiera de estasregiones, pasando por todos los puentes, recorriendo sólo una vezcada uno, y regresando al mismo punto de partida?
El origen de la teoría de grafos ...
No hay solución• Se puede comprobar utilizando “fuerza bruta”• Demostración de Euler
8/17/2019 4 - Grafos.pdf
5/60
Conceptos, Definiciones y RepresentaciónEjemplos
– Redes de transporte (carreteras, rutas aéreas, ...)
–
Redes de comunicación (Internet) – Redes de información (WWW) – Redes sociales (Facebook, Twitter, FourSquare, ...)
– Dependencias (asignaturas pre-requisito, diagramas de flujo, ...)
Definición formal de grafo – Par de conjuntos G=(V, E)
• V nodos y E aristas• Cada arista es un par ( u,v ) con u,v ! V• Si el par está ordenado es un grafo dirigido• Si no está ordenado es un grafo no dirigido
5 Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
6/60
6
Conceptos, Definiciones y Representación• Grado del grafo (!"#$% '() )
– Número de nodos / vértices |V|
• Nodos adyacentes – Si están unidos por una arista
• Grado de un nodo (!"#$% '*)) – Número de aristas que inciden en un nodo ó número de nodos
adyacentes
– – En grafo dirigido: grado de entrada y grado de salida
• Camino entre dos nodos ( +#,- '*./) ) – Secuencia de nodos, tal que dos nodos consecutivos son
adyacentes (u " xi, x
i" x
i+1, x
i+1" x
i+2, ...., x
i+n" v)
– Es simple cuando no hay nodos repetidos en el camino – Ciclo es un camino simple pero con u = v
!"#$% ! ! !! ! !
! !! ! Handshaking Lemma
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
7/60
• Grafo conexoCada par de nodos está conectado
por un camino
• Grafo no conexoNo existe un camino que una unnodo con los demás
No existe un camino entre a y e • Bosque – Grafo sin ciclos
• Árbol libre – Bosque conexo
– Con un nodo en el papel de raíz
7
Conceptos, Definiciones y Representación
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
8/60
Conceptos, Definiciones y Representación
• Siempre se cumple que:
a. b. Si G es conexo, |E| # |V|-1c. Si G es árbol, |E| = |V|-1d. Si G es bosque |E| $ |V|-1
• Describir este grafo (grid)
8
! !! ! ! ! !
!
1. ¿Dirigido o no dirigido2. ¿Conexo?3. ¿Bosque?4. Grado de los nodos
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
9/60
Conceptos, Definiciones y Representación
Representación de grafos• Listas de adyacencia
9
1
5
2
4
3
• Grafos poco densos! |E|
8/17/2019 4 - Grafos.pdf
10/60
Conceptos, Definiciones y Representación
10
1 2 3 4 51 0 1 0 0 12 1 0 1 1 13 0 1 0 1 04 0 1 1 0 1
5 1 1 0 1 0
• Grafos densos! |E| ! (|V|*(|V|-1))/2 ! Un solo bit por arista! Espacio %(|V|2)
• Consultas sobre aristas
Representación de grafos• Matriz de adyacencia
1
5
2
4
3
Las aristas puedentener pesos asociados.
G=(V,E)
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
11/60
1. Conceptos, Definiciones y Representación.
2. Conectividad y recorrido.
3. Árboles de expansión.4. Caminos mínimos.
11
Algorítmos sobre grafos
8/17/2019 4 - Grafos.pdf
12/60
Conectividad y RecorridoDado un grafo G=(V,E) y dos nodos s y t
– Problemas : ¿Existe un camino para llegar de s a t?
¿A qué distancia están? – Concepto de distancia entre dos nodos s y t como (s, t)
• Mínimo número de aristas entre s y t .
– Breadth-First Search (BFS)• Recorrido en amplitud. Dado un nodo s , primero visitatodos los
nodos a distancia 1 (L1) de s , luego a distancia 2 (L2), y asísucesivamente.
• Li(s ) Conjunto de nodos a distancia i de s
– Depth-First Search (DFS)• Recorrido en profundidad. Dado un nodo s , visita el primer nodoconectado a s y después el primer nodo conectado al últimovisitado
12 Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
13/60
Conectividad y Recorrido
Algoritmos sobre grafos 13
Resultado
0
2 1 5
3 4
L1
L2
12
3
4
5
00
5
3
3
21
4
2
0
3 4
0 2 1 5
2
Lista de Adyacencia
1
2
345
0
Breadth-First Search (BFS)Desde el nodo 0
8/17/2019 4 - Grafos.pdf
14/60
Conectividad y Recorrido
Algoritmos sobre grafos 14
Algoritmo BFSgraph : Graph_Type (Max_Vertices => N); -- Un grafo deN nodos
procedure BFS (g: in out Graph_Type; s: Vertex_Type) isQ : FIFO; -- Cola. Inicialmente vaciav : Vertex_Type;w : Vertex_Type;
beginPush (Q, s);Mark_Vertex (g, s, TRUE); -- Visitado a TRUE
while not Is_Empty (Q) loopPop (Q, v);for i in Successors (g, v)'Range loop -- Nodos adyacentes del nodo v
w := Successors (g, v) (i); -- i-esimo nodo adyacente de vif not Marked (g, w) then -- ¿Visitado?
Put (v); Put (w); new_line;Mark_Vertex (g, w, TRUE); -- Visitado a TRUE
Push (Q, w);end if;end loop;
end loop;end BFS;
8/17/2019 4 - Grafos.pdf
15/60
Conectividad y RecorridoComplejidad de BFS
– Con listas de adyacencia
– Un nodo sólo puede aparecer una vez en la cola (Q)
15 Algoritmos sobre grafos
while not Is_Empty (Q) loop
Pop (Q, v);
for i in Successors (g, v)'Range loopw := Successors (g, v) (i);if not Marked (g, w) then
Put (v); Put (w); new_line;Mark_Vertex (g, w, TRUE);Push (Q, w);
end if;
end loop;
end loop;
O(V+E)O(1)
2*E Veces
O(1)O(E)
V veces
O(V)
8/17/2019 4 - Grafos.pdf
16/60
Conectividad y RecorridoComplejidad de BFS
– Con matriz de adyacencia en un lugar de lista de
adyacencia
16 Algoritmos sobre grafos
while not Is_Empty (Q) loopPop (Q, v);for j in Matriz’Range(1) loop
if Matriz (v, j) /= 0 thenif not Marked (g, j) then.......
end if;end if;
end loop;end loop;
V veces
V vecesO(V2)
8/17/2019 4 - Grafos.pdf
17/60
Conectividad y Recorrido
Algoritmos sobre grafos
Depth-First Search(DFS)
Resultado
0
2
45
1 3
12
3
4
5
00
5
3
3
21
4
2
0
3
0 2 1 5
2
Lista de Adyacencia
Desde el nodo 0
1
2
3
0
45
1
2
3
45
8/17/2019 4 - Grafos.pdf
18/60
Conectividad y Recorrido
Algoritmos sobre grafos 18
Algoritmo DFS – versión recursivagraph : Graph_Type (Max_Nodos => N); -- Grafo deN nodos
procedure DFS (g: in out Graph_Type; s: Vertex_Type) isw: Vertex_Type;
beginMark_Vertex (g, s, TRUE); -- Poner nodo s como Visitado
for i in Successors (g, s)'Range loop -- Para todos los vecinos de s w := Successors (g, s) (i); -- i-esimo vecinoif not Marked (g, w) then -- ¿Visitado vecino des?
DFS (g, w);end if;
end loop;
end DFS;
8/17/2019 4 - Grafos.pdf
19/60
Conectividad y Recorrido
Algoritmos sobre grafos 19
Complejidad algoritmo DFS – versión recursiva
procedure DFS (g: in out Graph_Type; s: Natural) isw: Vertex_Type;
beginMark_Vertex (g, s, true);
for i in Successors (g, s)'Range loop
w := Successors (g, s) (i);
if not Marked (g, w) thenparent (w) := s;DFS (g, w);
end if;
end loop;
end DFS;
O(V)V llamadas recursivas
2*E veces
O(1)
O(1)
O(V + E)O(E)
Complejidad
8/17/2019 4 - Grafos.pdf
20/60
Conectividad y Recorrido
Algoritmos sobre grafos 20
Algoritmo DFS – Versión No Recursiva procedure DFS (g: in out Graph_Type; s:
Vertex_Type) isp: STACK; -- Pilau: Vertex_Type;
beginPush (p, s);
while not Is_Empty (p) loopPop (p, u);if not Marked (g, u) then
Mark_Vertex (g, u, true);Put ("Visitado :"); Put (u); New_Line;for i in Successors (g, u)'Range loop
Push (p, Successors (g, u)(i));end loop;
end if;end loop;
end DFS;
O(E)
O(V)
O(V+E)O(2*E)
Complejidad
8/17/2019 4 - Grafos.pdf
21/60
Conectividad y RecorridoGrafos Dirigidos
– Con BFS y DFS comprobamos la existencia de un camino entredos nodos s y t
– Aunque exista el camino, puede que no exista entre t y s – Un grafo está fuertemente conectado si:
0 ( 1. ,! 2. existe un camino entre s y t y entre t y s
21
• Algoritmo:1. BFS (G, s ) ó DFS (G, s )2. Calcular Grev (Invertiendo el sentido de las artistas) 3. BFS (Grev , s ) ó DFS (Grev , s )4. Si BFS ó DFS fallan y no alcanzan todos los nodos, el grafo NO está fuertemente conectado
A B
DCFuertemente conectado
A B
DC E
NO fuertemente conectado
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
22/60
Conectividad y Recorrido
Grafos Dirigidos – Sin ciclos es un DAG (Directed Acyclic Graph ) – Los DAG aparecen con bastante frecuencia
• Relaciones de precedencia o dependencia – Si se puede establecer un orden entre los nodos, de tal forma que
(u, v ) ! E y u < v (orden) , entonces G tiene orden topológico. – Si G es un DAG, entonces tiene orden topológico
22
ALG
MD
FP
ED
SD
SOPOOC
Posible precedencia de lasasignaturas de Grado
ALG SDFPED MD SOPOOC
Orden topológico de lasasignaturas
Algorítmos sobre grafos
8/17/2019 4 - Grafos.pdf
23/60
Conectividad y RecorridoAlgoritmo de ordenación topológica
3 4 Lista con la ordenación (resultado) – Complejidad5 '6 7)
23
549:;5;?@5A5BC(>=
8/17/2019 4 - Grafos.pdf
24/60
Conectividad y Recorrido
24
procedure Ordenacion_Topologica (g: in out Graph_Type) isn: Vertex_Type;
begin
n := Nodo_Candidato (g); --- Nodo con Grado de Entrada 0
if n /= NO_HAY_NODO then --- Cuando exista el nodo
Mark_Vertex (graph, n, true); --- Marcar nodo como seleccionadoPut (n); new_line;for j in reverse Successors (g, n)'Range loop
Remove_Edge (g, n, Successors (g, n)(j)); --- Eliminar arcos de salidaend loop;
Ordenacion_Topologica (g); --- Llamada recursivaend if;end Ordenacion_Topologica;
Algoritmos sobre grafos
Algoritmo de Ordenación Topológica 1/2
8/17/2019 4 - Grafos.pdf
25/60
Conectividad y Recorrido
25
function Nodo_Candidato (g: Graph_Type) return Integer isw: Vertex_Type;
beginfor i in Vertices_List (g)'Range loop --- Recorrer todos los nodos
w := Vertices_List (g) (i); --- w almacena el i-esimo nodo
if In_Degree (g, w) = 0 and not Marked (g, w) then --- Seleccionar el nodoreturn w; --- con grado de entrada 0
end if; --- y sin marcar
end loop;
return NO_HAY_NODO; --- No hay nodo candidato
end Nodo_Candidato;
Algoritmos sobre grafos
2/2Algoritmo de Ordenación Topológica
8/17/2019 4 - Grafos.pdf
26/60
procedure Ordenacion_Topologica (g: in out Graph_Type) isn: Vertex_Type;begin
n := Nodo_Candidato (g);if n /= NO_HAY_NODO then
Mark_Vertex (graph, n, true);Put (n); new_line;for j in reverse Successors (g, n)'Range loop
Remove_Edge (g, n, Successors (g, n)(j));end loop;Ordenacion_Topologica (g); --- Llamada recursiva
end if;end Ordenacion_Topologica;
Conectividad y Recorrido
26
function Nodo_Candidato (g: Graph_Type) return Integer isw: Vertex_Type;
beginfor i in Vertices_List (g)'Range loop
w := Vertices_List (g) (i);if In_Degree (g, w) = 0 and not Marked (g, w) thenreturn w;
end if;end loop;return NO_HAY_NODO;
end Nodo_Candidato;
Algoritmos sobre grafos
O(V2)V*O(V)
O(E)O(E)O(V2)
O(V)
O(1) O(V)
Complejidad
8/17/2019 4 - Grafos.pdf
27/60
1. Conceptos, Definiciones y Representación.
2. Conectividad y recorrido.
3. Árboles de expansión.4. Caminos mínimos.
27
Algorítmos sobre grafos
8/17/2019 4 - Grafos.pdf
28/60
rboles de Expansión¿Cómo conectar todos los nodos con el mínimo coste?
28
B C D
A I E
H G F
8 74
8
117
2
4 14
9
10
2
6
1
w (T ) = w (u , v ), T !
E
(u ,v )" T #w : E $%
Coste 37
B C D
A I E
H G F
8 7
4 2
4
9
21
Aplicaciones• Logística• Conexionado
" Ciudades," Componentes eléctricos," Personas, etc.
• Enrutamiento en redes
Algoritmos de construcción (Voraces)• Genérico• Kruskal• Prim
Se puede sustituir (B,C) por (A,H)con igual coste
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
29/60
rboles de ExpansiónPropiedades de los arboles de expansión:
– Tienen |V|-1 arcos – No tienen ciclos – Pueden no ser únicos
29
– Añade un arco cada vez al árbol de expansión (A) – Finaliza cuando todos los nodos están conectados – El problema es comprobar que no se añaden ciclos
Algoritmos sobre grafos
VW@?(:;:4>=5&'(.&X)D&&FF&VK6KY*Y&W+#66K6 &@ OO8 < * N $ &'()!(*' +, -./'0 1!, 2'.3-( ,4 567X-KZO < 6% L%"YO58(83!3 69-((8(: 7.,, $%&8
:6E%6,"#" *6 #"E%, ! :. ( L! :. F X'O)$ X'L)[[ < + GOH 1O# #E\EZKE%< * < + GOH: * : ] GOH
&&$%6O8& O,* 6&<
Algoritmo Genérico
8/17/2019 4 - Grafos.pdf
30/60
rboles de Expansión
• Descripción
– Algoritmo voraz, en cada iteración añade un arco de peso mínimo – Se parte de un bosque que inicialmente contiene un árbol por cada
vértice – Los arcos están ordenados de forma creciente por su peso
– Mientras existan arcos para añadir y el bosque inicial no sea un árbol elalgoritmo continua – Cuando añadir un arco provoca un bucle, se desecha y se continua con
el siguiente.
30
Algoritmo de Kruskal
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
31/60
rboles de Expansión
• Ejemplo (1/2)
31
Algoritmo de Kruskal
5
2
6
7
3
4
1
14 5
2
6
3
3
19
15
2
6
7
3
4
1
14 5
2
6
3
3
19
15
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
Algoritmos sobre grafos
¡CICLO! Los nodos2 y 5 pertenecen al
mismo árbol
8/17/2019 4 - Grafos.pdf
32/60
rboles de Expansión
32
• Ejemplo (2/2)Algoritmo de Kruskal
6
5
2
6
7
3
4
1
4 5
2 3
3
19
1
1
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
Coste 12
1
• Implementación – Mediante conjuntos para representar los diferentes arboles – Estructura de datos para manejar conjuntos disjuntos ( ^6K%6]_K6$) – Operaciones sobre conjuntos:
0 V#`O]WO, '*)0 ^6K%6 '*. /)0 _K6$ '*)
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
33/60
rboles de ExpansiónEstructura de datos ^6K%6]_K6$
3 _K6$ '*) devuelve el conjunto al que pertence el nodo u – Para comprobar si un arco (u,v) genera un ciclo:
• if _K6$ '*) a _K6$ '/)then ...... – Para combinar dos arboles mediante el arco (u,v) :
0 ^6K%6 '*. /)
33
a bcabcola
S1
c dcabcola
S2
e
Arcos Conjunto(a,b) {a, b}(c,d) (d,e) {c, d, e}
B A
DC E
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
34/60
rboles de Expansión
Estructura de datos ^6K%6]_K6$3 ^6K%6 'b. E)
34
a bcab
cola
S1
c d e
Arcos Conjunto(a,b) {a, b}
(c,d) (d,e) {c, d, e}(a,b) (b,c) (c,d) (d,e) {a, b, c, d, e }
B A
D
C
E
Dos arboles
Un único árbol
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
35/60
rboles de Expansión
Algoritmos sobre grafos 35
procedure kruskal isg, mst : Graph_Type (Max_Vertices);
Q : Queue_Type (Max_Edges); -- Cola ordenada de forma asc. por pesouf : UnionFind_Type;u, v : Vertex_Type;e : Edge_Type;
beginLoad_Graph (g, …..);
Clear (mst);-- Añadir en 'mst' los verticesfor i in Vertices_List (g)'Range loop
v := Vertices_List (g)(i); Add_Vertex (mst, v); -- Añadir los nodos al grafo ‘mst’Make_Set (uf, v); -- Inicializar estructura Union Find
end loop;Init_Queue (Q, g); -- Inicializar cola con los arcos (peso)
Algoritmo de Kruskal (1/2)
8/17/2019 4 - Grafos.pdf
36/60
rboles de Expansión
Algoritmos sobre Grafos 36
while not Empty (Q) loop
Dequeue (Q, e); -- Sacamos un arco con el menor peso
if Find (uf, e.From ()) /= Find (uf, e.To ()) then Add_Edge (mst, e, Undirected => True);Union (uf, e.From (), e.To ());
end if;end loop;
Print_Graph (mst);
end kruskal;
Algoritmo de Kruskal (2/2)
¿Se puede mejorar?
8/17/2019 4 - Grafos.pdf
37/60
Algoritmos sobre Grafos 37
rboles de Expansión
Algoritmo de Kruskal - Complejidadbegin -- kruskal
for i in Vertices_List (g)'Range loopv := Vertices_List (g)(i);
Add_Vertex (mst, v);Make_Set (uf, v);
end loop;
Init_Queue (Q, g);
while not Empty (Q) loop
Dequeue (Q, e);if Find (uf, e.From()) /= Find (uf, e.To()) then
..............Union (uf, e.From(), e.To());
end if;end loop;end kruskal -
O(V)
O(E lg E)ordenar |E| " |V|2
O(E lg V)Heap Sort
O(E lg V)
Al ser un grafo conexo|E| # |V| - 1
para todos los arcos O(E)
8/17/2019 4 - Grafos.pdf
38/60
rboles de Expansión
38
• Descripción – Variante del algoritmo genérico – Algoritmo voraz, en cada iteración añade un nodo – Mantiene un único árbol (en cambio, Kruskal un bosque) – Mientras no sea Spanning Tree
• Escoge el arco de peso mínimo '*.&/) • Añade el vértice u o v al árbol, dependiendo de si forma o no parte del
árbol en construcción.
Algoritmo de Prim
Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
39/60
rboles de Expansión
Algoritmos sobre grafos 39
• Ejemplo (raíz el vértice 6) (1/3)Algoritmo de Prim
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
saco 6-7visito 7
Cola:6-2 47-1 67-5 9
Los nodos 1 y 5 no hansido visitados todavía
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
saco 6-2visito 2
Cola:2-3 1
2-5 37-1 67-5 9
Los nodos 3 y 5 no hansido visitados
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
1
visito 6
Cola:6-7 26-2 4
Los nodos 2 y 7 no hansido visitados todavía
arco peso
8/17/2019 4 - Grafos.pdf
40/60
rboles de Expansión
Algoritmos sobre grafos 40
• Ejemplo (2/3)Algoritmo de Prim
5
2
6
7
3
4
1
4 5
26
3
3
19
1
1
saco 5-1visito 1
Cola:2-5 31-4 3 3-4 5
7-1 67-5 9
5
2
6
7
3
4
1
4 5
26
3
3
19
1
1
saco 2-3visito 3
Cola:3-5 12-5 33-4 5
7-1 67-5 9
El nodo 2 ya ha sidovisitado
5
2
6
7
3
4
1
4 5
26
3
3
19
1
1
saco 3-5visito 5
Cola:5-1 12-5 33-4 5
7-1 67-5 9
Los nodos 2, 3 y 7ya han sido visitados
Los nodos 5 y 7 yahan sido visitados
8/17/2019 4 - Grafos.pdf
41/60
rboles de Expansión
Algoritmos sobre grafos 41
• Ejemplo (3/3)
Algoritmo de Prim
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
saco 7-1saco 7-5
Cola:
saco 2-5
Cola:1-4 33-4 57-1 67-5 9
5
2
6
7
3
4
1
4 5
26
3
3
19
1
1
Los nodos 2 y 5 yahan sido visitados
5
2
6
7
3
4
1
4 5
2
6
3
3
19
1
saco 1-4visito 4
Cola:7-1 67-5 9
Los nodos 1 y 3 yahan sido visitados
8/17/2019 4 - Grafos.pdf
42/60
rboles de Expansión
Algoritmo de Prim – El tiempo de ejecución del algoritmo depende de la
búsqueda del arco de peso mínimo – Para cada vértice se añaden las informaciones:
• key Para mantener ordenados los nodos• parent Nodo padre en el árbol de expansión
type Vertex_Type is record………key : INTEGER;parent: Vertex_Id;
end record;
– Q mantiene ordenados los nodos de acuerdo a key
42 Algoritmos sobre grafos
8/17/2019 4 - Grafos.pdf
43/60
rboles de Expansión
Algoritmos sobre grafos 43
procedure prim isg : Graph_Type (Max_Vertices);v, u : Vertex_Type;Q : Queue_Type; --- Cola ordenada
begin -- primLoad_Graph (g, …..);
-- Inicializar los campos key y parentfor i in Vertices_List (g)'Range loop
v := Vertices_List (g)(i);Set_key (g, v, INFINITO);Set_Parent (g, v, NO_PARENT);Enqueue (Q, v); --- Encola el vértice
end loop;
v := Vertices_List (g)(1); -- raíz
Set_Key (g, v, 0);
Algoritmo de Prim (1/2)
8/17/2019 4 - Grafos.pdf
44/60
rboles de Expansión
Algoritmos sobre grafos 44
while not Empty (Q) loopDequeue (Q, u);
for i in Successors (g, u)'Range loop
v := Successors (g, u)(i);
if In_Queue (Q, v) and Weight_Of (g, u, v) < Get_Key (g, v) thenSet_Parent (g, v, u);Set_Key (g, v, Weight_Of (g, u, v)); --- Puede modificar el orden de
--- los vértices en Qend if;
end loop;
end loop;
end prim;
Algoritmo de Prim (2/2)
8/17/2019 4 - Grafos.pdf
45/60
rboles de ExpansiónComplejidad del Algoritmo de Prim • Las operaciones sobre la estructura Cola ( Enqueue ,
Dequeue, y In_Queue ) tienen un coste O (log V)
-- Inicializarfor i in Vertices_List (g)'Range loop
………..Enqueue (q, v);
end loop;while not Empty (q) loop
Dequeue (q, u);for i in Successors (g, u)'Range loop
v := Successors (g,u)(i);if In_Queue (q, v) and .........
............end if;
end loop;end loop;
Algoritmos sobre grafos 45
O(V log V)
O(V log V)
O(E log V)
O(E log V)
Al ser un grafo conexo|E| # |V| - 1
l í b f
8/17/2019 4 - Grafos.pdf
46/60
1. Conceptos, Definiciones y Representación.
2. Conectividad y recorrido.
3. Árboles de expansión.4. Caminos mínimos.
46
Algorítmos sobre grafos
C i í i
8/17/2019 4 - Grafos.pdf
47/60
Caminos mínimosEl problema: ¿Cuál es la forma más rápida de ir .... ?
– Camino mínimo
47
También
¿Cuál es la más barata?
¿Cuál es la de menordistancia recorrida?
A B1
C
FE
D
51
22
3
4
1
2 caminos mínimos
Algoritmos sobre grafos
C i í i
8/17/2019 4 - Grafos.pdf
48/60
Caminos mínimos
Variantes del problema
• BFS permite obtener los caminos mínimos engrafos no ponderados
• Caminos mínimos a un destino desde el resto denodos
• Caminos mínimos para todos los pares de nodos
– Una posible solución: calcular el camino mínimo paracada nodo
48 Algoritmos sobre grafos
C i í i
8/17/2019 4 - Grafos.pdf
49/60
Caminos mínimos
Definiciones• Se parte de un grafo ponderado
3 ;?@Ac BC @ ! D
0 X'+) es el peso del camino + a '/ d. /P. III /̀)
0 ' '*. /) es el peso del camino mínimo entre * y /
49
w( p) = w(vi! 1, vi )i = 1
k
"
! (u, v) =min { w( p) : u P ! " ! v}
#
$%&
'&
WK OeK1,O *6 E#YK6% O6,"O * c /
;% -#c E#YK6%
Algoritmos sobre grafos
C i í i
8/17/2019 4 - Grafos.pdf
50/60
Caminos mínimosTécnica de la relajación de arcos• Asignar peso y predecesor a cada vértice/nodo
–
Peso al origen (v.key), inicialmente a infinito – Predecesor ( v.parent ), nodo previo en el camino
• Técnica de “Relajamiento ”
50
Ad=5
Bd=9
2
Ad=5 Bd=72
RELAXKL 'fI`Oc g
8/17/2019 4 - Grafos.pdf
51/60
Caminos mínimos
51 Algoritmos sobre grafos
Algoritmo de Bellman-Ford
– Obtiene los caminos mínimos desde un vértice al resto – Admite arcos con peso negativo – Para cada vértice se añade la información:
• key Distancia de la fuente a cada vértice
– Relaja todos los arcos del grafo sin un ordenpreestablecido
• Lo realiza |V|-1 veces para garantizar el cálculo correcto de lakey de cada vértice
– Antes de finalizar debe comprobar que no existe unbucle negativo dentro de grafo.
C i í i
8/17/2019 4 - Grafos.pdf
52/60
Caminos mínimosAlgoritmo de Bellman-Ford
52
AD=!
SD=0
3
CD=!
BD=!
DD=!
-1
21
2-1 4
AD=3
SD=0
3
CD=2
BD=2
DD=6
-1
21
2-1 4
AD=3
SD=0
3
CD=2
BD=2
DD=3
-1
21
2-1 4
“Relaja (C,D)”$ (S, A) = 3 $ (S,C) = 2$ (S, B) = 2 $ (S,D) = 3
AD=3
SD=0
3
CD=2
BD=!
DD=!
-1
21
2-1 4
relax
relax
Algoritmos sobre grafos
Fuente
C i í i
8/17/2019 4 - Grafos.pdf
53/60
Caminos mínimos
Algoritmo de Bellman-Ford (Con arcos de peso Negativo) – Problema: No encontrar el camino mínimo en presencia de ciclos
53
AD=3
-4 BD=-1
C
d=5
6D
d=11-3
Ed=-!
3F
d=-! -6
S
D=0
G
d=-!
3
5
2 7
8
4
$ (S,A) = w(S,A) = 3$ (S,B) = -1
Para (S,C) hay infinitos caminos
(s,c), (s,c,d,c) .....pero sólo uno de peso mínimo$ (S,C) = w(S,C) = 5
Para (S,E) hay infinitos caminos(s,e), (s,e,f,e), (s,e,f,e,f,e) ....NO existe un camino mínimo$ (S,E) = -! Ídem para (S,F) y (S,G)Cuantas más vueltas menor peso
Algorítmos sobre grafos
rboles de Expansión
8/17/2019 4 - Grafos.pdf
54/60
rboles de Expansión
Algoritmos sobre grafos 54
function bellmanford isg : Graph_Type (Max_Vertices);e: : Edge_Type;
beginLoad_Graph (g, …..);Init_Source (g, Vertices_List (g)(1));
for n in 1..Max_Nodos – 1 loopfor i in Edges_List (g)’Range loop
e := Edges_List (g)(i);Relax (g, e.From (), e.To ());
end loop;end loop;
for i in Edges_List (g)’Range loope := Edges_List (g)(i);if Get_Key (g, e.To() ) > (Get_Key (g, e.From() + Weight_Of (e)) then
return FALSE;end if;end loop;return TRUE;
end bellmanford;
Algoritmo de Bellman-Ford (1/2)
V vecesE veces
E veces
O(VE)
O(E)
O(VE)
Complejidad
rboles de Expansión
8/17/2019 4 - Grafos.pdf
55/60
rboles de Expansión
Algoritmos sobre grafos 55
procedure Init_Source (g: in out Graph_Type; source: in Vertex_Type) is
g : Graph_Type (Max_Vertices);v: : Vertex_Type;
beginfor i in Vertices_List (g)’Range loop
v := Vertices_List (g)(i);Set_Key (g, v, INFINITO);Set_Parent (g, v, NO_PARENT);
end loop;Set_Key (g, source, 0);end Init_Source;
procedure Relax (g: in out Graph_Type; from, to: in Vertex_Type) isbegin
if Get_Key (g, to) > (Get_Key (g, from) + Weight_Of (g, from, to)) thenSet_Key (g, to, Get_Key (g, from) + Weight_Of (g, from, to));Set_Parent (g, to, from);
end if;end Relax;
Algoritmo de Bellman-Ford (2/2)
Caminos mínimos
8/17/2019 4 - Grafos.pdf
56/60
Caminos mínimosAlgoritmo de Dijkstra
– Grafos dirigidos con pesos no negativos
– Explorar todos los caminos más cortos desde la fuente – Estrategia voraz – Para cada nodo se añaden las informaciones:
• key Distancia de la fuente a cada vértice
• parent Vértice previo en el camino
– Q Cola “Min” ordenada por Vertex_Type.Key – Más rápido que el algoritmo de Bellman-Ford
56 Algoritmos sobre grafos
Caminos mínimos
8/17/2019 4 - Grafos.pdf
57/60
Caminos mínimosEjemplo:
57
Nodos con camino mínimo
¿Existecamino
alternativo?
Sd=0
Ad=!
Bd=!
Cd=!
Dd=! 2 1
2
1
1 4
3
(1)
Sd=0
Ad=3
Bd=!
Cd=2
Dd=32 1
2
1
1 4
3
(3)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(5)
Sd=0
Ad=3
Bd=!
Cd=2
Dd=! 2 1
2
1
1 4
3
(2)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(4)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(6)
Algoritmos sobre grafos
Caminos mínimos
8/17/2019 4 - Grafos.pdf
58/60
Caminos mínimosEjemplo: (Alternativa)
58
Nodos con camino mínimo
Sd=0
Ad=!
Bd=!
Cd=!
Dd=! 2 1
2
1
1 4
3
(1)
Sd=0
Ad=3
Bd=!
Cd=2
Dd=32 1
2
1
1 4
3
(3)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(5)
Sd=0
Ad=3
Bd=!
Cd=2
Dd=! 2 1
2
1
1 4
3
(2)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(4)
Sd=0
Ad=3
Bd=4
Cd=2
Dd=32 1
2
1
1 4
3
(6)
Algoritmos sobre grafos
rboles de Expansión
8/17/2019 4 - Grafos.pdf
59/60
rboles de Expansión
Algoritmos sobre grafos 59
procedure dijkstra isg : Graph_Type (Max_Vertices);
Q : Queue_Type (Max_Vertices);u,v : Vertex_Type;
beginLoad_Graph (g, …..);Init_Source (g, Vertices_List (g)(1));Init_Queue (Q, g);
while not Empty (Q) loopDequeue (Q, u);Mark_Vertex (g, u, TRUE); --- Alcanzado el vértice ufor i in Successors(g, u)’Range loop
v := Successors (g, u) (i);Relax (g, u, v); --- Puede modificar el orden de los vértices en Q
end loop;end loop;
end dijkstra;
Algoritmo de Dijkstra
rboles de Expansión
8/17/2019 4 - Grafos.pdf
60/60
Alg it b g f 60
rboles de ExpansiónAlgoritmo de Dijsktra – Complejidad
• Utilizando la cola Min con los vértices ordenados porKey• Coste de la operación Dequeue: O (log V)• Coste de modificar una Key (Relax) en la cola:O (log V)
begin -- dijkstraInit_Queue (Q, g);
while not Empty (q) loopDequeue (Q, u);Mark_Vertex (g, u, TRUE);for i in Successors(g, u)’Range loop
v := Successors (g, u) (i);Relax (g, u, v);
end loop;end loop;
end dijkstra;
O(V)
O (log V)
O(log V)
2*E veces
V veces O (V log V)
O (E log V)
O ((V+E) log V)
O (E log V)
Si el grafo esconexo
Calcular la complejidad si se utiliza un array en lugar de una Cola Min (Q)
Top Related