Sei sulla pagina 1di 17

Algoritmo de Dijkstra

UPC 2013
CONCEPTOS CLAVES
Camino (Path)
Conjunto de vrtices para llegar de un
vrtice a otro pasando a travs de aristas
que no pueden ser repetidas y deben
estar ubicadas adyacentemente
No se debe pasar nuevamente por un
mismo vrtice.
Aristas adyacentes son las que aristas que
tienen un vrtice en comn.
Final Muerto
Un final muerto en un Grafo No Dirigido
significa que un nodo ya no tiene nodos
adyacentes que no hayan sido visitados
todava.
Un final muerto en un Grafo Dirigido
significa que un nodo ya no tiene ms
aristas de salida.

Algoritmos camino ms Corto
Existen varios algoritmos para calcular el
camino ms corto dentro de un Grafo
ponderado.
Estos alg. dependen de las propiedades del
Grafo.
Veremos los 3 ms importantes:
DAG-SP
Dijsktra
Bellman-Ford
Todos estos son (Single Source Shortest
Path), es decir el camino ms corto desde un
nodo X

Conceptos generales
1. El peso de un camino es la suma de las aristas que
recorre.
2. Un camino ms corto esta compuesto de varios
caminos ms cortos.
3. No se puede calcular el camino ms corto en un grafo
con ciclos negativos.
El camino ms corto de s a e es -



Cormen Figure 24.1
Conceptos generales
4. Un camino ms corto no contendr
ciclos.
Asumiendo que incluyamos un ciclo en un
SP.
Este tendra que ser de peso 0 para poder ser
considerado en el SP.
Si fuera mayor que 0, no sera el SP.
Al ser de peso 0. Podemos menospreciar al ciclo
dentro del SP.

Representacin de un SP
Representaremos el SP con un arreglo
P[v].
P[v] representar al predecesor del vertice v.
La distancia entre la raz y un nodo se
guarda en d[v]
El nodo de origen se llamar s en todos
los ejemplos.

Relaxation (Relajacin)
Concepto empleado por los algoritmos de
SP.
Si el camino para llegar a v es ms pesado
que el camino para llegar a u + la distancia
u,v
Entonces u ser el nuevo predecesor de
v.

RELAX(u, v, W)
if d[v] > d[u] + w(u,v)
d[v] d[u] + w(u,v)
p[v] u
Cormen Figure 24.2
Representacin de Grafo
con Peso
typedef pair<int, int> ii;

typedef struct
{
vector< vector<ii> > edges;
} graph;

void insert_edge(graph *g, int x, int y, int w, bool directed)
{
g->edges[x].push_back(ii(w,y));
if (!directed)
g->edges[y].push_back(ii(w,x));
}

SSSP - DIJSKTRA
Algoritmo de Dijkstra
Funciona para Grafos cclicos (solo aristas positivas)
Es un algoritmo Greedy.
Realiza un anlisis por etapas en donde evala la mejor
opcin.
Consiste en ir explorando todos los caminos ms
cortos que parten del vrtice origen y que llevan a
todos los dems vrtices.
Estructuras de Datos a utilizar
Una matriz w donde w[a][b] el peso de ir
de a hacia b.
Un arreglo S donde se almacenan los
vrtices ya explorados.
Los arreglos d (distancias) y p
(predecesores).
Al inicio d[i]= y p[i] = null
Un Min-Heap Q donde se guardan los
vrtices no explorados totalmente Q en
funcin a el valor de d[i].


Algoritmo de Dijkstra
DIJKSTRA (G, s)
INITIALIZE-SINGLE-SOURCE (G, s)
S
Q V
While Q
u EXTRACT-MIN(Q)
S S + {u}
for each vertex v Adj[u] do
relax (u, v, W)
Ejecucin del Algoritmo de Dijkstra
0


10
1
5
7
6
4
2
2 3 9
0
10
5
10
1
5
7
6
4
2
2 3 9
0
8 14
5 7
10
1
5
7
6
4
2
2 3 9
0
8 13
5 7
10
1
5
7
6
4
2
2 3 9
0
8 9
5 7
10
1
5
7
6
4
2
2 3 9
s
t u
v
w
Cdigo Dijkstra
void dijkstra(graph *g, int v) {
priority_queue<ii,vector<ii>,greater<ii> > pq;
dist[v]=0; pq.push(ii(dist[v],v)); // colocamos el primero...
while (!pq.empty()) {
ii top = pq.top(); pq.pop();
int d = top.first; int u = top.second;
if (dist[u] >= d) { // para validar que no ingrese una
arista ms pesada
for (int i=0;i<g->edges[u].size();i++) {
int v = g->edges[u][i].second;
int weight = g->edges[u][i].first;
if (dist[u] + weight < dist[v]) { // relax
dist[v] = dist[u] + weight;
pq.push(ii(dist[v],v));
} } } } }

Bibliografa
Algorithms, Fourth Edition. Rober Sedgewick and Kevin
Waune. Princeton 2009

Potrebbero piacerti anche