Sei sulla pagina 1di 3

#include<iostream> #define UnMonton 999 using namespace std; class camino { private: int MatrizAdyacencia[15][15]; int VerticeAnterior[15],Distancia[15]; bool

Etiqueta[15]; int VerticeInicial; int NumeroDeVertices; public: void CapturarDatos(); void ValoresIniciales(); int ProximoVertice(); void CalcularPeso(); void MostrarResultado(); void MostrarCaminoMasCorto(int); }; int main() { system("color f5"); camino hacer; hacer.CapturarDatos(); hacer.CalcularPeso(); system("color ac"); cout<<"\t\nRuta recorrida. El camino mas corto se muestra al final: \n"; hacer.MostrarResultado(); system("PAUSE"); return EXIT_SUCCESS; return 0; } void camino::CapturarDatos() { cout<<"\t Camino mas corto entre dos vertices de un grafo simple no dirigido "; cout<<"\n\nColoca el numero de vertices que tiene el grafo:\t"; cin>>NumeroDeVertices; while(NumeroDeVertices <= 0) { cout<<"\n\nColoca de nuevo el numero de vertices que tiene el grafo:\t" ; cin>>NumeroDeVertices; } cout<<"\nAhora, introduce los pesos de cada arista mediante una matriz de ad yacencia.\n"; for(int i=0;i<NumeroDeVertices;i++) { cout<<"\nLlena los datos de la fila "<<i<<endl; for(int j=0;j<NumeroDeVertices;j++) {

cin>>MatrizAdyacencia[i][j]; while(MatrizAdyacencia[i][j]<0) { cout<<"Los pesos deben de tener un valor positivo. Intenta de nu evo.\n"; cin>>MatrizAdyacencia[i][j]; } } } cout<<"\nColoca el numero del vertice inicial, comenzando desde 0. 0 = a, 1 = b ...\n"; cin>>VerticeInicial; while((VerticeInicial<0) && (VerticeInicial>NumeroDeVertices-1)) { cout<<"\nEl vertice inicial debe de encontrarse entre 0 y "<<NumeroDeVer tices-1<<endl; cout<<"\nIntenta de nuevo\n"; cin>>VerticeInicial; } } void camino::ValoresIniciales() { for(int i=0;i<NumeroDeVertices;i++) { Etiqueta[i] = false; VerticeAnterior[i] = -1; Distancia[i] = UnMonton; } Distancia[VerticeInicial]= 0; } int camino::ProximoVertice() { int DistanciaMinima = UnMonton; int VerticeSinEtiqueta; for(int i=0;i<NumeroDeVertices;i++) { if((!Etiqueta[i]) && ( DistanciaMinima >= Distancia[i])) { DistanciaMinima = Distancia[i]; VerticeSinEtiqueta = i; } } return VerticeSinEtiqueta; } void camino::CalcularPeso() { ValoresIniciales(); int DistanciaMinima = UnMonton; int VerticeSinEtiqueta; int c = 0; while(c < NumeroDeVertices) { VerticeSinEtiqueta = ProximoVertice(); Etiqueta[VerticeSinEtiqueta] = true;

for(int i=0;i<NumeroDeVertices;i++) { if((!Etiqueta[i]) && (MatrizAdyacencia[VerticeSinEtiqueta][i]>0) ) { if(Distancia[i] > Distancia[VerticeSinEtiqueta]+MatrizAdyacencia [VerticeSinEtiqueta][i]) { Distancia[i] = Distancia[VerticeSinEtiqueta]+MatrizAdyacenci a[VerticeSinEtiqueta][i]; VerticeAnterior[i] = VerticeSinEtiqueta; } } } c++; } } void camino::MostrarCaminoMasCorto(int VerticeActual) { if(VerticeActual == VerticeInicial) cout<<(char)(VerticeActual + 97)<<".."; else { MostrarCaminoMasCorto(VerticeAnterior[VerticeActual]); cout<<(char) (VerticeActual + 97)<<".."; } } void camino::MostrarResultado() { for(int i=0;i<NumeroDeVertices;i++) { if(i == VerticeInicial) cout<<(char)(VerticeInicial + 97)<<".."<<VerticeInicial; else MostrarCaminoMasCorto(i); cout<<" , Peso Total = "<<Distancia[i]<<endl; } }