Anda di halaman 1dari 27

Estructuras de datos II 2017-I

GUIA VIII Hamilton y Euler


Un hombre superior es impasible; le alaban, le
censuran: sigue imperterrito su camino

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.

Se hizo famoso por su creacin, el lenguaje de


programacin AWK (la A viene de Aho), obra
que realiz en conjunto con Brian
Kernighan y Peter J. Weinberger, adems de su
coautora de "Compiladores: Principios,
Tcnicas y Herramientas" ("El libro del
dragn") con Ravi Sethi y Jeffrey Ullman. El
Doctor Aho ha recibido varios prestigiosos
premios, y ha sido premiado por el doctorado
de la Universidad de Waterloo y la Universidad
de Helsinki en Finlandia.

Objetivos de aprendizaje

1 Describir y explicar el concepto de Circuito de Euler


2 Describir y explicar el concepto de ciclo Hamiltoniano

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.

Problema del paseo eureliano


Leonhard Euler escribi en 1736 el primer articulo sobre teora de grafos. Este articulo incluye
una solucin al problema de los puentes de Knigsberg.
Una trayectoria o camino en un grafo G es un camino de Euler si incluye a cada una de sus
aristas solo una vez , puede ser necesario o no que se comience y termine en el mismo vrtice.
Un circuito o ciclo de Euler es un camino de Euler que es a la vez un circuito, es decir inicia y
termina en el mismo vrtice. Un ejemplo sencillo de esto es el problema comn de trazar una
figura geomtrica sin levantar el lpiz del papel.

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

Augusto Cortez Vsquez Pag: 1


Estructuras de datos II 2017-I

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

C D No es posible hallar un circuito de


Euler

A B Ciclo de Eeuler

A, C, E, B, C, D, A
C

D E

Augusto Cortez Vsquez Pag: 2


Estructuras de datos II 2017-I

Augusto Cortez Vsquez Pag: 3


Estructuras de datos II 2017-I

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

grafo puede representarse de las siguiente forma

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.

Augusto Cortez Vsquez Pag: 4


Estructuras de datos II 2017-I

A4

A3 A9
C3

Problema de los puentes de knigsberg.

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.

Augusto Cortez Vsquez Pag: 5


Estructuras de datos II 2017-I

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

Toda arista A(i,j) contribuye en uno al grado de Vi y en uno al grado


de Vj . Al sumar los grados de todos los vrtices contamos cada arista A ( i , j) y
la arista A ( j , i )

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

Es posible comenzar en algun cuarto o en el exterior, y hacer un recorrido de manera que


se pase por cada cuarto solo una vez.

El problema puede enunciarse si existe o no un camino de Euler para la grafica:

Augusto Cortez Vsquez Pag: 6


Estructuras de datos II 2017-I

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

Como existen dos vrtices A y D de grado impar, 5 y 7 respectivamente, si es posible


encontrar un camino de Euler comenzando en uno de ellos y terminando en el otro.

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

El algoritmo de Fleury intenta construir un circuito de Euler. Para ello se apoya en la


siguiente definicin

Un arco(u, v) es un puente sobre un grafo G si al aliminar (u, v) de A , G se hace


disconexa

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

Augusto Cortez Vsquez Pag: 7


Estructuras de datos II 2017-I

Buscar vrtice v adyacente a u (u, v) A


Si v es nico
Eliminar (u, v) de A
Sino /* no es nico */
Elegir v tal que (u, v) no es puente
FinSi
Incluir v en E
FinMientras

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

En el grafo se enumeran las aristas para mostrar el circuito de Euler

Augusto Cortez Vsquez Pag: 8


Estructuras de datos II 2017-I

Ejemplo 4

Todos los vrtices tienen


grado par, por tanto existe
circuito de Euler

Todos los vrtices excepto


los puntos A y B tienen B A
grado par, por tanto existe
camino de Euler con inicio y fin
A y B respectivamente

No existe circuito de Euler

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

No existe circuito de Euler

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

Augusto Cortez Vsquez Pag: 9


Estructuras de datos II 2017-I

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

Augusto Cortez Vsquez Pag: 10


Estructuras de datos II 2017-I

Se define la clase grafo que contiene un vector lista

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

Augusto Cortez Vsquez Pag: 11


Estructuras de datos II 2017-I

Registro nodo *Crea_Lista()


Inicio
Registro nodo *cabeza,*ultimo,*p
Entero val, i, m
cabeza = Nulo
ultimo = Nulo
leer m // numero de elementos de la lista
para i desde 1 hasta m
leer val
p= nuevo nodo
p->valor = val
p->flag = 1
p->sig = Nulo
Si ( cabeza = Nulo)
cabeza = p
Sino
ultimo->sig = p
ultimo = p
FinPara
Retornar cabeza
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]

Funcin Grafo::adyacente( entero u, entero v) : Tipo Booleano


Inicio
Registro nodo *z
z = lista[u]
Mientras (z Nulo z->valor v)
z = z->sig
Si (z Nulo )
Si (z->valor= v z->flag =0)
z=Nulo
FinSi
FinSi
FinMientras
Si (z = Nulo)
Retornar falso
Sino
z->flag = 0
Retornar Verdad
FinSi
Fin

La accin adyacente(u,v), verifica si los vrtices u y v son adyacentes

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.

Augusto Cortez Vsquez Pag: 12


Estructuras de datos II 2017-I

Camino
ultimo

Funcin Grafo::euleriano() tipo : entero


Inicio
y=0
Registro nodo *p
p = camino
Mientras (p->sig Nulo adyacente(p->valor, p->sig->valor)=verdad)
p = p->sig
FinMientras
Para i desde 1 hasta n
P = lista[i]
Mientras ( p Nulo)
y = y + p->flag
p = p->sig
FinMientras
FinPara
Retornar y
Fin

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

Consideremos el grafo dirigido


Lista de adyacencia
1

1 2

2 2 3
3
5
4
3 4 5 2

4
5

Augusto Cortez Vsquez Pag: 13


Estructuras de datos II 2017-I

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

Augusto Cortez Vsquez Pag: 14


Estructuras de datos II 2017-I

#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( );

};

struct nodo *Crea_Lista()


{ struct nodo *cabeza,*ultimo,*p;
int val, i, m;
cabeza = NULL;
ultimo = NULL;
cout<<"\n\n\t Numero de Elementos: ";
cin>>m;
for (i=1; i <= m; i++)
{ cout<<" Elemento "<<i<<" :";
cin>>val;
p=new nodo;
p->valor = val;
p->flag = 1;
p->sig = NULL;
if (cabeza==NULL)
cabeza = p;
else
ultimo->sig = p;
ultimo = p;
}
return(cabeza);
}

Augusto Cortez Vsquez Pag: 15


Estructuras de datos II 2017-I

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::adyacente(int u, int v)


{ struct nodo *z;
z = lista[u];
while (z!=NULL && zvalor != v)
{ z = z->sig;
if (z!=NULL)
{ if (zvalor==v && zflag==0)
z=NULL;
}
}
if (z == NULL)
return(0);
else
zflag = 0;
return(1);
};

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 ";
}

Augusto Cortez Vsquez Pag: 16


Estructuras de datos II 2017-I

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

Augusto Cortez Vsquez Pag: 17


Estructuras de datos II 2017-I

Ejemplo 9
a b

c d e

f g

El ciclo (a, b, e, d, g, c, f, a) es un ciclo de Hamilton, sin embargo no existe el paseo eureliano ya


que existen vrtices con grado impar, por ejemplo el vrtice c.

Ejemplo 10

b c d

e No existe ciclo hamiltoniano

Ejemplo 11
a b

d e
el nico ciclo hamiltoniano es (a, b, c, d, e)

Augusto Cortez Vsquez Pag: 18


Estructuras de datos II 2017-I

PROBLEMA DEL AGENTE VIAJERO

Consiste en hallar un ciclo hamiltoniano en un grafo.


Dado G un grafo con pesos. El problema es determinar un ciclo hamiltoniano H de longitud mnima en G. Si
pensamos en los vrtices de un grafo con pesos y los pesos en las aristas son las distancias, entonces el
problema del agente viajero consiste en determinar una ruta mas corta mediante la cual el agente puede visitar
cada ciudad una vez partiendo de y regresando a la misma ciudad.

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

Augusto Cortez Vsquez Pag: 19


Estructuras de datos II 2017-I

Se define la clase grafo que contiene un vector lista

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

Registro nodo *Crea_Lista()


Inicio
Registro nodo *cabeza,*ultimo,*p
Entero val, i, m
cabeza = Nulo
ultimo = Nulo
leer m // numero de elementos de la lista
para i desde 1 hasta m
leer val
p= nuevo nodo
p->valor = val
p->flag = 1
p->sig = Nulo
Si ( cabeza = Nulo)
cabeza = p
Sino
ultimo->sig = p
FinSi
ultimo = p
FinPara
Retornar cabeza
Fin

Augusto Cortez Vsquez Pag: 20


Estructuras de datos II 2017-I

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]

Funcin Grafo::adyacente( entero u, entero v) : Tipo Booleano


Inicio
Registro nodo *z
z = lista[u]
Mientras (z Nulo z->valor v)
z = z->sig
FinMientras
Si (z = Nulo)
Retornar falso
Sino
Retornar verdad
Fin

La accin adyacente(u,v), verifica si los vrtices u y v son adyacentes

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 hamiltoniano y falso en caso
contrario.
La funcin hamiltoniano recorre la lista con cabeza camino, verifica los nodos dos a dos
los nodos contiguos preguntando si son adyacentes. Si el nodo adyacente aun no ha sido
visitado puede formar parte del camino hamiltoniano en otro caso no se considera.

Camino
ultimo

Funcin Grafo::hamiltoniano() tipo : entero


Inicio
int visita [MAX], i, sw
registro nodo *p
Para i desde 1 hasta n
visita[i] = 0
FinPara
p = camino
visita[ p->valor ] = 1
Mientas (p->sig NULL visita[p->sig->valor] = 0
adyacente(p->valor, p->sig->valor) =1)
visita[p->sig->valor] = 1
p = p->sig
FinMientras
sw = 1
i=1
Mientras ( i <=n sw=1)
sw = visita[i]
i=i+1
FinMientras
retornar (sw)
Fin

Augusto Cortez Vsquez Pag: 21


Estructuras de datos II 2017-I

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

Consideremos el grafo dirigido

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

Augusto Cortez Vsquez Pag: 22


Estructuras de datos II 2017-I

Ejemplo 14
APLICACIN
Se presenta una aplicacin para verificar si una secuencia de nodos corresponde a un ciclo
de hamilton.

Entrada : w secuencia de vertices


Salida : mensaje de reconocimiento si w es, o no una secuencia 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( );

};

struct nodo *Crea_Lista()


{ struct nodo *cabeza,*ultimo,*p;
int val, i, m;
cabeza = NULL;
ultimo = NULL;
cout<<"\n\n\t Numero de Elementos: ";
cin>>m;
for (i=1; i <= m; i++)
{ cout<<" Elemento "<<i<<" :";
cin>>val;
p=new nodo;
p->valor = val;
p->flag = 1;
p->sig = NULL;
if (cabeza==NULL)
cabeza = p;
else
ultimo->sig = p;
ultimo = p;
}
return(cabeza);
}

Augusto Cortez Vsquez Pag: 23


Estructuras de datos II 2017-I

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::adyacente(int u, int v)


{ struct nodo *z;
z = lista[u];
while (z!=NULL && z->valor != v)
z = z->sig;
if (z == NULL)
return(0);
else
return(1);
}

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 ";
}

Augusto Cortez Vsquez Pag: 24


Estructuras de datos II 2017-I

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

Si b1b2 , b2 b3 V, entonces se traza la arista (b1b2 , b2 b3)


Podemos construir el grafo

00

01 10

11

Augusto Cortez Vsquez Pag: 25


Estructuras de datos II 2017-I

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

Augusto Cortez Vsquez Pag: 26


Estructuras de datos II 2017-I

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 .

Augusto Cortez Vsquez Pag: 27

Anda mungkin juga menyukai