Sei sulla pagina 1di 11

#include<iostream>

#include<queue>//para uso de cola


#include<list>//para uso de lista
#include<stack>//para uso de pila
using namespace std;
class vertice;
class arista{
public:
arista *sig;
vertice *ady;
int peso;
friend class grafo;

};
class vertice{
public:
vertice *sig;
arista *ady;
string nombre;
friend class grafo;
};
class grafo{
vertice *h;
public:
void inicializa();
bool vacio();
int tamanio();
vertice *Getvertice(string nombre);//retornar direccion del vertice
deseado
void insertar_arista(vertice *origen,vertice *destino,int peso);
void insertar_vertice(string nombre);
void lista_adyacencia();
void anular();
void eliminar_arista(vertice *origen,vertice *destino);
void eliminar_vertice(vertice *vert);//
void recorrido_anchura(vertice *origen);
void recorrido_profundidad(vertice *origen);
};
void grafo::inicializa(){
h=NULL;

}
bool grafo::vacio(){

if(h==NULL)
return true;
else
return false;
}
int grafo::tamanio(){
int cont=0;
vertice *aux;
while(aux!=NULL)
{
cont++;
aux=aux->sig;
}
return cont;
}
vertice *grafo::Getvertice(string nombre){

vertice *aux;
aux=h;
while(aux!=NULL)
{
if(aux->nombre==nombre)
{
return aux;
}
aux=aux->sig;
}
return NULL;
}
void grafo::insertar_vertice(string nombre){

vertice *nuevo=new vertice;


nuevo->nombre=nombre;
nuevo->ady=NULL;
nuevo->sig=NULL;
if(vacio())
{
h=nuevo;
}
else
{
vertice *aux;
aux=h;
while(aux->sig!=NULL)
{
aux=aux->sig;
}
aux->sig=nuevo;
}
}
void grafo::insertar_arista(vertice *origen,vertice *destino,int peso){

arista *nuevo=new arista;


nuevo->peso=peso;
nuevo->ady=NULL;
nuevo->sig=NULL;
arista *aux;
aux=origen->ady;
if(aux==NULL)
{
origen->ady=nuevo;
nuevo->ady=destino;
}
else
{
while(aux->sig!=NULL)
{
aux=aux->sig;
}
aux->sig=nuevo;
nuevo->ady=destino;
}
}
void grafo::lista_adyacencia(){
vertice *vertAux;
arista *arisAux;
vertAux=h;
while(vertAux!=NULL)
{
cout<<vertAux->sig->nombre<<"-->";
arisAux=arisAux->sig;
}
vertAux=vertAux->sig;
cout<<endl;
}
void grafo::anular(){
vertice *aux;
while(h!=NULL)
{
aux=h;
h=h->sig;
delete(aux);
}
}
void grafo::eliminar_arista(vertice *origen,vertice *destino){
int aux=0;
arista *actual,*anterior;
actual=origen->ady;
if(actual==NULL)
{
cout<<"El vertice origen no tiene aristas"<<endl;
}
else if(actual->ady==destino)
{
origen->ady=actual->sig;
delete(actual);
}
else
{
while(actual->ady!=NULL)
{
if(actual->ady==destino)
{
aux=1;
anterior->sig=actual->sig;
delete(actual);
break;
}
anterior=actual;
actual=actual->sig;
}
if(aux==0)
{
cout<<"Esos dos vertices no estan conectados"<<endl;
}

}
}
//
void grafo::eliminar_vertice(vertice *vert){
vertice *actual,*anterior;
arista *aux;
actual=h;
while(actual!=NULL)
{
if(aux->ady==vert)
{
eliminar_arista(actual,aux->ady);
break;
}
aux=aux->sig;
}
actual=h;
if(h==vert)
{
h=h->sig;
delete(actual);
}
else
{
while(actual!=vert)
{
anterior=actual;
actual=actual->sig;
}
anterior->sig=actual->sig;
delete(actual);
}
}
void grafo::recorrido_anchura(vertice *origen){
int aux,aux2;
vertice *actual;
queue<vertice*> cola;
list<vertice*> lista;
list<vertice*>::iterator i;
cola.push(origen);
while(!cola.empty())//boleano si esta vacio
{
aux=0;
actual=cola.front();//frente de la cola
for(i=lista.begin();i!=lista.end();i++)
{
if(*i==actual)
aux=1;
}
if(aux==1)
{
cout<<actual->nombre<<", ";
lista.push_back(actual);
arista *aux;
aux=actual->ady;
while(aux!=NULL)
{
aux2=0;
for(i=lista.begin();i!=lista.end();i++)
{
if(aux->ady==*i)
{
aux2=1;
}
}
if(aux2==0)
{
cola.push(aux->ady);
}
aux=aux->sig;
}
}
}
}
void grafo::recorrido_profundidad(vertice *origen){
int aux,aux2;
vertice *actual;
stack<vertice*> pila;
list<vertice*> lista;
list<vertice*>::iterator i;
pila.push(origen);
while(!pila.empty())
{
aux=0;
actual=pila.top();
pila.pop();
for(i=lista.begin();i!=lista.end();i++)
{
if(*i==actual)
{
aux=1;
}
}
if (aux==0)
{
cout<<actual->nombre<<", ";
lista.push_back(actual);
arista *aux;
aux=actual->ady;
while(aux!=NULL)
{
aux2=0;
for(i=lista.begin();i!=lista.end();i++)
{
if(*i==aux->ady)
{
aux2=1;
}
}
if(aux2==0)
{
pila.push(aux->ady);
}
aux=aux->sig;
}
}
}

}
int main()
{
Grafo G;
G.Inicializa();
int opc;
G.InsertaVertice("TIJ");
G.InsertaVertice("MTY");
G.InsertaVertice("MZT");
G.InsertaVertice("BJX");
G.InsertaVertice("GDL");
G.InsertaVertice("SAN");
G.InsertaVertice("TAM");
G.InsertaVertice("MEX");
G.InsertaVertice("CUN");
G.InsertaVertice("MID");

G.InsertaArista(G.GetVertice("TIJ"), G.GetVertice("MTY"), 800);


G.InsertaArista(G.GetVertice("MZT"), G.GetVertice("TIJ"), 400);
G.InsertaArista(G.GetVertice("MZT"), G.GetVertice("BJX"), 300);
G.InsertaArista(G.GetVertice("MTY"), G.GetVertice("BJX"), 700);
G.InsertaArista(G.GetVertice("BJX"), G.GetVertice("SAN"), 900);
G.InsertaArista(G.GetVertice("BJX"), G.GetVertice("TAM"), 400);
G.InsertaArista(G.GetVertice("BJX"), G.GetVertice("MEX"), 350);
G.InsertaArista(G.GetVertice("GDL"), G.GetVertice("MZT"), 500);
G.InsertaArista(G.GetVertice("GDL"), G.GetVertice("MTY"), 450);
G.InsertaArista(G.GetVertice("GDL"), G.GetVertice("BJX"), 250);
G.InsertaArista(G.GetVertice("GDL"), G.GetVertice("MEX"), 500);
G.InsertaArista(G.GetVertice("SAN"), G.GetVertice("MID"), 1200);
G.InsertaArista(G.GetVertice("TAM"), G.GetVertice("MID"), 450);
G.InsertaArista(G.GetVertice("MEX"), G.GetVertice("MID"), 450);
G.InsertaArista(G.GetVertice("MEX"), G.GetVertice("CUN"), 650);
G.InsertaArista(G.GetVertice("CUN"), G.GetVertice("GDL"), 650);

do
{
system("cls");
cout<<"1. Ingresar Vertice"<<endl;
cout<<"2. Ingresar arista"<<endl;
cout<<"3. Lista de adyacencia"<<endl;
cout<<"4. Tama�o"<<endl;
cout<<"5. Eliminar vertice"<<endl;
cout<<"6. Eliminar arista"<<endl;
cout<<"7. Anular"<<endl;
cout<<"8. Recorrido en anchura"<<endl;
cout<<"9. Recorrido en profundidad"<<endl;
cout<<"10. Primero en anchura"<<endl;
cout<<"11. Primero en profundidad"<<endl;
cout<<"12. Primero el mejor"<<endl;
cout<<"13. Salir"<<endl;
cout<<endl<<"Elija una opcion: ";
cin>>opc;
switch(opc)
{
case 1:
{
string nombre;
system("cls");
cout<<"Ingrese el nombre del vertice: ";
cin.ignore();
getline(cin, nombre, '\n');
G.InsertaVertice(nombre);
cin.get();
cin.get();
break;
}
case 2:
{
string origen, destino;
int peso;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese del nombre del vertice origen: ";
cin.ignore();
getline(cin, origen, '\n');
cout<<"Ingrese el nombre del vertice destino: ";
getline(cin, destino, '\n');
cout<<"Ingrese el peso: ";
cin>>peso;

if(G.GetVertice(origen) == NULL || G.GetVertice(destino) == NULL)


{
cout<<"Uno de los vertices no es valido"<<endl;
}
else
{
G.InsertaArista(G.GetVertice(origen), G.GetVertice(destino),
peso);
}
}
cin.get();
cin.get();
break;
}
case 3:
{
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
G.ListaAdyacencia();
}
cin.get();
cin.get();
break;
}
case 4:
{
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Tamano: "<<G.Tamano()<<endl;
}
cin.get();
cin.get();
break;
}
case 5:
{
string nombre;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice a eliminar: ";
cin.ignore();
getline(cin, nombre, '\n');
if(G.GetVertice(nombre) == NULL)
{
cout<<"Vertice invalido"<<endl;
}
else
{
G.EliminarVertice(G.GetVertice(nombre));
}
}
cin.get();
cin.get();
break;
}
case 6:
{
string origen, destino;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese del nombre del vertice origen: ";
cin.ignore();
getline(cin, origen, '\n');
cout<<"Ingrese el nombre del vertice destino: ";
getline(cin, destino, '\n');
if(G.GetVertice(origen) == NULL || G.GetVertice(destino) == NULL)
{
cout<<"Vertices no validos"<<endl;
}
else
{
G.EliminarArista(G.GetVertice(origen), G.GetVertice(destino));
}
}
cin.get();
cin.get();
break;
}
case 7:
{
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
G.Anular();
}
cin.get();
cin.get();
break;
}
case 8:
{
string nombre;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice inicial: ";
cin.ignore();
getline(cin, nombre, '\n');
if(G.GetVertice(nombre) == NULL)
{
cout<<"Ese vertice es invalido"<<endl;
}
else
{
G.RecorridoAnchura(G.GetVertice(nombre));
}
}
cin.get();
cin.get();
break;
}
case 9:
{
string nombre;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice inicial: ";
cin.ignore();
getline(cin, nombre, '\n');
if(G.GetVertice(nombre) == NULL)
{
cout<<"Ese vertice es invalido"<<endl;
}
else
{
G.RecorridoProfundidad(G.GetVertice(nombre));
}
}
cin.get();
cin.get();
break;
}
case 10:
{
string origen, destino;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice origen: ";
cin.ignore();
getline(cin, origen, '\n');
cout<<"Ingrese el nombre del vertice destino: ";
getline(cin, destino, '\n');
if(G.GetVertice(origen) == NULL || G.GetVertice(destino) == NULL)
{
cout<<"Vertices invalidos"<<endl;
}
else
{
G.PrimeroAnchura(G.GetVertice(origen), G.GetVertice(destino));
}
}
cin.get();
cin.get();
break;
}
case 11:
{
string origen, destino;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice origen: ";
cin.ignore();
getline(cin, origen, '\n');
cout<<"Ingrese el nombre del vertice destino: ";
getline(cin, destino, '\n');
if(G.GetVertice(origen) == NULL || G.GetVertice(destino) == NULL)
{
cout<<"Vertices invalidos"<<endl;
}
else
{
G.PrimeroProfundidad(G.GetVertice(origen),
G.GetVertice(destino));
}
}
cin.get();
cin.get();
break;
}
case 12:
{
string origen, destino;
system("cls");
if(G.Vacio())
{
cout<<"El grafo esta vacio"<<endl;
}
else
{
cout<<"Ingrese el nombre del vertice origen: ";
cin.ignore();
getline(cin, origen, '\n');
cout<<"Ingrese el nombre del vertice destino: ";
getline(cin, destino, '\n');
if(G.GetVertice(origen) == NULL || G.GetVertice(destino) == NULL)
{
cout<<"Vertices invalidos"<<endl;
}
else
{
G.PrimeroMejor(G.GetVertice(origen), G.GetVertice(destino));
}
}
cin.get();
cin.get();
break;
}
case 13:
{
break;
}
default:
{
cout<<"Elija una opcion valida"<<endl;
}
}
}
while(opc != 13);
return 0;
}

Potrebbero piacerti anche