Un archivo fuente en C++ que demuestra el uso de un grafo. Viene con una imágen que indica como están conectados los nodos

C++:
-
#include <iostream.h>
-
#include <stdlib.h>
-
#include <set>
-
#include <string>
-
#include <stack>
-
#include <list>
-
/* Esta clase contiene un nodo y su lista de adyacencia
-
* que contiene los nodos que estan a su alrededor
-
*/
-
class Vertice
-
{
-
public:
-
string nombre;
-
set <Vertice*> arcos;
-
-
Vertice(){}
-
Vertice(string const &inicio) : nombre(inicio) {}
-
-
void nuevoArco(Vertice &v){ arcos.insert(&v); }
-
};
-
-
set<Vertice*> alcanzable(Vertice&);
-
int totalArcos(Vertice*, int);
-
-
int main()
-
{
-
//inicializacion de los vertices
-
Vertice* grafoSinPeso = new Vertice[8];
-
grafoSinPeso[0] = Vertice("Mexico");
-
grafoSinPeso[1] = Vertice("Puebla");
-
grafoSinPeso[2] = Vertice("Cuernavaca");
-
grafoSinPeso[3] = Vertice("Toluca");
-
grafoSinPeso[4] = Vertice("Chiapas");
-
grafoSinPeso[5] = Vertice("Chihuahua");
-
grafoSinPeso[6] = Vertice("San Luis");
-
grafoSinPeso[7] = Vertice("Pachuca");
-
-
//añadimos sus uniones entre si
-
-
grafoSinPeso[0].nuevoArco(grafoSinPeso[2]); grafoSinPeso[0].nuevoArco(grafoSinPeso[3]);
-
grafoSinPeso[1].nuevoArco(grafoSinPeso[0]);
-
grafoSinPeso[2].nuevoArco(grafoSinPeso[1]);
-
grafoSinPeso[3].nuevoArco(grafoSinPeso[2]); grafoSinPeso[3].nuevoArco(grafoSinPeso[4]); grafoSinPeso[3].nuevoArco(grafoSinPeso[5]);
-
grafoSinPeso[4].nuevoArco(grafoSinPeso[2]); grafoSinPeso[4].nuevoArco(grafoSinPeso[5]);
-
grafoSinPeso[5].nuevoArco(grafoSinPeso[6]);
-
// grafoSinPeso[6].nuevoArco(grafoSinPeso[3]); // no hay de Sn luis a Toluca
-
grafoSinPeso[7].nuevoArco(grafoSinPeso[5]);
-
-
// mostramos todos las uniones
-
-
for(int i = 0; i <8; i++)
-
{
-
set<Vertice*> resultado;
-
resultado = alcanzable(grafoSinPeso[i]);//, resultado);
-
-
cout <<"las ciudades que se pueden alcanzar desde " <<grafoSinPeso[i].nombre <<" son:" <<endl;
-
-
set<Vertice*> :: iterator itr;
-
for(itr = resultado.begin(); itr != resultado.end(); ++itr)
-
// for(itr = grafoSinPeso[i].arcos.begin(); itr != grafoSinPeso[i].arcos.end(); itr++)
-
cout << (*itr)->nombre <<" " <<endl;
-
}
-
cout <<"El numero total de arcos es: " <<totalArcos(grafoSinPeso, 8) <<endl;
-
system("PAUSE");
-
return 0;
-
}
-
-
/* Este metodo nos regresa un conjunto de vertices a los que se puede llegar desde el nodo de parametro
-
* es decir, todos los nodos para los cuales existe un camino, que no esten aislados.
-
*/
-
-
set<Vertice*> alcanzable(Vertice &inicio)
-
{
-
//al principio, asumimos ningun nodo se puede alcanzar
-
-
//creamos una pila de los nodos que faltan de visitar
-
//comenzamos con el primer nodo que es el parametro
-
set<Vertice*> resultado;
-
stack <Vertice *> verticesPendientes;
-
verticesPendientes.push(&inicio);
-
-
//sacamos los vertices uno a uno
-
-
while(!verticesPendientes.empty())
-
{
-
Vertice *ptr = verticesPendientes.top();
-
verticesPendientes.pop();
-
//si no lo habiamos visitado, lo marcamos
-
if(resultado.count(ptr) == 0)
-
{
-
resultado.insert(ptr);
-
-
//añadimos ahora las ciudades a las que se pueden llegar desde el punto en donde
-
// estamos
-
-
set<Vertice*>::iterator inicio = ptr->arcos.begin();
-
set<Vertice*>::iterator fin = ptr->arcos.end();
-
-
for(; inicio != fin; inicio++)
-
verticesPendientes.push(*inicio);
-
}
-
-
}//while
-
-
return resultado;
-
}//alcanzable
-
-
/* Contamos todos los arcos que existen entre los nodos
-
*/
-
-
int totalArcos(Vertice* raiz, int lon)
-
{
-
int total = 0;
-
for(int i = 0; i <lon; i++)
-
{
-
Vertice *ptr = &(raiz[i]);
-
set<Vertice*>::iterator inicio = ptr->arcos.begin();
-
set<Vertice*>::iterator fin = ptr->arcos.end();
-
-
for(; inicio != fin; inicio++)
-
total++;
-
}//for
-
return total;
-
}
Popularidad: 7%

