Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
};
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){
}
}
//
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");
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;