4.1 Algoritmo de Dijkstra

download 4.1 Algoritmo de Dijkstra

of 17

Transcript of 4.1 Algoritmo de Dijkstra

Diapositiva 1

Algoritmo de DijkstraUPC 2013Conceptos clavesCamino (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 adyacentementeNo se debe pasar nuevamente por un mismo vrtice.Aristas adyacentes son las que aristas que tienen un vrtice en comn.3Final MuertoUn 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 CortoExisten 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-SPDijsktraBellman-FordTodos estos son (Single Source Shortest Path), es decir el camino ms corto desde un nodo X

5Conceptos generalesEl peso de un camino es la suma de las aristas que recorre.Un camino ms corto esta compuesto de varios caminos ms cortos.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.16Conceptos generalesUn 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 SPRepresentaremos 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,vEntonces 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.2Representacin de Grafo con Pesotypedef pair ii;

typedef struct{ vector< vector > 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 - DijsktraAlgoritmo de DijkstraFunciona 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 utilizarUna 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] = nullUn Min-Heap Q donde se guardan los vrtices no explorados totalmente Q en funcin a el valor de d[i].

Algoritmo de DijkstraDIJKSTRA (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] dorelax (u, v, W)

14Ejecucin del Algoritmo de Dijkstra01015764223901051015764223908145710157642239081357101576422390895710157642239stuvwCdigo Dijkstravoid dijkstra(graph *g, int v) { priority_queue 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;iedges[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));} } } } }

BibliografaAlgorithms, Fourth Edition. Rober Sedgewick and Kevin Waune. Princeton 200917