2. ORIGENES
Este acertijo surge con el problema de los 7 puentes
de konigsberg(ciudad alemana del siglo XVIII situada
sobre el río Praga) que fue resuelto por el
matemático suizo Leonhard en 1736 y fue
publicado en el articulo titulado: Solutio problematis
ad geometriam situs pertinentis (Solución de un
problema relacionado con la geometría de posición).
El problema trata
sobre travesar los 7
puentes de la ciudad
que conectaban 2
islas, una sola vez
cada uno.
3. DEFINICION
Un ciclo euleriano es un Camino en un grafo que
comienza y termina en el mismo vértice, que incluye
cada arista del grafo exactamente una vez y que
puede tener vértices repetidos, es decir, un ciclo que
incluye todas las aristas y que estas no se repitan.
4. TEOREMAS
Lo que Leonhard Euler dijo fue que en un ciclo
euleriano en un grafo existe si y solo si:
1) Si el grafo es conexo y exactamente dos de sus
vértices tienen grado impar.
2) Si el grafo es conexo y todos sus vértices tienen
grado par.
5. ALGORITMO
1. Hacer un circuito dentro del Grafo.
2. Escoger un punto dentro del Grafo recorrido que
sea adyacente a los que quedan y hacer 1.
3. Reemplazar el siguiente recorrido en el vértice
que hemos cogido.
6. PSEUDOCODIGO
#define num_vertices 4000
int n, fin=0, turno=1,barrera, viajero, ver, aristas[400][400]; //aristas[][] no es mas que una
matriz de adyacencia
main(){
read datafile; //Se encuentra la información del grafo
ver= rand(0)%3;//Elegimos un vértice al "azar"
barrera=ver;
while (!fin)
switch (turno) //Turnamos las funciones de barrera y viajero
case 1:
fbarrera();
break;
case 2:
fviajero();
break;
if (detenerbarrera == true && detenerviajero==true)
print camino(); //Se terminan de turnar y muestran resultados
print pila(); //en el orden correcto
end
7. fbarrera()
if (gra(barrera)==0) //Si no tiene a donde ir, marca terminado
detenerbarrera();
fin=true;
if (gra(barrera)==1) //Si solo existe un camino posible se mueve
pila(barrera); //Almacena el trayecto en que se movió
barrera=vecino(barrera); //Aquí se mueve
eliminar(barrera, vecino(barrera)); //Se elimina ese camino //para no repetirlo
turno++;
end
fviajero()
if (gra(viajero)==0) //Si no tiene a donde ir, marca terminado
detenerviajero();
camino(viajero); //Se almacena el trayecto
viajero=vecino(viajero); //Se mueve por una arista permitida
eliminar(viajero, vecino(viajero)); //Para no repetir aristas
turno--;
end
8. vecino(int x)
int i;
for (i=0; i<=num_vertices; i++)
if (aristas[x][j]==1)//Si existe una arista que incide en x, //se regresa el vértice al que lleva
la arista
return alpha(j);
end
eliminar(int t, int k)
aristas[t][k]=null; //Al eliminar se asegura quitar la relación
aristas[k][t]=null; //en cualquier dirección
end
9. APLICACIONES
Una aplicación del ciclo euleriano puede ser en
la optimización de recorridos en mapas, por
ejemplo si nos preguntaran:
¿si existe un camino
para un viaje de
turistas de manera
que estos no
recorran
cualquiera de los
caminos mas de
una vez?
10. se puede aplicar en la determinación de flexibilidad
en problemas de decisión en grandes instituciones o
empresas, por ejemplo si se crea un modelo gráfico
que simulara las opciones por las que puede optar
una empresa con aristas y los estados finales al
llevar a cabo lo optado con vértices, se podría
conocer entonces el grado de flexibilidad en
decisiones de cada
estado dependiendo si existe un
ciclo euleriano que permite volver
al estado inicial por opciones
distintas(aristas distintas), esto
vuelve más real si permitimos la
eliminación de opciones con el
tiempo, es decir, eliminar aristas
cada cierto tiempo, sea al azar o no.