Algoritmo Dijkstra En C

  • Uploaded by: manuel181991
  • 0
  • 0
  • January 2021
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Algoritmo Dijkstra En C as PDF for free.

More details

  • Words: 1,393
  • Pages: 5
Loading documents preview...
ALGORITMO DIJKSTRA EN C++ #include #include #include using namespace std; #define MAXNODOS 500 // tamaño máximo de la red #define INDEFINIDO -1 int N; float dist[MAXNODOS][MAXNODOS]; float minimo[MAXNODOS]; int anterior[MAXNODOS]; bool visitado[MAXNODOS]; bool minimoNodoNoVisitado (int * nodo) { int candidato = -1; for (int n = 0; n < N; n++) { if (!visitado[n] && (minimo[n] < minimo[candidato] || candidato == -1)) { candidato = n; } } *nodo = candidato; return candidato != -1; } void dijkstra (int origen, int destino) { minimo[origen] = 0.0; int nodo; while (minimoNodoNoVisitado(&nodo)) { if (minimo[nodo] == FLT_MAX) return; // otros vértices son inaccesibles visitado[nodo] = true; for (int n = 0; n < N; n++) { if (!visitado[n] && distancia[nodo][n] < 1.0) { float posibleMin = minimo[nodo] + distancia[nodo][n]; if (posibleMin < minimo[n]) { minimo[n] = posibleMin; anterior[n] = nodo; }}}}} void camino_minimo (int inicio, int final) { if (inicio != final) { camino_minimo (inicio, anterior[final]); cout << ", "; } cout << final; } int main(int argc, char **argv) { int M, inicio, final; // inicializar matriz de distancias y camino minimo cin >> N; for (int k = 0; k < N; k++) { anterior[k] = INDEFINIDO; visitado[k] = false; minimo[k] = MAXINT; for (int l = 0; l < N; l++) { camino[k][l] = FLT_MAX; } } // leer distancias en arcos reales cin >> M; for (int k = 0; k < M; k++) { int i, j; cin >> i >> j; cin >> prob[i][j]; } cin >> inicio >> final; dijkstra(inicio, final); camino_minimo(inicio, final); return 0; }

EN PSEUDOCODIGO función Dijkstra (Grafo G, nodo_salida s) //Usaremos un vector para guardar las distancias del nodo salida al resto entero distancia[n] //Inicializamos el vector con distancias iniciales booleano visto[n] //vector de boleanos para controlar los vertices de los que ya tenemos la distancia mínima para cada w ∈ V[G] hacer Si (no existe arista entre s y w) entonces distancia[w] = Infinito //puedes marcar la casilla con un -1 por ejemplo Si_no distancia[w] = peso (s, w) fin si fin para distancia[s] = 0 visto[s] = cierto //n es el número de vertices que tiene el Grafo mientras que (no_esten_vistos_todos) hacer vertice = coger_el_minimo_del_vector distancia y que no este visto; visto[vertice] = cierto; para cada w ∈ sucesores (G, vertice) hacer si distancia[w]>distancia[vertice]+peso (vertice, w) entonces distancia[w] = distancia[vertice]+peso (vertice, w) fin si fin para fin mientras fin función ALGORITMO DE FLOYD Inicio Armar la matriz de adyacencia F, teniendo en cuenta que F(i,j)=0 si i = j (diagonal principal es 0). Además dónde no exista camino se debe indicar con infinito. Para k desde 1 hasta n Para i desde 1 hasta n Para j desde 1 hasta n F[i,j]=min(F[i,j], F[i,k] + F[k,j]) Fin para j Fin para i Fin para k En la k-esima vuelta F[i, j] contendrá el valor del camino más corto que una al vértice i con el j tal que dicho camino no pase por un vértice con número mayor que k. La matriz resultante es la de los mínimos caminos entre cada nodo. Si se quiere saber cual es dicho camino, se debe armar un árbol a medida tomando como numero de nodo a k cada vez que se detecta que hubo una optimización. //#include #include #include #define INF 999 #define N 3 void mostrar(int [N][N]); void main() { int k,i,j; int F[N][N]={ 0, 8, 5,3, 0,INF,INF, 2, 0 }; clrscr(); cout << "k = 0" << endl; mostrar(F); for(k=0;k F[i][k] + F[k][j]) { F[i][j] = F[i][k] + F[k][j];

cout << " =>Fk [" << (i+1) << ", "; cout << (j+1) << "] = " << F[i][j]; } cout << endl;}}} cout << "k = " << (k+1) << endl; mostrar(F);} } void mostrar(int F[N][N]) { int i,j; for(i=0;ij tal que NO pasa por el vértice con número mayor que k si: Ya existe un camino i->j tal que no pasa por camino con “número” mayor que k-1 Ó Existe un camino i -> k tal que no pasa por el vértice con “número” mayor que k-1 y si existe un camino k->j tal que no pasa por vértice con número mayor que k-1 #include #include #include<stdio.h> #include<stdlib.h> class path { int n; int p[10][10]; int a[10][10]; int c[10][10]; public: void get(); void pm(); void ap(); void disp(); }; void path::get() { int i,j,k; clrscr(); cout<<"Enter the no. of nodes in the graph :"; cin>>n; cout<<"Enter the adjacency matrix :"; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) {// cout<<"a["<<<","<<j<<"] = "; cin>>a[i][j]; p[i][j]=0; }} cout<<"Enter The cost matrix is :"; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) {// cout<<"a["<<<","<<j<<"] = "; cin>>c[i][j]; }} for(i=1;i<=n;i++) {for(j=1;j<=n;j++)

{p[i][j]=a[i][j]; }}} void path::disp() { //cout<<"The output matrix for the given graph is :"; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout< del grafo por cada u en V[G] hacer distancia[u] = INFINITO padre[u] = NULL Añadir(cola,) distancia[s]=0 mientras cola != 0 do // OJO: Se entiende por mayor prioridad aquel nodo cuya distancia[u] es menor. u = extraer_minimo(cola) //devuelve el minimo y lo elimina de la cola. por cada v adyacente a 'u' hacer si ((v ∈ cola) && (distancia[v] > peso(u, v)) entonces padre[v] = u distancia[v] = peso(u, v) Actualizar(cola,)

ALGORITMO DE KRUSKAL

function Kruskal(G) for each vertex v in G do Define an elementary cluster C(v) ← {v}. Initialize a priority queue Q to contain all edges in G, using the weights as keys. Define a tree T ← Ø //T will ultimately contain the edges of the MST // n es el número total de vértices while T has fewer than n-1 edges do // edge u, v is the minimum weighted route from/to v (u,v) ← Q.removeMin() // previene ciclos en T. suma u, v solo si T no contiene una arista que una u y v. // Nótese que el cluster contiene más de un vértice si una arista une un par de // vértices que han sido añadidos al árbol. Let C(v) be the cluster containing v, and let C(u) be the cluster containing u. if C(v) ≠ C(u) then Add edge (v,u) to T. Merge C(v) and C(u) into one cluster, that is, union C(v) and C(u). return tree T #include #include #include #define max 100 using namespace std; struct Edge{ int vi,vj,w; }; bool lequal(Edge const* t1, Edge const* t2){ return (t1->ww);} int V,E; vector <Edge*>edges; vector <Edge*>mst; int cicles[max]; int main(){ int i,W,number,c; Edge *e; c=1; while(true){ edges.clear(); mst.clear(); cin>>V>>E; if(!V && !E) break; for(i=0;i<E;i++){ e = new Edge; cin>>e->vi>>e->vj>>e->w; edges.push_back(e); } sort(edges.begin(),edges.end(),lequal); for(i=0;ivi]!=cicles[edges[0]->vj]){ number = cicles[edges[0]->vj]; for(i=0;ivi];} mst.push_back(edges[0]); } edges.erase(edges.begin(),edges.begin()+1); } W = 0; for(i=0;i<mst.size();i++) { W+=mst[i]->w; } cout<<"Case "<

Related Documents

Algoritmo Dijkstra En C
January 2021 2
Algoritmo
March 2021 0
Algoritmo Constructivo
February 2021 0
Ejercicios Resueltos En C
January 2021 3
Arreglos En C++
January 2021 0

More Documents from "Beastieux Zeroo"

Algoritmo Dijkstra En C
January 2021 2