4 - Grafos.pdf

download 4 - Grafos.pdf

of 60

Transcript of 4 - Grafos.pdf

  • 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)