Algoritmo de Dijkstra Alejandro Strejilevich de Loma Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires Septiembre de 2015 Introducción Problemas de camino mínimo: uno a uno; uno a todos; todos a todos; todos a uno; ... Representación de grafos: listas de adyacentes/sucesores; matriz de adyacencia; ... ASdeL Algoritmo de Dijkstra Dijkstra - Características ¾Qué problema de camino mínimo resuelve? Desde un vértice dado a todos los vértices (uno a todos). √ ¾Sirve desde un vértice dado a otro especíco (uno a uno)? SÍ. Se puede interrumpir el algoritmo cuando se calcula el vértice deseado. √ ¾Sirve entre todo par de vértices (todos a todos)? SÍ. Se corre el algoritmo empezando desde cada vértice. √ ¾Sirve para grafos no dirigidos? SÍ. √ ¾Sirve para grafos dirigidos? SÍ. ¾Sirve para grafos con circuitos negativos? NO. × No existe camino mínimo para los vértices del circuito. ¾Sirve para grafos con ejes negativos? NO. × El algoritmo puede dar resultados incorrectos. ASdeL Algoritmo de Dijkstra Dijkstra - Funcionamiento (ejercicio) y complejidad Bases: Alien (A), Barbarella (B), Challenger (C), Duran-Duran (D) y Enterprise (E). Dispositivos robóticos: R1 y R2. R1 debe ir a reparar a R2. Distancias: A B B C D E R1 R2 1 1 2 4 1 7 1 2 5 4 6 2 3 5 5 2 3 6 C D E 5 R1 3 14 R1 consume: 2 unidades de energía por unidad de distancia recorrida; 1 unidad de energía cada vez que ingresa o egresa de una base; 0 unidades de energía mientras está dentro de alguna base. Determinar el recorrido que debe seguir R1 para minimizar su consumo de energía. ASdeL Algoritmo de Dijkstra G = (V , E ); n = |V |; m = |E | ` : E → R≥0 (longitud ejes) Dijkstra(G , v ) π () ← +∞; π (v ) ← 0 S ← ∅; ant () ← nil para i ← 1, 2, . . . n w ∗ ← argminw ∈V −S π (w ) S ← S ∪ {w ∗ } para w ∈ Γ(w ∗ ) ∩ (V − S ) x ← π (w ∗ ) + `(w ∗ , w ) si π (w ) > x π (w ) ← x ; ant (w ) = w ∗ n si n para n para devolver π (), ant () G : listas de adyacentes/sucesores S : vector de bool; ant : vector π () vector π () heap O (n ) O (n ) O (n ) −→ O (n2 ) n O (1) −→ O (n ) n m O (1) −→ O (m ) m O (1) −→ O (m ) m O (1) −→ O (m ) O (n 2 ) TOTAL ASdeL Algoritmo de Dijkstra G = (V , E ); n = |V |; m = |E | ` : E → R≥0 (longitud ejes) Dijkstra(G , v ) π () ← +∞; π (v ) ← 0 S ← ∅; ant () ← nil para i ← 1, 2, . . . n w ∗ ← argminw ∈V −S π (w ) S ← S ∪ {w ∗ } para w ∈ Γ(w ∗ ) ∩ (V − S ) x ← π (w ∗ ) + `(w ∗ , w ) si π (w ) > x π (w ) ← x ; ant (w ) = w ∗ n si n para n para devolver π (), ant () G : listas de adyacentes/sucesores S : vector de bool; ant : vector π () vector π () heap O (n ) O (n ) O (n ) O (n ) O (n ) −→ O (n2 ) n O (1) −→ O (n ) n O (lg n ) −→ O (n lg n ) n O (1) −→ O (n ) O (1) −→ O (m ) m O (1) −→ O (m ) m O (1) −→ O (m ) m O (1) −→ O (m ) m (½!) O (1) −→ O (m) m O (lg n ) −→ O (m lg n ) O (n 2 ) O ((m + n ) lg n ) TOTAL ASdeL Algoritmo de Dijkstra n m G = (V , E ); n = |V |; m = |E | ` : E → R≥0 (longitud ejes) Prim(G , v ) π () ← +∞; π (v ) ← 0 S ← ∅; ant () ← nil para i ← 1, 2, . . . n w ∗ ← argminw ∈V −S π (w ) S ← S ∪ {w ∗ } para w ∈ Γ(w ∗ ) ∩ (V − S ) x ← π (w ∗ ) + `(w ∗ , w ) si π (w ) > x π (w ) ← x ; ant (w ) = w ∗ n si n para n para devolver π (), ant () G : listas de adyacentes/sucesores S : vector de bool; ant : vector π () vector π () heap O (n ) O (n ) O (n ) O (n ) O (n ) −→ O (n2 ) n O (1) −→ O (n ) n O (lg n ) −→ O (n lg n ) n O (1) −→ O (n ) O (1) −→ O (m ) m O (1) −→ O (m ) m O (1) −→ O (m ) m O (1) −→ O (m ) m (½!) O (1) −→ O (m) m O (lg n ) −→ O (m lg n ) O (n 2 ) O ((m + n ) lg n ) TOTAL ASdeL Algoritmo de Dijkstra n m