Professional Documents
Culture Documents
No hay solucin
Se puede comprobar utilizando fuerza bruta
Demostracin de Euler
Nodos adyacentes
Si estn unidos por una arista
!"#$%! ! = ! |!|!
Handshaking Lemma
!!!
Grafo no conexo
No existe un camino que una un
nodo con los dems
No existe un camino entre a y e
Bosque
Grafo sin ciclos
rbol libre
Bosque conexo
Con un nodo en el papel de raz
! ! !
!
!
!
Si G es conexo, |E| |V|-1
Si G es rbol, |E| = |V|-1
Si G es bosque |E| |V|-1
Dirigido o no dirigido
Conexo?
Bosque?
Grado de los nodos
2
3
Listas de adyacencia
5
G=(V,E)
2
3
Matriz de adyacencia
5
G=(V,E)
Grafos densos
|E| (|V|*(|V|-1))/2
Un solo bit por arista
Espacio (|V|2)
Consultas sobre aristas
10
11
Conectividad y Recorrido
Dado un grafo G=(V,E) y dos nodos s y t
Problemas: Existe un camino para llegar de s a t?
A qu distancia estn?
Concepto de distancia entre dos nodos s y t como (s, t)
Mnimo nmero de aristas entre s y t.
12
Conectividad y Recorrido
Lista de Adyacencia
0
0
2
Resultado
L1
L2
13
Conectividad y Recorrido
Algoritmo BFS
graph : Graph_Type (Max_Vertices => N); -- Un grafo de N nodos
procedure BFS (g: in out Graph_Type; s: Vertex_Type) is
Q
: FIFO;
-- Cola. Inicialmente vacia
v
: Vertex_Type;
w
: Vertex_Type;
begin
Push (Q, s);
Mark_Vertex (g, s, TRUE);
-- Visitado a TRUE
while not Is_Empty (Q) loop
Pop (Q, v);
for i in Successors (g, v)'Range loop
w := 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;
end BFS;
14
Conectividad y Recorrido
Complejidad de BFS
Con listas de adyacencia
Un nodo slo puede aparecer una vez en la cola (Q)
while not Is_Empty (Q) loop
Pop (Q, v);
for i in Successors (g, v)'Range loop
w := 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;
V veces
O(1)
O(V)
O(V+E)
2*E Veces
O(E)
O(1)
end loop;
end loop;
15
Conectividad y Recorrido
Complejidad de BFS
Con matriz de adyacencia en un lugar de lista de
adyacencia
while not Is_Empty (Q) loop
V veces
O(V2)
V veces
end loop;
Algoritmos sobre grafos
16
Conectividad y Recorrido
Lista de Adyacencia
Depth-First Search
(DFS)
Desde el nodo 0
0
0
0
1
3
5
Resultado
3
5
Conectividad y Recorrido
Algoritmo DFS versin recursiva
graph : Graph_Type (Max_Nodos => N);
-- Grafo de N nodos
end DFS;
18
Conectividad y Recorrido
Complejidad algoritmo DFS versin recursiva
Complejidad
V llamadas recursivas
O(V)
2*E veces
O(1)
O(1)
O(E)
O(V + E)
end loop;
end DFS;
19
Conectividad y Recorrido
Algoritmo DFS Versin No Recursiva
procedure DFS (g: in out Graph_Type; s:
Vertex_Type) is
p: STACK;
-- Pila
u: Vertex_Type;
begin
Push (p, s);
while not Is_Empty (p) loop
Pop (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;
Complejidad
O(V)
O(2*E)
O(V+E)
O(E)
20
Conectividad y Recorrido
Grafos Dirigidos
Con BFS y DFS comprobamos la existencia de un camino entre
dos nodos s y t
Aunque exista el camino, puede que no exista entre t y s
Un grafo est fuertemente conectado si:
s, t V, existe un camino entre s y t y entre t y s
A
B
A
Fuertemente conectado
NO fuertemente conectado
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
21
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 topolgico.
Si G es un DAG, entonces tiene orden topolgico
MD
FP
ED
ALG
ED
SD
SO
FP
MD
ALG
POO
C
SO
SD
POO
C
22
Conectividad y Recorrido
Algoritmo de ordenacin topolgica
ORDENACION_TOPOLGICA (G):
Encontrar un nodo u / v V, (v, u) E
R {u} R
G.V G.V {u}
if G.V then
ORDENACION_TOPOLGICA (G)
endif
3
6
(3)
R {1, 2, 3}
(4)
(1)
(2)
7
R {1}
(5)
R {1, 2}
6
5
(6)
7
(7)
R {1, 2, 3, 4, 5, 6}
R {1, 2, 3, 4, 5, 6, 7}
R {1, 2, 3, 4, 5}
R {1, 2, 3, 4}
23
Conectividad y Recorrido
1/2
if n /= NO_HAY_NODO then
Mark_Vertex (graph, n, true);
24
Conectividad y Recorrido
2/2
if In_Degree (g, w) = 0 and not Marked (g, w) then --- Seleccionar el nodo
return w;
--- con grado de entrada 0
end if;
--- y sin marcar
end loop;
return NO_HAY_NODO;
end Nodo_Candidato;
25
Conectividad y Recorrido
function Nodo_Candidato (g: Graph_Type) return Integer is
w: Vertex_Type;
begin
for i in Vertices_List (g)'Range loop
w := Vertices_List (g) (i);
if In_Degree (g, w) = 0 and not Marked (g, w) then
return w;
end if;
end loop;
return NO_HAY_NODO;
end Nodo_Candidato;
Complejidad
O(V)
O(V)
O(1)
O(V2)
O(V2)
O(E)
26
27
rboles de Expansin
Cmo conectar todos los nodos con el mnimo coste?
2
11
I
7
14
w(T ) =
w(u, v), T E
(u,v)T
E
w : E
10
H
Aplicaciones
Logstica
Conexionado
v Ciudades,
v Componentes elctricos,
v Personas, etc.
Enrutamiento en redes
2
I
4
G
Coste 37
Se puede sustituir (B,C) por (A,H)
con igual coste
28
rboles de Expansin
Propiedades de los arboles de expansin:
Tienen |V|-1 arcos
No tienen ciclos
Pueden no ser nicos
Algoritmo Genrico
29
rboles de Expansin
Algoritmo de Kruskal
Descripcin
Algoritmo voraz, en cada iteracin aade un arco de peso mnimo
Se parte de un bosque que inicialmente contiene un rbol por cada
vrtice
Los arcos estn ordenados de forma creciente por su peso
Mientras existan arcos para aadir y el bosque inicial no sea un rbol el
algoritmo continua
Cuando aadir un arco provoca un bucle, se desecha y se continua con
el siguiente.
30
rboles de Expansin
Algoritmo de Kruskal
Ejemplo (1/2)
1
3
7
3
6
5
4
3
7
4
1
1
5
3
7
9
3
3
9
1
3
3
4
1
5
6
1
6
1
2
3
1
5
4
1
3
7
31
rboles de Expansin
Algoritmo de Kruskal
Ejemplo (2/2)
4
2
3
5
9
3
4
9
3
2
7
9
3
2
7
4
1
3
7
Coste 12
Implementacin
Mediante conjuntos para representar los diferentes arboles
Estructura de datos para manejar conjuntos disjuntos (Union-Find)
Operaciones sobre conjuntos:
Make-Set (u)
Union (u, v)
Find (u)
32
rboles de Expansin
Estructura de datos Union-Find
Find (u) devuelve el conjunto al que pertence el nodo u
Para comprobar si un arco (u,v) genera un ciclo:
if Find (u) = Find (v) then ......
Para combinar dos arboles mediante el arco (u,v):
Union (u, v)
S1
S2
cab
cola
cab
Arcos
cola
Conjunto
(a,b)
{a, b}
(c,d) (d,e)
{c, d, e}
A
C
B
D
33
rboles de Expansin
Estructura de datos Union-Find
Union (b, c)
S1
cab
cola
Arcos
Conjunto
(a,b)
{a, b}
(c,d) (d,e)
{c, d, e}
Dos arboles
Un nico rbol
34
rboles de Expansin
Algoritmo de Kruskal (1/2)
procedure kruskal is
g, mst : Graph_Type (Max_Vertices);
Q
: Queue_Type (Max_Edges); -- Cola ordenada de forma asc. por peso
uf
: UnionFind_Type;
u, v
: Vertex_Type;
e
: Edge_Type;
begin
Load_Graph (g, ..);
Clear (mst);
-- Aadir en 'mst' los vertices
for i in Vertices_List (g)'Range loop
v := Vertices_List (g)(i);
Add_Vertex (mst, v);
-- Aadir los nodos al grafo mst
Make_Set (uf, v);
-- Inicializar estructura Union Find
end loop;
Init_Queue (Q, g);
rboles de Expansin
Algoritmo de Kruskal (2/2)
Se puede mejorar?
-- Sacamos un arco con el menor peso
36
rboles de Expansin
Algoritmo de Kruskal - Complejidad
begin -- kruskal
for i in Vertices_List (g)'Range loop
v := Vertices_List (g)(i);
Add_Vertex (mst, v);
Make_Set (uf, v);
end loop;
ordenar
Init_Queue (Q, g);
Heap Sort
O(V)
O(E lg E)
|E| |V|2
O(E lg V)
O(E lg V)
O(E)
37
rboles de Expansin
Algoritmo de Prim
Descripcin
38
rboles de Expansin
Algoritmo de Prim
Ejemplo (raz el vrtice 6)
4
2
3
3
4
3
1
Cola:
6-7 2
6-2 4
peso
3
1
4
1
3
7
saco 6-7
visito 7
saco 6-2
visito 2
Cola:
6-2 4
7-1 6
7-5 9
Cola:
2-3 1
2-5 3
7-1 6
7-5 9
1
6
2
3
visito 6
3
1
arco
1
6
1
5
(1/3)
rboles de Expansin
Algoritmo de Prim
Ejemplo
4
2
3
(2/3)
3
5
9
3
4
4
1
3
7
saco 2-3
visito 3
saco 3-5
visito 5
saco 5-1
visito 1
Cola:
3-5 1
2-5 3
3-4 5
7-1 6
7-5 9
Cola:
5-1 1
2-5 3
3-4 5
7-1 6
7-5 9
Cola:
2-5 3
1-4 3
3-4 5
7-1 6
7-5 9
El nodo 2 ya ha sido
visitado
Los nodos 2, 3 y 7
ya han sido visitados
9
3
2
7
9
3
2
7
Los nodos 5 y 7 ya
han sido visitados
40
rboles de Expansin
Algoritmo de Prim
Ejemplo
4
(3/3)
2
3
1
5
4
1
3
7
saco 2-5
Cola:
1-4 3
3-4 5
7-1 6
7-5 9
Los nodos 2 y 5 ya
han sido visitados
3
3
6
9
3
1
1
5
1
6
3
3
4
1
3
7
saco 1-4
visito 4
saco 7-1
saco 7-5
Cola:
7-1 6
7-5 9
Cola:
Los nodos 1 y 3 ya
han sido visitados
41
rboles de Expansin
Algoritmo de Prim
El tiempo de ejecucin del algoritmo depende de la
bsqueda del arco de peso mnimo
Para cada vrtice se aaden las informaciones:
key
parent
key
INTEGER;
parent: Vertex_Id;
end record;
42
rboles de Expansin
Algoritmo de Prim (1/2)
procedure prim is
g
: Graph_Type (Max_Vertices);
v, u
: Vertex_Type;
Q
: Queue_Type; --- Cola ordenada
begin -- prim
Load_Graph (g, ..);
-- Inicializar los campos key y parent
for 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 vrtice
end loop;
v := Vertices_List (g)(1); -- raz
Set_Key (g, v, 0);
43
rboles de Expansin
Algoritmo de Prim (2/2)
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 Weight_Of (g, u, v) < Get_Key (g, v) then
Set_Parent (g, v, u);
Set_Key (g, v, Weight_Of (g, u, v)); --- Puede modificar el orden de
--- los vrtices en Q
end if;
end loop;
end loop;
end prim;
44
rboles de Expansin
O(V log V)
O(V log V)
O(E log V)
O(E log V)
Al ser un grafo conexo
|E| |V| - 1
45
46
Caminos mnimos
Tambin
Cul es la ms barata?
Cul es la de menor
distancia recorrida?
1
A
2
B
1
5
C
4
3
F
E
2 caminos mnimos
47
Caminos mnimos
48
Caminos mnimos
Definiciones
Se parte de un grafo ponderado
G=(V,E) y w: ER
w( p) = w(vi1, vi )
i=1
49
Caminos mnimos
Tcnica de la relajacin de arcos
Asignar peso y predecesor a cada vrtice/nodo
Peso al origen (v.key), inicialmente a infinito
Predecesor (v.parent), nodo previo en el camino
Tcnica de Relajamiento
A
d=5
B
d=9
RELAX
A
d=5
B
d=7
50
Caminos mnimos
Algoritmo de Bellman-Ford
Obtiene los caminos mnimos desde un vrtice al resto
Admite arcos con peso negativo
Para cada vrtice se aade la informacin:
key
51
Caminos mnimos
Algoritmo de Bellman-Ford
Fuente
A
D=
-1
B
D=
S
D=0
C
D=
A
D=3
(S, A) = 3
(S, B) = 2
C
D=2
S
D=0
D
D=
-1
S
D=0
-1
relax
relax
2
B
D=2
-1
D
D=6
(S,C) = 2
(S,D) = 3
A
D=3
2
C
D=2
A
D=3
-1
-1
S
D=0
2
C
D=2
B
D=
-1
D
D=
B
D=2
-1
D
D=3
Relaja (C,D)
52
Caminos mnimos
Algoritmo de Bellman-Ford (Con arcos de peso Negativo)
Problema: No encontrar el camino mnimo en presencia de ciclos
A
D=3
-4
B
D=-1
3
S
D=0
(S,A) = w(S,A) = 3
(S,B) = -1
4
5
6
C
d=5
D
d=11
G
d=-
-3
2
7
3
E
d=-
F
d=-
-6
53
rboles de Expansin
Algoritmo de Bellman-Ford (1/2)
function bellmanford is
g
: Graph_Type (Max_Vertices);
e:
: Edge_Type;
begin
Load_Graph (g, ..);
Init_Source (g, Vertices_List (g)(1));
for n in 1..Max_Nodos 1 loop
for i in Edges_List (g)Range loop
e := Edges_List (g)(i);
Relax (g, e.From (), e.To ());
end loop;
end loop;
Complejidad
V veces
E veces
O(VE)
O(VE)
E veces
O(E)
for i in Edges_List (g)Range loop
e := 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;
54
rboles de Expansin
Algoritmo de Bellman-Ford (2/2)
procedure Init_Source (g: in out Graph_Type; source: in Vertex_Type) is
g
: Graph_Type (Max_Vertices);
v:
: Vertex_Type;
begin
for 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) is
begin
if Get_Key (g, to) > (Get_Key (g, from) + Weight_Of (g, from, to)) then
Set_Key (g, to, Get_Key (g, from) + Weight_Of (g, from, to));
Set_Parent (g, to, from);
end if;
end Relax;
55
Caminos mnimos
Algoritmo de Dijkstra
Grafos dirigidos con pesos no negativos
Explorar todos los caminos ms cortos desde la fuente
Estrategia voraz
Para cada nodo se aaden las informaciones:
key
parent
56
Caminos mnimos
Nodos con camino mnimo
Ejemplo:
3
A
d=
S
d=0
(1)
2
2
C
d=
A
d=3
S
d=0
(3)
1
2
C
d=2
A
d=3
S
d=0
(5)
1
2
C
d=2
B
d=
1
3
S
d=0
D
d=
(2)
B
d=
1
(4)
B
d=4
1
D
d=3
C
d=2
A
d=3
(6)
1
2
C
d=2
A
d=3
S
d=0
1
2
S
d=0
D
d=3
A
d=3
1
2
C
d=2
B
d=
1
D
d=
B
d=4
1
D
d=3
B
d=4
1
D
d=3
Existe
camino
alternativo?
57
Caminos mnimos
Nodos con camino mnimo
Ejemplo: (Alternativa)
3
A
d=
S
d=0
(1)
2
2
C
d=
A
d=3
S
d=0
(3)
1
2
C
d=2
A
d=3
S
d=0
(5)
1
2
C
d=2
B
d=
1
3
S
d=0
D
d=
(2)
B
d=
1
(4)
B
d=4
1
D
d=3
C
d=2
A
d=3
(6)
1
2
C
d=2
A
d=3
S
d=0
1
2
S
d=0
D
d=3
A
d=3
1
2
C
d=2
B
d=
1
D
d=
B
d=4
1
D
d=3
B
d=4
1
D
d=3
58
rboles de Expansin
Algoritmo de Dijkstra
procedure dijkstra is
g
: Graph_Type (Max_Vertices);
Q
: Queue_Type (Max_Vertices);
u,v
: Vertex_Type;
begin
Load_Graph (g, ..);
Init_Source (g, Vertices_List (g)(1));
Init_Queue (Q, g);
while not Empty (Q) loop
Dequeue (Q, u);
Mark_Vertex (g, u, TRUE);
--- Alcanzado el vrtice u
for i in Successors(g, u)Range loop
v := Successors (g, u) (i);
Relax (g, u, v); --- Puede modificar el orden de los vrtices en Q
end loop;
end loop;
end dijkstra;
59
rboles de Expansin
Algoritmo de Dijsktra Complejidad
Utilizando la cola Min con los vrtices ordenados por Key
Coste de la operacin Dequeue: O (log V)
Coste de modificar una Key (Relax) en la cola: O (log V)
begin -- dijkstra
Init_Queue (Q, g);
while not Empty (q) loop
Dequeue (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)
V veces
O (log V)
2*E veces
O(log V)
O (V log V)
O (E log V)
O ((V+E) log V)
Si el grafo es
conexo
O (E log V)
60