Вы находитесь на странице: 1из 7

#include <stdio.

h>
#include <cstring>
#include <iostream>
#include <windows.h>
#include <queue>
#include <stack>
#include <list>
#include <windows.h>

using namespace std;

void setColor(int i);

HANDLE hCon;

void setColor(int i){


if(hCon == NULL)
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, i);
}

class Arista;

class Vertice{
public:
Vertice();
Vertice *sig;
Arista *ady;
string nombre;
friend class Grafo;
};

class Arista{
public:
Arista();
Arista *sig;
Vertice *ady;
int peso;
friend class Grafo;
};

class Grafo{
public:
Grafo();
Vertice *h;
Vertice *ultimo;
bool vacio();
int tamanio();
Vertice *getVertice(string nombre);
void insertarArista(Vertice *origen, Vertice *destino, int peso);
void insertarVertice(string nombre);
void listaAdyacencia();
void mostrarVuelosDeUnVertice(Vertice *origen);
void mostrarDestinosConSuPrecio(Vertice *origen);
void distanciaMasCortaEntreVertices(Vertice *origen, Vertice *destino);
};

Grafo::Grafo(){
h=NULL;
ultimo=NULL;
}

Arista::Arista(){
ady=NULL;
sig=NULL;
}

Vertice::Vertice(){
sig=NULL;
ady=NULL;
}

bool Grafo::vacio(){
if(h == NULL){
return true;
}
return false;
}

int Grafo::tamanio(){
int contador=0;
Vertice *aux;
aux=h;

while(aux != NULL){
contador++;
aux=aux->sig;
}
return contador;
}

Vertice *Grafo::getVertice(string _nombre){


Vertice *aux = h;
while(aux != NULL){
if(aux->nombre == _nombre){
return aux;
}
aux=aux->sig;
}
return NULL;
}

void Grafo::insertarVertice(string nombre){


Vertice *nuevo = new Vertice();
if(h == NULL){
h=nuevo;
nuevo->nombre=nombre;
nuevo->sig=NULL;
nuevo->ady=NULL;
ultimo=nuevo;
}else{
ultimo->sig=nuevo;
nuevo->nombre=nombre;
nuevo->ady=NULL;
nuevo->sig=NULL;
ultimo=nuevo;
}
}
void Grafo::insertarArista(Vertice *origen,Vertice *destino, int peso){
Arista *arista = new Arista();
Arista *aux= origen->ady;
arista->peso=peso;
arista->sig=NULL;
arista->ady=NULL;

if(aux == NULL){
origen->ady=arista;
arista->ady=destino;
}else{
while(aux->sig != NULL){
aux = aux->sig;
}
aux->sig=arista;
arista->ady=destino;
}
}

void Grafo::listaAdyacencia(){
Vertice *aux = h;
Arista *aux2 = NULL;

while(aux != NULL){
setColor(10);
cout<<aux->nombre;
setColor(12);
cout<<"->";
aux2 = aux->ady;
while(aux2 != NULL){
setColor(14);
cout<<aux2->ady->nombre;
setColor(12);
cout<<"->";
aux2=aux2->sig;
}
aux=aux->sig;
cout<<endl;
}
}

void Grafo::mostrarVuelosDeUnVertice(Vertice *origen){


Arista *aux = origen->ady;
setColor(10);
cout<<"\nel aeropuerto "<<origen->nombre<<" se va los aeropuertos: ";
setColor(15);
while(aux != NULL){
setColor(14);
cout<<aux->ady->nombre<<" y su valor de vuelo es de "<<aux->peso<<"-
>"<<endl;
aux=aux->sig;
}
Vertice *vertice = h;
aux = NULL;
setColor(15);
cout<<endl<<endl;
while(vertice != NULL){
aux=vertice->ady;
while(aux != NULL){
if(aux->ady->nombre == origen->nombre){
setColor(15);
cout<<"Del aeropuerto "<<vertice->nombre<<" se puede llegar
al aeropuerto "<<origen->nombre<<" y su valor es de "<<aux->peso<<endl;
}
aux=aux->sig;
}
vertice=vertice->sig;
}
}

bool comparacion(pair <Vertice*,int> a, pair <Vertice*,int>b){


return a.second < b.second;
}

void Grafo::distanciaMasCortaEntreVertices(Vertice *origen, Vertice *destino){


int costoActual=0;
bool bandera=false,bandera2=false;
Vertice *actual;
Vertice *destinoActual;
typedef pair <Vertice*,int> VerticeCosto;
typedef pair <Vertice*,Vertice*> VerticeVertice;
Arista *aux;
list <VerticeCosto> ListaCosto;
list <VerticeCosto> ListaOrdenada;
stack <VerticeVertice> pila;
ListaCosto.push_back(VerticeCosto(origen,0));
ListaOrdenada.push_back(VerticeCosto(origen,0));
list<VerticeCosto>::iterator i,j;

while(!ListaOrdenada.empty()){
actual = ListaOrdenada.front().first;
costoActual= ListaOrdenada.front().second;
ListaOrdenada.pop_front();

if(actual == destino){
setColor(15);
cout<<"costo: "<<costoActual<<endl<<endl;
bandera2=true;
destinoActual=destino;
while(!pila.empty()){
cout<<destinoActual->nombre<<"<-";
while(!pila.empty() && pila.top().second != destinoActual){
pila.pop();
}
if(!pila.empty()){
destinoActual = pila.top().first;
}
}
break;
}

aux = actual->ady;
while(aux != NULL){
bandera=false;
costoActual+=aux->peso;
for(i = ListaCosto.begin() ; i != ListaCosto.end(); i++){
if(aux->ady == i->first){
bandera=true;
if(costoActual < i->second){
i->second = costoActual;
for(j=ListaOrdenada.begin() ; j !=
ListaOrdenada.end(); j++){
if(j->first == aux->ady){
j->second=costoActual;
}
}
ListaOrdenada.sort(comparacion);
pila.push(VerticeVertice(actual,aux->ady));
costoActual-=aux->peso;
}
}
}
if(bandera==false){
ListaCosto.push_back(VerticeCosto(aux->ady,costoActual));
ListaOrdenada.push_back(VerticeCosto(aux-
>ady,costoActual));
ListaOrdenada.sort(comparacion);// se ordena
pila.push(VerticeVertice(actual,aux->ady));
costoActual-=aux->peso;
}

aux=aux->sig;
}
}
if(bandera2==false){
cout<<"\nno existe una ruta "<<endl<<endl;
}
}

void menu(){
system("cls");
Grafo *grafo = new Grafo();
int opc=-1,peso;
string nombre="";
Vertice *origen;
Vertice *destino;
do{
destino = new Vertice();
origen = new Vertice();
nombre="";
system("cls");
setColor(15);
cout<<"1 para ingresar vertice "<<endl;
cout<<"2 para conectar dos vertices "<<endl;
cout<<"3 para ver la lista de adyacencia "<<endl;
cout<<"4 para ver los vuelos de un aeropuerto y los que pueden llegar a
el"<<endl;
cout<<"5 para distancia entre dos aeropuertos "<<endl<<endl;
cout<<">> ";cin>>opc;
switch(opc){
case 1:
setColor(10);
cout<<"\ndigite nombre del vertice ";
fflush(stdin);
getline(cin,nombre);
if(grafo->getVertice(nombre) == NULL){
grafo->insertarVertice(nombre);
cout<<"\nse ingreso el vertice "<<endl<<endl;
}else{
cout<<"\nel vertice ya existe "<<endl<<endl;
}
break;
case 2:
if(grafo->vacio()==false){
setColor(10);
cout<<"\ndigite el nombre del origen: ";
fflush(stdin);
getline(cin,nombre);
origen=grafo->getVertice(nombre);
nombre="";
cout<<"\ndigite el nombre del destino: ";
fflush(stdin);
getline(cin,nombre);
destino=grafo->getVertice(nombre);
cout<<"\ndigite el peso: ";
cin>>peso;
if(destino != NULL && origen != NULL){
grafo->insertarArista(origen,destino,peso);
}else{
setColor(12);
cout<<"\nalgun vertice no existe ";
}
}
break;
case 3:
cout<<endl<<endl;
grafo->listaAdyacencia();
break;
case 4:
cout<<endl;
cout<<"\ndigite el nombre del origen: ";
fflush(stdin);
getline(cin,nombre);
origen=grafo->getVertice(nombre);
if(origen != NULL){
grafo->mostrarVuelosDeUnVertice(origen);
}else{
setColor(12);
cout<<"\nno existe el vertice ";
}
break;
case 5:
cout<<endl;
setColor(10);
cout<<"digite nombre del origen: ";
fflush(stdin);
getline(cin,nombre);
origen=grafo->getVertice(nombre);
setColor(10);
nombre="";
cout<<"digite nombre del destino: ";
fflush(stdin);
getline(cin,nombre);
destino=grafo->getVertice(nombre);
if(origen != NULL && destino != NULL){
grafo-
>distanciaMasCortaEntreVertices(origen,destino);
}else{
setColor(14);
cout<<"\nel vertice no existe";
}
break;
}
cout<<endl<<endl;
setColor(15);
system("pause");
}while(opc != 0);
}

int main(void){
menu();
}