Académique Documents
Professionnel Documents
Culture Documents
www.cesarliza.com
Algoritmo de Dijsktra
Sirve para encontrar el camino ms corto de un vrtice elegido a cualquier otro vrtice del grafo. 10 0 Lima 12 4 Cuzco 8 15 3 Ilo 1 Ica
20
2 Tacna
El algoritmo de Dijsktra encontrar todas las distancias mnimas para ir de un vrtice de origen (Lima) a todos los otros vrtices (otras ciudades), por ejemplo si la ciudad origen es Lima, se obtendr: Lima Ica = 10 Km Lima Tacna = 23 Km Lima Ilo = 15 Km Lima Cuzco = 12 Km
Csar Liza Avila www.cesarliza.com
# include <iostream.h> # include <iomanip.h> # define N 25 # define MAX 1000000 struct EstadoVertice { int ultimo; int distancia; }; void leerMatCostos(int, int [ ][N]); void impMatriz(int, int [ ][N]); int minimo(int [ ], EstadoVertice [ ], int); void caminoMinimos (int, EstadoVertice [ ], int [ ][N], int); void main(void) { int n, origen=0; int matPesos[N][N]; EstadoVertice D[N]; cout<<"Nro de vertices:"; cin>>n; leerMatCostos(n, matPesos); impMatriz(n, matPesos); caminoMinimos(origen, D, matPesos, n); for(int i=0;i<n;i++) { if ( origen!=i ) { cout <<"El camino mas corto desde <<origen<<" a "<<i<<" es "<<D[i].distancia; } cout<<endl; } }
www.cesarliza.com
int minimo(int F[], EstadoVertice D[], int n) { int j, v, mx= MAX; for(j=1; j<n; j++) if( !F[j] && (mx>=D[j].distancia) ) { mx=D[j].distancia; v=j; } return v; } void caminoMinimos( int origen, EstadoVertice D[ ], int matPesos[ ][N], int n) { int v, w, i, F[N], s=origen; // vrtice origen F[s]=1; for(i=1; i<n; i++) { F[i]=0; D[i].distancia = matPesos[0][i]; D[i].ultimo = 0; } for(i=1; i<n; i++) { v=minimo(F, D, n); F[v] = 1; for(w=1; w<n; w++) { if(!F[w]) if( (D[v].distancia + matPesos[v][w]) < D[w].distancia) { D[w].distancia = D[v].distancia + matPesos[v][w]; D[w].ultimo = v; } } } }
Csar Liza Avila www.cesarliza.com
Algoritmo de Floyd
Encuentra el camino mnimo entre todos los pares de nodos, en una pasada.
www.cesarliza.com
# include <iostream> # include <iomanip> using namespace std; # define INF 1.0E+38 # define N 5 void todoCaminoMinimo (double costes[ ][N], double D[ ][N], int traza[ ][N], int n) { int i, j, k; for(i=0; i<n; i++) for(j=0; j<n; j++) { D[i][j] = costes[i][j]; traza[i][j]=-1; } for(i=0; i<n; i++) D[i][i] = 0; for(k=0; k<n; k++) for(i=0; i<n; i++) for(j=0; j<n; j++) if( D[i][k] + D[k][j] < D[i][j] ) { D[i][j] = D[i][k] + D[k][j]; traza[i][j]=k; } }
Csar Liza Avila www.cesarliza.com
void recuperaCamino( int vi, int vj, int traza[ ][N]) { int vk; vk=traza[vi][vj]; if ( vk != -1 ) { recuperaCamino(vi, vk, traza); cout<<vk<<" -> "; recuperaCamino(vk, vj, traza); } }
void main(void) { double costes[ ][N]= { { 0, 1, INF, INF, INF}, { INF, 0, INF, 4, 7}, { 3, 2, 0, INF, 4}, { 6, INF, INF, 0, 2}, { INF, INF, INF, 3, 0} }; double D[N][N]; int traza[N][N], vi, vj; todoCaminoMinimo (costes, D, traza, N); for(int i=0;i<N;i++) { for(int j=0; j<N; j++) cout <<setw(8)<<D[i][j]<<" "; cout<<endl; } cout<<endl<<endl; cout<<"Nodo inicial:"; cin>> vi; cout<<"Nodo final :"; cin>> vj; recuperaCamino(vi, vj, traza); cout<<endl; }
Csar Liza Avila www.cesarliza.com
Algoritmo de Warshall
Nos dice si existe camino entre dos pares de vertices.
void todoCaminoMinimo (int costes[ ][N], int D[ ][N], int n) { int i, j, k; for(i=0; i<n; i++) for(j=0; j<n; j++) D[ i ][ j ] = costes[ i ][ j ];
for(i=0; i<n; i++) D[ i ][ i ] = 0; for(k=0; k<n; k++) for(i=0; i<n; i++) for(j=0; j<n; j++) D[ i ][ j ] = D[ i ][ j ] || ( D[ i ][ k ] && D[ k ][ j ] ); }
Csar Liza Avila www.cesarliza.com
Algoritmo de Prim
Permite obtener el rbol de expansin de coste mnimo
4 7 8 0 2 10 7 10 3 6 1 7 6 0 7 1 7 3 8 6 7 3 6 7 10 10 0 2 7 9 6 8 1 7 6 5 3 4 8 2 8 3 6 8 3 6 7 6 5 6
10 10
6 9
10
10
7 9
www.cesarliza.com
# include <iostream> # include <iomanip> using namespace std; # define INF 1.0E+38 # define N 6 double arbolExpansion (double costos[ ][N], int n);
1
void main(void) { double costos[ ][N]= { { 0, 2, 1, INF, 3, 6 }, { 2, 0, 3, 2, INF, INF }, { 1, 3, 0, 4, INF, INF }, { INF, 2, 4, 0, INF, 5 }, { 3, INF, INF, INF, 0, 4 }, { 6, INF, INF, 5, 4, 0 } }; cout<<"Costo :" << arbolExpansion (costos, N); cout<<endl; }
Csar Liza Avila www.cesarliza.com
2 3 0 3 4 4 1
2 4
3 5
2
6 5
double arbolExpansion (double costos[ ][N], int n) { int i, j; double longMin, menor; int z; double costo[N]; int masCerca[N]; int W[N]; for(i=0; i<n; i++) W[i]=0; longMin = 0; W[0] = 1; for(i=1; i<n; i++) { costo[i]=costos[0][i]; masCerca[i] = 0; }
for(i=1; i<n; i++) { menor= costo[1]; z=1; for(j=2; j<n; j++) if(costo[j] <menor) { menor=costo[j]; z=j; } longMin += menor; cout<<masCerca[z]<<" "<<z<<endl; W[z]=1; costo[z] = INF; for(j=1; j<n; j++) if(costos[z][j] < costo[j] && !W[j]) { costo[j] = costos[z][j]; masCerca[j] =z; } } return longMin; }
Csar Liza Avila www.cesarliza.com
1 2 3 2 4 2 3 4 6 5 5 3 4 0 2
1
2
5 4
www.cesarliza.com