Napoleon
Alfred V. Aho (Timmins, Ontario 9 de
agosto de 1941 (73 aos) es un informtico
terico. Sus ocupaciones incluyen trabajar para
los laboratiors Bell y ser profesor de
Computacin en la Universidad de Columbia.
Objetivos de aprendizaje
PASEO EURELIANO
Leonhard Euler (1707-1737)
Un articulo publicado en 1736 por el matematico suizo Leonhard Euler
(1707-1783) marco el inicio de el estudio de la teoria de grafos. La idea
principal en que se apoya su trabajo surgio de un problema ahora muy
popular, conocido como los siete puentes de Konigsberg. A partir de
este problema Euler desarrollo algunos de los conceptos fundamentales
de la teoria de grafos.
Una aplicacin del paseo eureliano trata de un inspector que debe inspeccionar el
estado de las carreteras, para ello debe recorrer cada una de los caminos y crear un archivo con
informacin acerca de las condiciones de cada camino, la visibilidad de las lneas en los
caminos, el estado de las seales de trafico etc.
Como el inspector vive en la ciudad C1, la forma mas econmica es comenzar en C1,
recorrer todos los caminos una vez y regresar a C1.
Camino de Euler
B
A,B,C,E,D,B
A B Ciclo de Eeuler
A, C, E, B, C, D, A
C
D E
Consideremos las siguientes ciudades C1, C2, C3, C4, C5, C6, C7, C8, C9 y C10
C4 C6
C1 C5
C10 C9 C8
C2 C7
C3
A6
C5 C6
A5 A7
A2 A8 A11
C2 C4 C7 C10
A1 A4 A10 A13
C1 C3 C8 C9
A3 A9 A12
La pregunta es existe un camino desde el vrtice C1 al vrtice C1 que recorra cada arista
exactamente una vez?
Supongamos que el inspector pasa por la ciudad C3, llegando por la arista A3. Tiene que salir por
la arista A4 o A9
Supongamos que sale por A4 sabemos que debe pasar por todas las aristas; para utilizar A9
tendra que llegar a C3 nuevamente y salir por la otra arista que ya recorri A3 o A4, por lo que
estaramos ante una contradiccin. Por tanto no podemos satisfacer el ciclo eureliano.
Podemos deducir de lo anterior que para satisfacer el ciclo eureliano, las aristas que
tocan a cada vrtice debe ser un numero par.
A4
A3 A9
C3
B RIO C
D
A
Puede representarse por el grafo
B C
Modelo de grafo
El problema consiste en partir de cualquier lugar (A, B, C o D), caminos sobre cada puente
exactamente una vez y luego regresar a la posicin inicial. La solucin se reduce a hallar un
ciclo en el grafo que incluya todas las aristas y todos los vrtices. Un ciclo que incluya todos los
vrtices y todos las aristas se denomina Paseo eureliano (ciclo de Euler) en honor a Euler.
TEOREMA
Un grafo G tiene un ciclo de Euler Si y solo si G es conexo y cada vrtice tiene grado par
TEOREMA
Un grafo G conexo que tiene exactamente dos vrtices de grado impar, entonces existe un camino
de Euler en G. Cualquier camino de Euler debe comenzar en un vrtice de grado impar y terminar
en el otro.
TEOREMA
Si un grafo G tiene un nodo con grado impar, entonces no puede existir un
circuito de Euler en G
TEOREMA
Si un grafo G tiene mas de dos vrtices de grado impar, entonces no puede
existir un camino de Euler en G
COROLARIO
Si G tiene un vrtice u y no hay aristas, el camino (u) tambin se considera un ciclo
eureliano.
TEOREMA
Si G es un grafo con m aristas y vrtices (V1, V2,...Vn)
( Vi) = 2 m
la suma de los grados de todos los vrtices es par.
Vi Vj
Aij
COROLARIO
Para todo grafo G , existe un numero par de vrtices de grado impar.
Ejemplo 1
Consideremos el plano de una estructura de con tres cuartos
Habitacion A
Habitacion B Habitacion C
Afuera D
A
C
Ntese que solo desde A puede pasarse a D de tres formas, mientras que desde B o C
puede pasarse a D solo de dos formas
D, B, D, C, D, A, D, A, B, C, A
A, D, B, D, C, D, A, C, B, A, D
Algoritmo de Fleury
Sea G(V,A) un grafo conexo
Si v V grado(v) es par, entonces es posible construir un circuito de Euler sobre G
Ejemplo 2
A B
(C, D) es un puente sobre G
C
D
E F
Entrada
V : conjunto de vrtices
A : conjunto de aristas
Salida
E : secuencia de vrtices que conforma el camino de Euler
Mtodo:
1 Elegir un vrtice u V
Incluir u en E
2 Mientras A
Ejemplo 3
B F
A C E G
D H
Observamos que todos los vrtices tienen grado par, y es conexo, por tanto
podemos aplicar el algoritmo de Fleury
Ruta Arista
A (A, B)
A, B (B, C)
A, B, C (C, A)
A, B, C, A (A, D)
A, B, C, A, D (D, C)
A, B, C, A, D, C (C, E)
A, B, C, A, D, C, E (E, G)
A, B, C, A, D, C, E, G (G, F)
A, B, C, A, D, C, E, G, F (F, E)
A, B, C, A, D, C, E, G, F, E (E, H)
A, B, C, A, D, C, E, G, F, E, H (H, G)
A, B, C, A, D, C, E, G, F, E, H, G (G, A)
A, B, C, A, D, C, E, G, F, E, H, G, A
12
B F
1 2 9 8
3
A C E G
6 7
4 5 10 11
D H
Ejemplo 4
Todos los vrtices tienen grado par, Por tanto existe camino de Euler y circuito
de Euler
A
Todos los vrtices excepto
Los puntos A y B tienen
grado par, por tanto existe
camino de Euler con inicio y fin
A y B respectivamente
Ejemplo 5
Mediante el algoritmo de Fleury hallar un circuito de Euler
F
D E
A B C
Observamos que todos los vrtices tienen grado par, y es conexo, por
tanto podemos aplicar el algoritmo de Fleury
Ruta Arista
A (A, D)
A, D (D, F)
A, D, F (F, E)
A, D, F, E (E, C)
A, D, F, E, C (C, B)
A, D, F, E, C, B (B, D)
A, D, F, E, C, B, D (D, E)
A, D, F, E, C, B, D, E (E, B)
A, D, F, E, C, B, D, E, B (B, A)
A, D, F, E, C, B, D, E, B, A
2 3
7
1 6 8 4
9 5
En el grafo se enumeran las aristas para mostrar el circuito de Euler
Aplicacin
Se presenta una aplicacin que verifica si una secuencia de nodos corresponde a un camino
eureliano en un grafo. El grafo se representa mediante un vector de cabeceras a las listas de
adyacencias de cada vrtice del grafo.
Lista[i] contiene la cabecera de la lista de nodos adyacentes al vrtice i.
Por simplicidad se asume que el valor de cada vrtice es un entero, por tanto el ndice k del vector
lista, corresponde al vrtice k, y contiene la cabecera de los nodos adyacentes al vrtice k. Luego se
ingresa una secuencia que es almacenada en una lista . Se recorre la lista, verificando si
corresponde o no a un camino eureliano
Mtodo
Inicio
Ingresar Grafo G
Leer secuencia L a verificar
Si (verifica L es un camino eureliano )
Escribir " La secuencia si es un camino eureliano"
Sino
Escribir " La secuencia no es un camino eureliano "FinSi
Fin
Registro nodo
Inicio
Entero valor, flag
Registro nodo *sig
Fin
Clase Grafo
Inicio
Registro nodo *lista[MAX],
*camino
entero n
Lee_Grafo()
Entero adyacente(entero p , entero q)
Entero euleriano( )
FinClase
lista
El vector contiene un puntero a la lista de nodos adyacentes
Lista[i] contiene la cabecera de la lista de nodos adyacentes al vrtice i
La accin Crea_Lista , crea la lista de nodos adyacentes al nodo i. Retorna la cabeza de la lista creada. La
variable ultimo es utilizada para adicionar nodos a la lista. Una vez que se termina de crear una lista, la variable
ultimo dejara de utilizarse, y la funcin devolver la variable cabeza.
Cabeza
Ultimo
Metodos
CreaLista()
crea una lista de nodos de nodos adyacentes a un nodo
LeeGrafo()
crea una lista de nodos. Utiliza un vector de cabecera. Cada entrada del vector es cabecera
de los nodos adyacentes que es creado mediante CreaLista.
Eureliano() :
verifica si la secuencia es un ciclo eureliano
Accin Grafo::Lee_Grafo()
Inicio
Entero i
leer n // numero de elementos del grafo
Para i desde 1 jhasta n
lista[i] = Crea_Lista()
FinPara
Fin
La accin lee_grafo, pregunta cuantos nodos tiene el grafo, se ingresa n, y luego llama a Crea_Lista para crear
la lista de nodos adyacentes a cada vrtice del grafo. Cada vez que se llama a Crea_Lista, esta accin devuelve
la cabecera de la lista creada y lo almacena en el vector en la entrada lista[i]
Luego de ingresado la secuencia de nodos que se quiere verificar, se llama a la funcin eureliano que devolver
verdad si la secuencia es un camino eureliano y falso en caso contrario.
La funcin eureliano recorre la lista con cabeza camino, verifica los nodos dos a dos los nodos contiguos
preguntando si son adyacentes. Si la arista que conduce al nodo adyacente aun no ha sido visitada puede formar
parte del camino eureliano en otro caso no se considera.
Camino
ultimo
Accin Principal()
Inicio
Grafo G
Entero i
G.Lee_Grafo()
Escribir "Ingrese la secuencia a verificar : "
G.camino = Crea_Lista()
Si (G.euleriano () = 0 )
Escribir " La secuencia si es un camino eureliano"
Sino
Escribir " La secuencia no es un camino eureliano "
FinSi
Fin
Ejemplo 6
1 2
2 2 3
3
5
4
3 4 5 2
4
5
Adviertase que todos los nodos tienen grado dos, a excepcin de los nodos 1 y 2 que tienen grado 1
y 3 , por tanto corresponde al inicio y fin del camino de eureliano
camino
1 2 3 5 4 2
corresponde a un camino eureliano
camino
1 2 4 3 5 3
no corresponde a un camino eureliano
Ejemplo 7
Consideremos el grafo dirigido
Lista de adyacencia
1 2 2 , 5
1
2 5
5 3 3
4 1
5 3
4 3, 4
Adviertase que todos los nodos tienen grado par, a excepcin de los nodos 1 y 3
que tienen grado 3 , por tanto corresponde al inicio y fin del camino de eureliano
camino
1 2 5 4 3 1 5 3
corresponde a un camino eureliano
camino
1 2 5 4 3 1 5 2
no corresponde a un camino eureliano
Ejemplo 8 APLICACIN
Se presenta una aplicacin en C para verificar si una secuencia de nodos corresponde a un
cilo de euler.
Entrada : w secuencia de vertices
Salida : mensaje de reconocimiento si w es, o no una secuencia de euler
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#define MAX 50
struct nodo
{ int valor, flag;
struct nodo *sig;
};
class Grafo
{ public:
struct nodo *lista[MAX], *camino;
int n;
void Lee_Grafo();
int adyacente( int p, int q);
int euleriano( );
};
void Grafo::Lee_Grafo()
{ int i;
cout<<"Ingrese numero de nodos del grafo : ";
cin>>n;
for (i=1; i<=n; i++)
{ cout<<"\n\nLista de adyacencia del vrtice : "<< i;
lista[i] = Crea_Lista();
}
};
int Grafo::euleriano()
{ int i, y=0;
struct nodo *p;
p = camino;
while (psig != NULL && adyacente(pvalor, psigValor)==1)
p = psig;
for(i=1; i<=n; i++)
{ p=lista[i];
while(p!=NULL)
{ y=y+p->flag;
p=psig;
}
}
return(y);
}
void main()
{
Grafo G;
G.Lee_Grafo();
cout<<"Ingrese la secuencia a verificar :"<<endl;
G.camino = Crea_Lista();
if (G.euleriano()==0)
cout<<"La secuencia si es un camino eureliano";
else
cout<<" La secuencia no es un camino eureliano ";
}
CICLO HAMILTONIANO
William Rowan Hamilton (1805-1865)
En 1859, el matematico irlandes Sir William Rowan Hamilton (1805-1865) desarrollo un juego
que vendio a un fabricante de juguetes de Dublin. El juego era un dodecaedro regular de madera
con 20 esquinas(vrtices) en las que aparecian inscritos los nombres de ciudades importantes. El
objetivo del juego era encontrar un ciclo alrededor de las aristas del solido, de modo que cada
ciudad estuviera en el ciclo exactamente una vez. Aunque en realidad el problema fue planteado
anteriormente por Euler, no siendo dificil hallar una solucion a este problema, los matematicos
siguen estudiando las condiciones necesarias y suficientes para caracterizar los grrafos no
dirigidos que posean un ciclo hamiltoniano. Despues de muchos aos en 1930 las caracterizacion
de de los grafos planos fue resuelta por Kasimir Kuratowski (1896-1980).
Sir William Rowan Hamilton sabio irlands lanzo al mercado a mediados de siglo XIX un juego en forma
de dodecaedro. Cada esquina llevaba el nombre de una ciudad y el problema era partir de una ciudad
recorrer las aristas, visitar cada ciudad exactamente una vez y regresar a la ciudad inicial.
L a solucin es hallar un ciclo en el grafo que contenga a cada vrtice exactamente una vez excepto el
vrtice inicial y final que aparecen dos veces .
Definicin.- Un ciclo hamiltoniano (ciclo H ) es aquel ciclo en un grafo que contiene cada vrtice en C
exactamente una vez excepto el primero y el ultimo que aparecen dos veces.
Supongamos que se viaja en avin y no existe problema de enlaces de vuelos. Los arcos
representan los vuelos existentes entre las distintas ciudades. Los valores de los arcos son
unidades de tiempo (el tiempo que se tarda en viajar de una ciudad a otra). La aplicacin calcula
todas las soluciones desde cualquier nodo de partida del grafo. Para simplificarlo, el nodo de
partida ser el nodo A.
Se tratara de encontrar un circuito
hamiltoniano que partiendo del
nodo A recorra exactamente una
vez el resto de nodos del grafo
terminando otra vez en el nodo
A con un tiempo total de
recorrido mnimo.
La aplicacin nos muestra dos
soluciones, con los arcos de color
rojo, de las cuales
seleccionara la segunda por tener
un menor tiempo total
costo total :46
Costo total : 36
Ejemplo 9
a b
c d e
f g
Ejemplo 10
b c d
Ejemplo 11
a b
d e
el nico ciclo hamiltoniano es (a, b, c, d, e)
Aplicacin
Se presenta una aplicacin que verifica si una secuencia de nodos corresponde a un camino
hamiltoniano en un grafo.
El grafo se representa mediante un vector de cabeceras a las listas de adyacencias de cada
vrtice del grafo.
Lista[i] contiene la cabecera de la lista de nodos adyacentes al vrtice i.
Por simplicidad se asume que el valor de cada vrtice es un entero, por tanto el ndice k del vector lista,
corresponde al vrtice k, y contiene la cabecera de los nodos adyacentes al vrtice k.
Luego se ingresa una secuencia que es almacenada en una lista . Se recorre la lista,
verificando si corresponde o no a un camino hamiltoniano
Mtodo
Inicio
Ingresar Grafo G
Leer secuencia L a verificar
Si (verifica L es un camino hamiltoniano )
Escribir " La secuencia si es un camino hamiltoniano"
Sino
Escribir " La secuencia no es un camino hamiltoniano "
FinSi
Fin
Registro nodo
Inicio
Entero valor, flag
Registro nodo *sig
Fin
Clase Grafo
Inicio
Registro nodo *lista[MAX],
*camino
entero n
Lee_Grafo()
Entero adyacente(entero p , entero q)
Entero hamiltoniano( )
FinClase
lista
El vector contiene un puntero a la lista de nodos adyacentes
Lista[i] contiene la cabecera de la lista de nodos adyacentes al vrtice i
La accin Crea_Lista , crea la lista de nodos adyacentes al nodo i. Retorna la cabeza de la lista creada. La
variable ultimo es utilizada para adicionar nodos a la lista. Una vez que se termina de crear una lista, la
variable ultimo dejara de utilizarse, y la funcin devolver la variable cabeza.
Cabeza
ultimo
Accin Grafo::Lee_Grafo()
Inicio
Entero i
leer n // numero de elementos del grafo
Para i desde 1 jhasta n
lista[i] = Crea_Lista()
FinPara
Fin
La accin lee_grafo, pregunta cuantos nodos tiene el grafo, se ingresa n, y luego llama a
Crea_Lista para crear la lista de nodos adyacentes a cada vrtice del grafo. Cada vez que se llama
a Crea_Lista, esta accin devuelve la cabecera de la lista creada y lo almacena en el vector en la
entrada lista[i]
Camino
ultimo
Ejemplo 12
Consideremos el grafo dirigido
Lista de adyacencia
1 2 2,4
1
2 4,5
3 4 5 3 1
4 3,5
5 6
6 6 3
camino
1 2 4 5 6 3
corresponde a un camino hamiltoniano
camino
1 2 4 3 5 6
no corresponde a un camino
hamiltoniano
Ejemplo 13
1 2 1 2, 4
2 1
3 1, 2
3 4 3, 5
5 2, 3
4 5
camino
5 3 2 1 4
corresponde a un camino hamiltoniano
camino
5 2 1 4 3
corresponde a un camino hamiltoniano
Ejemplo 14
APLICACIN
Se presenta una aplicacin para verificar si una secuencia de nodos corresponde a un ciclo
de hamilton.
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#define MAX 50
struct nodo
{ int valor, flag;
struct nodo *sig;
};
class Grafo
{ public:
struct nodo *lista[MAX], *camino;
int n;
void Lee_Grafo();
int adyacente( int p, int q);
int hamiltoniano( );
};
void Grafo::Lee_Grafo()
{ int i;
cout<<"Ingrese numero de nodos del grafo : ";
cin>>n;
for (i=1; i<=n; i++)
{ cout<<"\n\nLista de adyacencia del vrtice : "<< i;
lista[i] = Crea_Lista();
}
};
int Grafo::hamiltoniano()
{ int visita[MAX], i, sw;
struct nodo *p;
for (i=1; i<=n; i++)
visita[i] = 0;
p = camino;
visita[p->valor] = 1;
while (p->sig != NULL && visita[p->sig->valor]==0
&& adyacente(p->valor, p->sig->valor)==1)
{
visita[p->sig->valor] = 1;
p = p->sig;
}
sw = 1;
i=1;
while(i<=n && sw==1)
{ sw = visita[i];
i++;
}
return(sw);
}
void main()
{
Grafo G;
system("cls");
G.Lee_Grafo();
cout<<"Ingrese la secuencia a verificar :"<<endl;
G.camino = Crea_Lista();
if (G.hamiltoniano()==1)
cout<<"La secuencia si es un camino hamiltoniano";
else
cout<<" La secuencia no es un camino hamiltoniano ";
}
Ejemplo 15
En la figura se muestra la superficie de un disco de rotacion dividido en ocho sectores de igual area. En la
parte (b) de la figura hemos colocado material conductor (sector sombreado y el circulo interno) y no
conductor(sector sin sombrear) en el disco. Cuando las tres terminales hacen contacto con los tres
sectores dados, el material no conductor no produce flujo de corriente y aparece un 1 en la pantalla de un
dispositivo digital. Para los sectores con material conductor, se produce un flujo de corriente y aparece un
0 en la pantalla. Si el disco se rotara 45grados(en el sentido de las manecillas del reloj), en la pantalla se
leria 110(de arriba abajo). Asi podemos obtener al menos dos (por ejemplo 100 y 110) de las ocho
representaciones binarias de 000(0) hasta 111(7)
Fig. a Fig. b
1
Para los sectores con material conductor, se produce un flujo de corriente y aparece un 0 en la pantalla. Si el
disco se rotara 45 grados (en el sentido de las agujas del reloj), en la pantalla se leera 110 (de arriba abajo) .
As podemos obtener al menos dos de las ocho representaciones binarias de 000 (para 0) a 111 (para 7) . Se
puede representar los ocho nmeros binarios al rotar el disco. Para resolver este problema representaremos
un grafo dirigido G(V,A) en donde V ={00,01,10,11}, A se construye de la siguiente manera
00
01 10
11
La solucin al problema es una versin del circuito eureliano dirigido, el cual esta dado por
:
100 000 001 010 101 011 111
10 00 00 01 10 01 11 11
110
Ejemplo 16
En unas fabrica se producen placas de metal en los que se sujetan componentes mediante tornillo.
Durante el proceso de produccin se realizaran muchos agujeros en las placas. Los componentes se
pueden atornillar entonces en estos agujeros a las hojas de metal. Los agujeros se pueden realizar
mediante el control de computadora. Para ahorrar tiempo y dinero, el taladro debe moverse lo ms
rpido posible. El proceso de produccin puede realizarse mediante un grafo.
10
9 b
a 5 4
4 c 8
3 2
d 4 e
11
Los vrtices del grafo corresponden a los agujeros . Cada par de vrtices se une mediante un a arista. En
cada arista escribimos el tiempo necesario para mover el taladro entre agujeros correspondientes.
Supongamos que el taladro comienza con el agujero en el vrtice a, y debe terminar en el agujero en el
vrtice e. Se trata de hallar el camino de longitud mnima desde el vrtice a hasta el vrtice e. Vemos
que el camino que visita los vrtices a,d,c,b,e en ese orden tiene longitud mnima. Si el proceso
comienza y termina en otro par de vrtices podra producir un camino ms corto.
Camino Longitud
a, b, c, d, e 20
a, b, d, c, e 24
a, c, b, d, e 23
a, c, d, b, e 25
a, d, b, c, e 20
a, d, c, b, e 19
La solucin a este problema es una versin del problema del agente viajero analizado
anteriormente.
Ejercicios propuestos
1) Implemente en Java la aplicacin del ejemplo 8
2) Implemente en Java la aplicacin del ejemplo 14
3) Tomando como modelo el ejemplo 16 , modele el grafo respectivo y describa los
diferentes caminos Cual es el mas corto?
REFERENCIAS BIBLIOGRAFICAS
1. [AHO 1988] Aho A.,Hopcroft J.,Ullman J. Estructuras de Datos y Algoritmos; Addison-Wesley1988,
Wilmington-Delaware EUA.
2. [HERNANDEZ 2001] Hernandez, R.; Lazaro, J.C.; Dormido, R.; Ros, S. Estructura de Datos y
Algoritmos; Prentice Hall 2001, Madrid Espaa.
3. [BRASSARD 1998] Brassard,G. Bratley,P. Fundamentos de Algoritmia, Prentice Hall 1998 Madrid
4. [CAIRO 2006] Osvaldo Cairo. Estructura de datos, Mc Graw Hill Mexico 2006.
5. [CORTEZ 2002] Cortez Vasquez, Augusto. Estructura de datos y Algoritmos, estructuras lineales,
URP Lima 2002.
6. [CORONA 2011] Maria Corona. Diseo de Algorimos, Edit Mc Mc Graw Hill Mexico 2011
7. [CORTEZ 2012] Cortez Vasquez, Augusto. Algoritmica, CEPREDIM Lima 2012
8. [CORTEZ 2011] Cortez Vasquez, Augusto. Matematicas Discretas, Edit San Marcos Lima 2011.
9. [CORTEZ 2002] Cortez Vasquez, Augusto. Estructura de datos y Algoritmos, estructuras no
lineales, URP Lima 2002.
10. [GRASSMANN 1996] Grasssmann W. ,Tremblay J. Matematica Discreta y Logica; Prentice Hall
1996.
11. [JOYANES 1999] Joyanes Aguilar Luis Estructura de datos, Algoritmos, abstraccion y objetos; Mc
Graw Hill 1999,.
12. [LIPSCHUTZ 1987] Lipschutz Seymour Estructura de datos, Mc Graw-Hill,1987
13. [LOPEZ 2009] Gustavo Lopez Analisis y Diseo de Algoritmos, AlfaOmega,B.Aires 2009
14. [PEA 1998] Pea Mori Ricardo Diseo de programas- Formalismo y Abstraccin, Prentice Hall
1998
15. [CARMONA 1999] Carmona, Poyato Angel y Otros Estructuta de Datos, Caja Sur Universidad de
Cordova Espaa 1999
16. [SEDGEWICK 1993] Stroustrup Bjarne El C++ Lenguaje de programacion; Addison-Wesley 1993 ,
Wilmington-Delaware EUA.
17. [WEISS 2000] Weiss, Mark Allen. Estructuras de datos en JAVA; Addison-Wesley, 2000 .