Estructura de Datos
Estructura de Datos
CICLO : IV
ALUMNOS :
GRAFOS
Un grafo está formado por un conjunto de nodos (o vértices) y un conjunto de arcos. Cada
arco en un grafo se especifica por un par de nodos.
El conjunto de nodos es {A, B, C, D, F, G, H} y el conjunto de arcos {(A, B), (A, D), (A, C),
(C, D), (C, F), (E, G), (A, A)} para el siguiente grafo
B
arco
A D E G
C nodo
H
F
Si los pares de nodos en los arcos dirigidos, el grafo se denomina grafo directo, dirigido o
dígrafo.
TERMINOLOGÍA
*. -Al número de nodos del grafo se le llama orden del grafo.
*. -Un grafo nulo es un grafo de orden 0 (cero).
*. -Dos nodos son adyacentes si hay un arco que los une.
*. -En un grafo dirigido, si A es adyacente de B, no necesariamente B es adyacente de A
*. -Camino es una secuencia de uno o más arcos que conectan dos nodos.
*. -Un grafo se denomina conectado cuando existe siempre un camino que une dos
nodos cualesquiera y desconectado en caso contrario.
*. -Un grafo es completo cuando cada nodo está conectado con todos y cada uno de los
nodos restantes.
*. -El camino de un nodo así mismo se llama ciclo.
MATRIZ DE ADYACENCIA
B D
A C
B D
600
600
300
A C
1000
Ciclo
ARBOL GRAFO
*. -Un grafo esta etiquetado si sus arcos tiene valores asignados. Si este valor es numérico
se dice que el grafo tiene peso.
INTRODUCCIÓN
Este capítulo profundiza en otra estructura de datos no lineal: el grafo. Como hemos
hecho con otras estructuras de datos. Discutiremos la representación de los grafos en
memoria y presentaremos varias operaciones y algoritmos sobre ellos. En particular
discutiremos la búsqueda en anchura y la búsqueda en profundidad para nuestros grafos.
También se repasaran ciertas aplicaciones de los grafos, incluyendo la ordenación
topológica.
Esta sección recoge alguna de la terminología principal asociada con la teoría de grafos
por tanto advertimos al lector de que nuestras definiciones pueden ser ligeramente
diferentes de las definiciones usadas en otros textos de estructuras de datos y teoría de
grafos.
GRAFOS Y MULTIGRAFOS
P=(v ,v ,v ,....v ) 0i 1i 2i m
Tal que u =v0i, v1, es adyacente a vi-1 para i=1,2,…n ; y vn=v . El camino P se dice que es
cerrado si v0 =vn .El camino P se dice que es simple si todos los nodos son distintos, a
excepción de v0 que puede ser igual a vn ; es decir , P es simple si los nodos v0, v1……….vn-1…
son distintos y los nodos v1, v2……….vn son distintos. Un ciclo es un camino simple cerrado
de longitud 3 o mas . Un ciclo de longitud k se llama k-ciclo.
Un grafo G se dice que es conexo si existe un camino entre cualesquiera dos de sus nodos.
Mostraremos en el problema 8.18 que si existe un camino P desde un nodo u a
un nodo v, entonces eliminando las aristas innecesarias, se puede obtener un
camino simple Q de u a v, de acuerdo con esto podemos establecer la siguiente
proposición.
Proposición 8.1.-Un grafo G es conexo si y sólo si existe un camino simple entre
cualesquiera dos nodos de G.
Se dice que un grafo G es completo si cada nodo u de G es adyacente a todos
los demás nodos de G claramente, un grafo así es conexo, un grafo completo
de n nodos tendrá n(n1)2 aristas.
Un grafo conexo T sin ciclos se llama grafo árbol o árbol libre o simplemente
árbol. Esto significa en particular, que existe un único camino simple P entre
cada dos nodos u y e de T (problema 8.18) mas aún, si T es un árbol de finito
de m nodos, entonces T tendrá m -1 aristas (problema 8.20).
Un grafo G se dice que esta etiquetado si sus aristas tiene datos asignados. En
particular, se dice que G tiene peso si cada arista e de G tiene asignado un
valor numérico no negativo w(e) llamado peso o longitud de e. En ese caso, a
cada camino P de G se le asigna un peso o una longitud que es la suma de lo
pesos de las aristas que constituyen el camino P. si no se da otra información
sobre pesos, asumiremos que cada grafo G tiene peso pero de forma que los
pesos w(e) de cada arista e de G es igual a 1. La definición de un grafo puede
ser generalizada si permitimos lo siguiente:
(1) .- Aristas múltiples. Dos aristas e y e distintas se llama aristas múltiples si conectan los
mismos extremos, o sea, si e[u,v] y e=[u.v].
(2) .- Bucles. Una arista e se llama bucle si tiene extremos idénticos, o sea, si e =[u,v].
EJEMPLO 8.1
Hay dos caminos simples de longitud 2 entre B y E ; (B, A, E)y (B, C, E).
Hay un solo camino simple de longitud dos desde B hasta D:(B, C, D).
Anotamos que (B, A, D) no es un camino, ya que [A, D] no es una arista .
Hay dos 4-ciclos en el grafo:
[A, B, C, E, A] y [A, C, D, E, A]
Note que grad(A)=3, ya que A pertenece a tres aristas. Similarmente, grad(C)=4 y
grad(D)=2.
(b) La figura 8.1 (b) no es un grafo sino un multigrafo. La razón es que tiene aristas
múltiples ------ei=[B, C] y e5=[B, C]--- y tiene un bucle e6=[D, D]. La definición de
un grafo normalmente no permite aristas múltiples ni bucles.
(c) La figura 8-1(c) es un grafo árbol con m=6 nodos y, consecuentemente, m-1=5
aristas. El lector puede verificar que hay un único camino simple entre cada dos
nodos del grafo árbol.
(d) La figura 8-1(d) es el mismo grafo que la figura 8-1(a), excepto que ahora el grafo
tiene peso Observe que P1=(B, C, D) y P2=(B, A, E, D) son ambos caminos del nodo B
al nodo D. Sin embargo, aunque P2 contiene mas aristas que P1 el peso w(P2)=9 es
menor que el peso w(P1)=10.
A E A
e6
e1
D
e2 e3
B
B e4 C
C D
e5
a) GRAFO b) MULTIGRAFO
A 6 E
A B C
3
2 2 3
B
4
D E F C 3 D
c)ARBOL d) GRAFO CON PESO
Grafos dirigidos
Un grafo dirigido G, también llamado digrafo o grafo, es lo mismo que un multigrafo, solo
que cada arista e de G tiene una dirección asignada o , en otras palabras ,cada arista e está
identificada por un par ordenado (u,v) de nodos G en vez del par desordenado [u.v].
Suponga que G es un grafo dirigido con una arista dirigida e=(u,v).Entonces e también se
llama arco . Más aún se usa la siguiente terminología:
(1) e empieza en u y termina en v
(2) u es el origen o punto inicial de e ,y v es el destino o punto terminal de e .
(3) u es un predecesor de v y v es un sucesor o vecino de u
(4) u es adyacente hacia v y v es adyacente a u
Las nociones de camino , camino simple y ciclo se aplican en los grafos dirigidos igual que
en los grafos no dirigidos excepto que la dirección de cada arista de un camino (ciclo) debe
coincidir con la dirección del camino (ciclo) . Se dice que un nodo v es alcanzable desde un
nodo u si existe un camino (dirigido) de u a v .
Un grafo dirigido G se dice que es conexo, o fuertemente conexo, si para cada par u,v de
nodos de G existe un camino de u a v y también un camino de v a u . Por otro lado, G se
dice que es unilateralmente conexo para cada par u,v de nodos de G hay un camino de u a v
o un camino de v a u.
EJEMPLO 8.2
La figura 8.2 muestra un grafo dirigido G con cuatro nodos y siete aristas (dirigidas).Las
aristas e2 y e3 se dice que son paralelas , ya que las dos empiezan en B y terminan en A .La
arista e-es un bucle , ya que empieza y termina en el mismo nodo B. La secuencia P 1=(D, C,
B, A), no es un camino ya que (C, B) no es una arista o sea , la dirección de la arista e5=(B,
C) no concuerda con la dirección del camino P 1. Pos otro lado P2=(D, B, A) es un camino
de D a A , ya que (D, B) y (B, A) son aristas .Así A es alcanzable desde D . No existe
camino entre C y el resto de los nodos, así que G no es fuertemente conexo.
A e1 D
e2 e3 e4 e6
e7 B e5 C
FIG. 8.2
Sea T un grafo árbol no vacío. Suponga que elegimos un nodo R de T. Así T con ese nodo R
designado se llama árbol con raíz y R se llama su raíz. Recuerde que existe un único camino
simple desde la raíz R hasta cualquier otro nodo de T. Esto define unja dirección para las
aristas de T, así que el árbol con raíz puede ser visto como un grafo dirigido. Mas aún
suponga que también ordenamos los sucesores de cada nodo v de T. Entonces T se llama
árbol con raíz ordenado. Los árboles con raíz ordenados no son otra cosa que los árboles
generales.
Un grafo dirigido G se dice que es simple si no tiene aristas paralelas. Un grafo simple G
puede tener bucles, pero no puede tener mas de un bucle en un nodo dado. Un grafo G no
dirigido puede verse como un grafo dirigido simple asumiendo que cada arista [u,v] de G
representa dos aristas dirigidas (u,v) y (v.u). (Observe que usamos la notación (u,v) para
denotar un par ordenado).
Advertencia: El asunto principal de este capítulo son los grafos dirigidos simples. Por tanto,
a menos que se diga o se deduzca lo contrario, el término grafo significará grafo dirigido
simple y el término arista significará arista dirigida.
8.3.-REPRESENTACION SECUENCIAL DE GRAFOS; MATRIZ
DE ADYACENCIA MATRIZ DE CAMINOS
MATRIZ DE ADYACENCIA
Suponga que G es un grafo dirigido simple de m nodos y suponga que los nodos de G han
sido ordenados y llamados v1,v2…vm .Así la matriz de adyacencia A=( a i ,j) del grafo G es
la matriz de m x m elementos definida como sigue:
Una matriz A así, que contiene entradas de 0y1 , se llama matriz de bits o matriz booleana.
La matriz de adyacencia de A del grafo G depende de la ordenación de los nodos de G; esto
es, diferentes ordenaciones de los nodos pueden resultar en diferentes matrices de
adyacencia. Sin embargo las matrices obtenidas por dos ordenaciones diferentes están
fuertemente relacionadas en cuanto que a una puede ser obtenida de la otra simplemente
cambiando filas y columnas. A menos que se indique lo contrario asumiremos que los
nodos de nuestro grafo G tienen un orden fijo.
Considere el grafo G de la figura 8.3. Suponga que los nodos se guardan en memoria en un
array lineal Datos tal como sigue;
DATOS: X, Y, Z, W
Asumimos que el orden de los nodos de G es el siguiente v1=X, v2=Y, v3=Z y va=W. La
matriz de adyacencia de A de G es la siguiente:
Z W
Y X
FIG. 8.3
Considere las potencias A,A(1),A(2), A(3),… de la matriz de adyacencia de A de un grafo G.
Sea a1(i,j)=la entrada i j de la matriz A(M) potencia.
Observe que a1(i,j)=a(i,j) da el numero de caminos de longitud 1 desde el nodo v1 hasta el
nodo v3 . Se puede demostrar que a2(i,j) da el numero de caminos de longitud 2 desde
v1,hasta v3. De hecho, en el problema 8.19 probaremos el siguiente resultado general.
Proposición 8.2 Sea A la matriz de adyacencia de un grafo G de la figura 8.3. Entonces ak
(i,j), la entrada ij en la matriz , ak da el número de caminos de longitud k desde v1 hasta v3.
Considere el nuevo grafo G de la figura 8.3 cuya matriz de adyacencia A se da en el ejemplo
8.3. Las potencias A(2),A(3), A(4),… de la matriz A son las siguientes.
Así en particular, hay un camino de longitud 2 de v4 a v1, hay dos caminos de longitud 3
de v2 a v3 y hay 3 caminos de longitud 4 de v2 a v4 (Aquí ,v1=X, v2=Y, v3=Z y v4=W)
Suponga que ahora definimos la matriz B como sigue:
Sea G un grafo dirigido simple con m nodos v1,v2…..vm. La matriz de caminos o matriz de
alcance de G es la matriz m-cuadrada P= v(i,j) definida como sigue:
Considere el grafo G con m=4 nodos de la figura 8.3 .Sumando las matrices con las
potencias A,A(2),A(3) y A(4) obtenemos la siguiente matriz B4 , reemplazando las entradas
positivas por 1, obtenemos la matriz de caminos P del grafo G .
Examinando la matriz P, vemos que el nodo v2 no es alcanzable por ninguno de los otros
nodos. Recuerde que se dice que un dirigido G es fuertemente conexo si, para cada par de
nodos u y v de G, existe tanto un camino de u a v como de v a u. Por tanto, G es
fuertemente conexo si y solo si la matriz de caminos P de G no tiene entradas nulas. Así el
grafo G de la figura 8.3 no es fuertemente conexo.
El cierre transitivo de un grafo G se define como el grafo G’ tal que G’ tiene los mismos
nodos que G y existe una arista ( vi,vj) en G siempre que existe un camino de vi a vj en G.
Así la matriz de caminos P del grafo G es precisamente la matriz de adyacencia de su cierre
transitivo G`. Mas aún un grafo G es fuertemente conexo si y solo si su cierre transitivo es
un grafo completo.
Sea G un grafo dirigido con m nodos, v1 ,v2…..vm. Suponga que queremos encontrar la
matriz de caminos P para el grafo G. Warshall dio un algoritmo para este propósito que es
mucho mas eficiente que calcular las potencias de la matriz de adyacencia A y aplicar la
proposición 8.3. Este algoritmo se describe en esta sección y un algoritmo similar se usa
para calcular el camino mínimo de G cuando G tiene peso.
Primero definimos las matrices m-cuadradas booleanas P0, P1,….Pm como sigue. Sea Pk[i, j]
la entrada i,j de la matriz Pk. Así definimos
En otras palabras,
En primer lugar observe que P0 =A , la matriz de adyacencia de G. Mas aún, como G solo
tiene m nodos, la última matriz Pm =P, la matriz de caminos de G .
Warshall observó que Pk [i. j] = 1 solo puede ocurrir si se da uno de los dos siguientes
casos:
(1).- Existe un camino simple de vi a vj que no usa otros nodos excepto posiblemente v1,
v2,..v k-1 ; por tanto,
P k-1 [i, j] = 1
Estos dos casos se representan, respectivamente, en las figuras 8.5(a) y (b), donde
Sea G un grafo dirigido con m nodos v1, v2, …vm. Suponga que G tiene peso;
o sea, suponga que cada arista e de G tiene asignado un número no negativo
w(e) llamado peso o longitud de la arista e. Entonces G se pude mantener en
memoria por su raíz de pesos W=
(w i,j ), definida como sigue;
La matriz de caminos P nos dice si hay o no caminos entre los nodos. Ahora
queremos encontrar una matriz Q = (q i,j) que nos diga las longitudes de los
caminos entre los nodos o, más exactamente una matriz Q(i,j) donde:
Más exactamente:
Ejemplo 8.4
Considera el grafo con peso G de la figura 8.6 . Asumimos que vi = R, v2=S, v3=T, v4=U.
Así la matriz de pesos W de G es la siguiente:
Aplicando el algoritmo modificado de Warshall, obtenemos las siguientes matrices: Q 0, Q1,
Q2, Q3, Q4 = Q. A la derecha de cada matriz Q k se muestra la matriz de caminos que
corresponde a las longitudes de la matriz Qk.
R 4 U
5 7 2 1
S 3 T
FIG. 8.6
Indicamos como se obtienen las entradas rodeadas por círculos:
Algoritmo 8.2 (Algoritmo del camino mínimo). Un grafo con peso G de M nodos esta
en memoria mediante su matriz de pesos W. Este algoritmo encuentra la
matriz Q tal que [I, J] es la longitud del camino mínimo del nodo vi al nodo
vj INFINITO es un número muy grande y MIN es la función del valor
mínimo.
5.-Salir
El algoritmo 8.2 también se puede usar para un grafo G sin pesos, simplemente asignando el
peso w(e) = 1 a cada arista e de G .
8.5 REPRESENTACIÓN ENLAZADA DE UN GRAFO
Esto es porque el tamaño de A debería de ser cambiado y los nodos deberían de ser
reordenados, así que habría muchos cambios en la matriz A. Más aún si el número de aristas
es O(m) o O(m log i m), entonces la matriz A estará desperdiciada (contendrá muchos ceros)
por tanto , se desperdiciara una gran cantidad de espacio. Por tanto G normalmente se
representa en memoria por una representación enlazada, también llamada estructuras de
adyacencia, la cual se describe en esta sección.
Considere el grafo G de la figura 8.7 (a) La tabla de la figura 8.7 (b) muestra cada nodo de G
seguido por su lista de nodos adyacentes, también llamados sucesores o vecinos. La figura
8.8 muestra el diagrama esquemático de la representación enlazada de G en memoria.
Específicamente la representación enlazada contendrá dos listas (o archivos) una lista de
nodos NODO y una lista de aristas ARISTA, tal como sigue;
A X
PRINCIPIO
B X
C X
D X
E X X
FIG 8.8
Aquí NODO será el nombre o valor clave del nodo, SIG será un puntero al siguiente
NODO de la lista NODO y ADY será un puntero al primer elemento de la lista de
adyacencia del nodo que se mantiene en la lista ARISTA. El área sombreada indica que
puede haber otra información en el registro, tal como el grado de entrada
GRADENT del nodo, el grado de salida GRADSAL del nodo, el ESTADO del nodo
durante la ejecución de un algoritmo, etc. (Alternativamente se puede asumir que
NODO es un array de registros conteniendo campos como NOMBRE, GRADENT,
GRADSAL, ESTADO). Los nodos mismos, como se ve en la figura 8.7 estarán
organizados como una lista enlazada y por tanto habrá una variable puntero
PRINCIPIO para el comienzo de la lista y una variable puntero NDISP para la lista de
espacio disponible. A veces, dependiendo de la aplicación, los nodos pueden estar
organizados como un array ordenado o un árbol binario de búsqueda en vez de una lista
enlazada.
(b) Listas de aristas Cada elemento de la lista ARISTA corresponderá a una arista de G y
será un registro de la forma;
DEST ENL
El campo DEST apuntara a la posición de la lista NODO del nodo destino o terminal
de la arista. El campo ENL enlazara juntas las aristas con el mismo nodo inicial, o sea,
los nodos de la misma lista de adyacencia. El área sombreada indica que puede haber
otra información en el registro correspondiente a la arista, tal como un campo ARIS
conteniendo los datos etiquetados de la arista cuando G es un grafo con etiquetas, un
campo PESO conteniendo el peso de la arista cuando G es un grafo con peso, etc.
FIG 8.9
También necesitamos una variable puntero ADISP para la lista de espacio disponible en la
ARISTA.
La figura 8.9 muestra como el grafo G de la figura 8.7(a) aparecería en memoria. La
elección de 10 posiciones para la lista NODO y de 12 posiciones para la lista ARISTA es
arbitraria. La representación enlazada de un grafo G que hemos estado viendo se puede
denotar por:
Suponga que las líneas aéreas amistosas tienen nueve vuelos diarios:
103 Atlanta Houston 203 Boston a Denver 305 Chicago a Miami 106
Houston a Atlanta 204 Denver a Boston 308 Miami a Boston
201 Boston a Chicago 301 Denver a Reno 402 Reno a Chicago
Claramente, los datos pueden guardarse eficientemente en un archivo en el que cada registro
contenga tres campos:
Para hacer que las repuestas a esas preguntas sean más fáciles de encontrar, puede ser muy
útil que los datos sean organizados también como un grafo G con las ciudades como nodos y
los vuelos como aristas. La figura 8.10 es un dibujo del grafo G.
RENO BOSTON
CHICAGO
DENVER
ATLANTA MIAMI
HOUSTON
FIG 8.10
8.6 OPERACIONES SOBRE GRAFOS
Discutida en la sección anterior. Esta sección discute las operaciones, de búsqueda inserción
y eliminación de nodos y aristas en el grafo G. La operación de recorrido se trata en la
siguiente sección.
Diferente que en el capítulo 5. Por supuesto, si se usan listas enlazadas circulares a árboles
binarios de búsqueda en vez de listas enlazadas, se deben de usar los procedimientos
análogos.
El procedimiento 8.3 (originalmente procedimiento 5.2) busca loa posición POS de un ITEM
en una lista enlazada .
Por otro lado, suponga que queremos encontrar la posición POS de una arista (A B) del
grafo G. Primero debemos encontrar la posición POSA de A y la posición POSB de B en la
lista NODO. Luego debemos de buscar en la lista de sucesores de A, que tiene el puntero de
lista ADY[POSA], la posición POS de POSB. Esto se implementa con el Procedimiento
8.5, que también comprueba que A y B sean nodos de G. Observe que POS de la posición de
POSB en la lista ARISTA.
Por supuesto, el Procedimiento 8.6 debe ser modificado si la lista NODO se mantiene como
una lista ordenada o como un árbol binario de búsqueda.
Suponga que se va a insertar una arista (A, B) en el grafo G (El procedimiento asumirá que
tanto A como B son nodos de G). El procedimiento busca la posición POSA de A y la
posición POSB de B en la lista NODO. Luego se inserta(A, B) como una arista de G
insertando POSB en la lista de sucesores de A, que tiene el puntero de la lista ADY[POSA].
De nuevo se usa una variable lógica INDIC para indicar el desbordamiento.
El procedimiento es el siguiente:
El procedimiento debe de ser modificado usando el procedimiento 8.6 si A o B no son nodos
del grafo G.
Suponga que se va a eliminar una arista (A, B) del grafo G. (Nuestro procedimiento asumirá
que A y B son nodos de G). De nuevo debemos encontrar primero la posición POSA de A y
la posición POSB de B en la lista de nodos. Entonces simplemente eliminamos POSB de la
lista de sucesores de A, que tiene el puntero de la lista ADY[POSA].Se usa una variable
INDIC lógica para indicar si no existe tal arista en el grafo G. El procedimiento es el
siguiente:
Suponga que se va a eliminar un nodo N del grafo G. Esta operación es más complicada que
las operaciones de búsqueda e inserción y que la de eliminar una arista, ya que debemos
eliminar todas las aristas que contengan a N. Note que esas aristas son de dos tipos; aquellas
que empiezan en N y aquellas que terminan en N. Así nuestro procedimiento consistirá
fundamentalmente en los siguientes cuatro pasos:
(2).- Eliminar todas las aristas que terminen en N; o sea, eliminar POS de la lista de
sucesores de cada nodo M de G (este paso requiere recorrer la lista de nodos de G).
(3).- Eliminar todas las aristas que empiecen en N. Esto se hace encontrando la posición
COM del primer sucesor y la posición FIN del ultimo sucesor de N, y luego
añadiendo la lista de sucesores de N a la lista ADISP.
El procedimiento es el siguiente:
Ejemplo 8.6
Considere el grafo (no dirigido) G de la figura 8.12(a), cuyas listas de adyacencia aparecen
en la figura 8.12(b) Observe que G tiene 14 aristas dirigidas, ya que existe 7 aristas no
dirigidas.
Suponga que G se mantiene en memoria como en la figura 8.13(a). Más aún suponga que el
nodo B se elimina de G mediante el Procedimiento 8.9. Obtenemos los siguientes pasos:
Paso 1.- Encuentra POS = 2, la posición de B en la lista de nodos.
Paso 3.- Elimina POS = 2 de la lista de aristas, o sea, de cada lista de sucesores.
Paso 5.- Encuentra COM = 4 y FIN = 6, el primer sucesor de B y el último.
Paso 6.- Elimina la lista de sucesores de la lista de aristas.
Paso 7.- Elimina el nodo B de la lista de nodos.
Paso 8.- Vuelve.
Los elementos eliminados esta rodeados con un círculo en la figura 8.13(a). La figura
8.13(b) muestra G en memoria tras eliminar el nodo B (y sus aristas).
Muchos algoritmos de grafos requieren que se examinen sistemáticamente los nodos y las
aristas de un grafo G. Esto se puede hacer de dos formas estándar. Una forma se llama
búsqueda en anchura y la otra búsqueda en profundidad. La búsqueda en anchura usará
una cola como estructura auxiliar para mantener los nodos que se vayan a procesar
posteriormente, y análogamente, la búsqueda en profundidad usará una pila.
Durante la ejecución de nuestros algoritmos, cada nodo N de G estará en uno de tres estados,
lo que se llama estado de N, tal como sigue:
Búsqueda en anchura
Ejemplo 8.7
Considere el grafo G de la figura 8.14(a). [Las listas de adyacencia de los nodos aparecen en
la figura 8.14(b)]. Suponga que G representa los vuelos diarios entre ciudades de alguna
compañía aérea, y suponga que deseamos volar de la ciudad A a la ciudad J con el mínimo
número de paradas. En otras palabras, queremos saber el camino mínimo P desde A hasta J
(donde cada arista tiene longitud 1).
FRENTE = 1 COLA: A
FINAL = 1 ORIG: 0
(b).- Quitar el elemento A al frente de COLA haciendo FRENTE : = FRENTE+1 y
añadir a COLA los vecinos de A como sigue:
FRENTE = 2 COLA: A, F, C, B
FINAL = 4 ORIG : 0, A, A, A
Note que el origen A de cada una de las tres aristas se añade a ORIG.
FRENTE = 3 COLA : A, F, C, B, D
FINAL = 5 ORIG : 0, A, A, A, F
FRENTE = 4 COLA : A, F, C, B, D
FINAL = 5 ORIG : 0, A, A, A, F
(e).- Quitar el elemento B al frente de COLA y añadir a COLA los vecinos de B (con
estado de preparados) como sigue:
FRENTE = 5 COLA : A, F, C, B, D, G
FINAL = 6 ORIG: 0, A, A, A, F, B
(f).- Quitar el elemento D al frente de COLA y añadir a COLA los vecinos de D (con
estado de preparados) como sigue:
FRENTE = 6 COLA : A, F, C, B, D, G
FINAL = 6 ORIG: : 0, A, A, A, F, B
(g).- Quitar el elemento G al frente de COLA y añadir a COLA los vecinos de G (con
estado de preparados) como sigue:
FRENTE = 7 COLA : A, F, C, B, D, G, E
FINAL = 7 ORIG : 0, A, A, A, F, B, G
(h).- Quitar el elemento E al frente de COLA y añadir a COLA los vecinos de E (con
estado de preparados) como sigue:
FRENTE = 8 COLA : A, F, C, B, D, G, E, J
FINAL = 8 ORIG : 0, A, A, A, F, B, G, E
Paramos tan pronto como J se añade a COLA, ya que J es nuestro destino final. Ahora
volvemos hacia atrás desde J usando el array ORIG para encontrar el camino P. Así
Es el camino P requerido.
Búsqueda en profundidad
De nuevo este algoritmo procesa solo los nodos que sean alcanzables desde el nodo
de partida A. Suponga que queremos examinar todos los nodos de G. Entonces el
algoritmo debe de ser modificado para que comience de nuevo con otro nodo al que
llamaremos B que este en su estado de preparado. Este nodo se puede obtener
recorriendo la lista de nodos.
Ejemplo 8.8
Considere el grafo G de la figura 8.14 (a). Suponga que queremos encontrar e
imprimir todos los nodos alcanzables desde el nodo J (incluyendo J). Una forma de
hacerlo es usando el algoritmo de búsqueda en profundidad para G comenzando en
el nodo J. Los pasos de la búsqueda son:
PILA: J
(b).- Sacar e imprimir el elemento en la cima y luego meter en la pila todos los
vecinos de J (con estado de preparado) como sigue:
Imprimir J PILA: D, K
(c).- Sacar e imprimir el elemento en la cima K y luego meter en la pila todos los
vecinos de K (en estado preparado) como sigue:
Imprimir K PILA: D, E, G
(d).- Sacar e imprimir G y luego meter en la pila todos los vecinos de G (en estado
preparado)
Imprimir G PILA D, E, G
Note que solo se mete C en la pila, ya que el otro vecino, E no esta en estado preparado
(porque E ya ha sido metido en la pila)
(e).- Sacar e imprimir C y luego meter en la pila todos los vecinos de C (en estado
preparado) como sigue:
Imprimir C PILA: D, E, F
(f).- Sacar e imprimir el elemento F y luego meter en la pila todos los elementos de F (en
estado preparado) como sigue:
Imprimir F PILA: D, E
(g).- Sacar e imprimir E y meter en la pila todos los vecinos de E (en estado preparado)
como sigue:
Imprimir E PILA: D
Imprimir D PILA:
Ahora la pila esta vacía, así que la búsqueda en profundidad de G comenzando en J esta
completa. De acuerdo con ello, los nodos que se imprimieron.
J, K, G, C, F, E, D
Suponga que S es un grafo tal que cada nodo v1 de S representa una tarea y cada arista (u, v)
significa que la finalización de la tarea u es un prerrequisito para que comience la tarea
v. Suponga que tal grafo S contiene un ciclo tal que:
P= (u, v, w, u)
Esto significa que no podemos empezar v hasta completar u, no podemos empezar w hasta
terminar v y no podemos empezar u hasta terminar w. Así no podemos completar ninguna
tarea del ciclo. Por tanto, un grafo S así, que representa tareas y relaciones de precedencia,
no puede tener ciclos.
Suponga que S es un grafo sin ciclos. Considere la relación < sobre S definida como sigue;
Tal relación sobre S se le llama ordenación parcial de S, y S con tal ordenación se llama
conjunto parcialmente ordenado o conjunto po. Así un grafo S sin ciclos se puede considerar
un conjunto parcialmente ordenado.
Por otro lado, suponga que S es un conjunto parcialmente ordenado con la ordenación
parcial denotado por <. Entonces S se puede considerar un grafo cuyos nodos son los
elementos de S y cuyas aristas están definidas como sigue:
(u, v) es una arista en S si u < v
Más aún, se pude demostrar que un conjunto S parcialmente ordenado, considerado como un
grafo, no tiene ciclos.
Ejemplo 8.9
Sea S el grafo de la figura 8.15. Observe que S no tiene ciclos. Así S se puede considerar un
conjunto parcialmente ordenado. Note que G < C, ya que existe un camino desde G hasta
C. Similarmente, F < B y B <C. Por otro lado, B A, ya que no existe camino de B a A.
También A B.
Ordenación topológica
Sea S un grafo dirigido sin ciclos (o conjunto parcialmente ordenado). Una ordenación
topológica T de S es una ordenación lineal de los nodos de S que preserva la ordenación
parcial de S original. O sea, que si u < v en S (si hay un camino de u a v en S ) entonces u
va delante de v en la ordenación lineal T. La figura 8.16 muestra dos ordenaciones
topológicas del grafo S de la figura 8.15. Hemos concluido las aristas en la figura 8.16
para indicar que concuerdan en la dirección de la ordenación lineal.
Proposición 8.4 Sea S un grafo dirigido finito sin ciclos o un conjunto parcialmente
ordenado. Entonces existe una ordenación topológica T del conjunto S.
Note que la proposición solo establece que la ordenación topológica existe. Ahora damos un
algoritmo que encuentra la ordenación topológica.
(a)
E G B A D F C
(a)
escogido como primer elemento en la ordenación T. De acuerdo con esto, nuestro algoritmo
repetirá los siguientes pasos hasta que el grafo S este vacío:
El orden en que los nodos son eliminados del grafo S usara un array auxiliar COLA que
contendrá temporalmente todos los nodos con grado de entrada nulo. El algoritmo también
usa un campo GRADENT tal que GRADENT(N) contendrá el grafo de entrada actual del
nodo N. El algoritmo es el siguiente:
Ejemplo 8.10
Considere el grafo S de la figura 8.15(a). Aplicamos nuestro algoritmo C para buscar una
ordenación topológica T del grafo S. Los pasos del algoritmo van a continuación:
1.- Buscar el grado de entrada GRADENT(N) de cada nodo N del grafo S. Esto da:
2.- Inicialmente añadir ala cola cada nodo con grado de entrada cero como sigue:
3a.- Quitar el elemento B al frente de la cola haciendo FRENTE:= FRENTE +1, tal
como sigue:
[La lista de adyacencia de B en la figura 8.15 (b) se usa para encontrar a los
vecinos de B, D y F.] El vecino D se añade al final de la cola, ya que su grado de
entrada ahora es cero:
[El grafo S ahora esta como en la figura 8.15 (a), donde el nodo B y sus aristas han
sido eliminados, como se indica por las líneas punteadas.]
4a.- Quitar el elemento E de la cola haciendo FRENTE: = FRENTE+1 , tal como sigue:
4b.- Decrementar en 1el grado de entrada de cada vecino de E, tal como sigue:
GRADENT(C) = 3-1 = 2
5a.- Quitar el elemento G de la cola haciendo FRENTE:= FRENTE +1, tal como sigue:
FRENTE : = 4, FINAL: = 4, COLA: B, E, G, D
[El grafo S ahora esta como en la figura 8.17(c), donde G y sus dos aristas han sido
eliminados.]
7a.- Quitar el elemento A de la cola haciendo FRENTE : = FRENTE+1, tal como sigue:
GRADENT(C) = 1-1 = 0
8a.- Quitar de la cola el elemento F haciendo FRENTE: = FRENTE+1, tal como sigue:
Ahora la cola no tiene elemento al frente, así que el algoritmo ha terminado. Los elementos
en el array COLA dan la ordenación topológica T de S requerida, que es:
T: B, E, G, D, A, F, C
El algoritmo podría haber parado en el paso 7b, donde FINAL es igual al número de nodos
del grafo S.
PROBLEMAS RESUELTOS
TERMINOLOGÍA DE GRAFOS
8.1 Considere el grafo (no dirigido) G de la figura 8.18. (a) Describir G formalmente en
términos de su conjunto V de nodos y de su conjunto E de aristas. (b) Encontrar el
grado de cada nodo.
(a).- Existen 5 nodos, a, b, c, d y e; por tanto, V = { a, b, c, d, e}. Hay siete pares [x, y]
de nodos tales que el nodo x esta conectado con el nodo y; por tanto:
E = {[ a, b], [a, c,], [a, d],[b, c,], [b, e], [c, d ],[ c, e]}
(b).- El grado de un nodo es igual al numero de aristas a las que pertenece; por
ejemplo, grad(a) = 3, ya que a pertenece a tres aristas, [ a, b], [a, c,] y [a, d]. De
forma similar, grad(b) = 3, grad(c) = 4, grad(d) = 2 y grad(e) = 2.
8.2 Considere los multigrafos de la figura 8.19. ¿Cuáles de ellos son (a) conexos; (b)
libres de bucles, (c) grafos?
Considere el grafo conexo G de la figura 8.20. (a). Encontrar todos los caminos simples del
nodo A al nodo F. (b) Encontrar la distancia entre A y F. (c) Encontrar el diámetro de G. (El
diámetro de G es la máxima distancia existente entre dos de sus nodos.)
A B C
D E F
Fig. 8.20
(a).- Un camino simple entre A y F es un camino tal que no se repiten nodos o aristas.
Existen 7 caminos simples así:
(b).- La distancia entre A y F es igual a 3, ya que existe un camino simple (A, B, C, F),
desde A hasta F de longitud 3 y no hay otro camino mas corto entre A y F.
8.4 Considere el grafo (dirigido) G de la figura 8.21 (a) Encontrar todos los caminos
simples de X a Z. (b). Encontrar todos los camino simples de Y a Z. (c). Encontrar el
gradent(Y) y el gradsal(Y). ¿Existen fuentes o sumideros?
(a).- Hay tres caminos simples de X a Z: (X, Z), (X, W, Z) y (X, Y, W, Z).
(b).- Solo hay un camino simple de W a Z: (Y, W, Z).
(c).- Como dos aristas entran en Y (o sea, terminan en Y), tenemos que gradent(Y) = 2.
Como solo una arista sale de Y (o sea empieza en Y), el gradsal(Y) = 1.
(d).- X es una fuente, ya que ninguna arista entra en X [o sea, gradent(X) = 0], pero
algunas aristas salen de X [o sea, gradsal (X) > 0]. No hay sumideros, ya que todos
los nodos tienen un grado de salida no nulo(o sea, cada nodo es punto inicial de
alguna arista).
8.5 Dibujar todos los árboles (no similares) con exactamente seis nodos. [Un grafo G es
similar a un grafo G’ si existe una correspondencia de uno a uno entre el conjunto V
de nodos de G y el conjunto V’ de nodos de G’ tal que (u, v) es una arista en G si y
solo si el correspondiente par (u’, v’) de nodos es una arista de G’]
Existen seis árboles así, que se muestran en la figura 8.22. El primer árbol tiene diámetro 5,
los dos siguientes tienen diámetro 4, los dos siguientes diámetro 3 y el último diámetro 2.
Cualquier otro árbol de seis nodos será similar a alguno de estos árboles.
Fig. 8.22
8.6.- Encontrar todos los árboles extendiendo el grafo G de la figura 8.23 (a). (Un árbol T
se llama árbol extendido de un grafo conexo G si T tiene los mismo s nodos que G y todas
las aristas de T están contenidas entre las aristas de G.)
(a)
(b)
Fig. 8.23
Existen 8 árboles extendidos así, como se muestra en la figura 8.23 (b). Como G tiene 4
nodos, cada árbol extendido T debe tener 4-1 = 3 nodos. Así, cada árbol extendido se puede
obtener eliminando dos de las 5 aristas de G. Esto se puede hacer de 10 formas, pero dos de
ellas producen grafos disconexos. Por tanto, los ocho árboles extendidos mostrados son los
árboles extendidos del grafo G.
REPRESENTACIÓN SECUENCIAL DE GRAFOS
8.7.- Considere el grafo G de la figura 8.21. Suponga que los nodos se mantienen en
memoria en un array DATOS tal como sigue:
DATOS: X, Y, Z, W
(a).- Los nodos están normalmente ordenados de acuerdo con la forma en que
aparecen en memoria; o sea, asumimos que v1= X, v2= Y, v3= Z, v4= W. La
matriz de adyacencia A de G es la siguiente:
0 1 1 1
0 0 0 1
A= 0 1 0 1
0 0 1 0
O sea,
8.9 .-Considere el grafo (no dirigido) con peso de G de la figura 8.24. Suponga que los
nodos se guardan en memoria en un array DATOS como sigue:
DATOS: A, B, C, X, Y
X 5 Y
2 3 1 6 7
4
S 8 T
FIG. 8.26
REPRESENTACIÓN ENLAZADA DE GRAFOS
Dibujar el grafo G.
Primero buscamos todos los vecinos de cada nodo NODO(K) recorriendo su lista de
adyacencia que tiene el puntero ADY[J]. Esto da:
A B C
D E
Fig:8.27
8.14 Encontrar los cambios en la representación enlazada del grafo G del problema 8.13 si
se dan las siguientes operaciones: (a) Se añade el nodo F a G. (b) Se elimina la arista
(B, E) de G, (c) Se añade la arista (A, F) a G. Dibujar el grafo G resultante.
(a).- La lista de nodos no esta ordenada, así que insertamos F al principio de la lista,
usando el primer nodo libre disponible tal como sigue:
PRINCIPIO 5 NODO A B E F D C
7 4 0 6 1 0 2 3
NDISP 8 SIG
1 2 5 0 7 9
ADY
1 2 3 4 5 6 7
8
D E
F
Fig:8.28
8.16
Suponga que G es un grafo finito no dirigido. Entonces G consiste en un número
finito de componentes conexas disjuntas. Describir un algoritmo que encuentre el
número NCOMP de componentes conexas de G. Mas aun, el algoritmo debe asignar
un número de componente COMP(N) a cada nodo N de la misma componente
conexa de G de tal forma que el rango de números de componentes vaya de 1 a
NCOMP.
PROBLEMAS VARIADOS
8.17 Suponga que G es un grafo no dirigido con m nodos v1, v2,…vm y n aristas e1,
e2,…en. La matriz de incidencia de G es la matriz de m x n M=(m ij), donde
Suponga que K es mayor a 1. (Asuma que G tiene m nodos.) como a las potencias
de A(k) igual a A(k-1) A,
8.21 Considere el grafo no dirigido G de la figura 8.31. Encontrar : (a) todos los caminos
simples de l nodo A al nodo H,(b) el diámetro de G, (c) el grado de cada nodo.
A B C D
E F G H
Fig. 8.31
8.22 ¿Cuales de los multigrafos de la figura 8.32 son (a) conexos, (b) libre de bucles (c)
grafos?
(i) (ii) (iii)
Fig. 8.32
8.23 Considere el grafo dirigido de la figura 8.33 (a) Encontrar el grado de entrada y de
salida de cada nodo. (b) encontrar el número de caminos simples de v1 a v4. (c)
Existen fuentes o sumideros?
v1 v2
v3
v4
v5
Fig.8.33
8.24 Dibujar todos los árboles (no similares) de cinco o menos nodos. (Hay ocho árboles
así.)
D E F
Fig. 8.34
8.26 Considere el grafo G de la figura 8.35 Suponga que los nodos se mantienen en
memoria en un array DATOS de la forma siguiente:
DATOS: X, Y, Z, S, T
S T
X
Z
Fig.8.35
8.27 Considere el grafo con peso G de la figura 8.36. Suponga que los nodos se guardan
en un array DATOS como sigue:
DATOS: X, Y, S, T
X 3 Y
6 1
2
4
T
S
5
Fig.8.36
1 1
2 2 2
2 1
1
3 3 1 3
3 3
Fig.8.37
8. 29.- La siguiente es la matriz de incidencia M de un grafo G no dirigido:
(Note que G tiene cinco nodos y ocho aristas). Dibujar G y encontrar su matriz de
adyacencia A.
Dibujar el grafo G
8.32 Encontrar los cambios que ocurren en la representación enlazada del grafo G del
problema 8.31 si se elimina la arista (C, E) y se inserta la arista (D,E).
8.33 Encontrar los cambios en la representación enlazada del grafo G del problema 8.31 si
se insertan el nodo F y las aristas (E, F) y (F, D) en G.
8.34 Encontrar los cambios en la representación enlazada del grafo G del problema 8.31 si
se elimina el nodo B de G,
Los problemas 8.39 y 8.40 se refieren a un grafo con peso G que se mantiene en
memoria con la siguiente representación enlazada:
8.39 Escribir un procedimiento que encuentre el camino mínimo desde un nodo dado NA
hasta un nodo dado NB.
8.40 Escribir un procedimiento que encuentre el camino mas largo desde un nodo dado
NA hasta un nodo dado NB.
PROBLEMAS DE PROGRAMACIÓN
8.41 Suponga que un grafo G se determina por medio de un entero M, representando los
nodos 1, 2, …, M y una lista de N pares ordenados, representando las aristas de G.
escribir u procedimiento para:
(i).- M = 5; N= 8;(3, 4), (5, 3). (2, 4). (1, 5). (3, 2). (4, 2). (3, 1). (5, 1).
(ii).- M = 6; N= 10;(1, 6), (2, 1). (2, 3). (3, 5). (4, 5). (4, 2). (2, 6). (5, 3), (4, 3), (6, 4).
8.42 Suponga que un grafo con peso G se determina por medio de un entero M,
representando los nodos1, 2,..M, y una lista de N tripletas ordenadas (ai, bi, wi) de
enteros tales que el par (ai, bi) es una arista de G y wi es su peso. Escribir un
procedimiento para:
Asuma que NODO tiene sitio para ocho nodos y DEST para doce aristas. Escribir un
programa que realice las siguientes operaciones sobre G:
6 5
6
0
7
Washington 0 0 10
8
Filadelfia 0 7 6
9 10
Denver 10 4 8
Chicago 1 0 2
PRINCIPIO= 9 NDISP= 5
1 201 80 2 10 3
2 202 80 10 2 0
3 301 50 2 4 0
4 302 50 4 2 5
5 303 40 4 8 7
6 304 40 8 4 9
7 305 120 4 9 0
8 306 120 9 4 13
9 401 40 8 7 0
10 402 40 7 8 11
11 403 80 7 1 0
12 404 80 1 7 16
13 501 80 9 3 15
14 502 80 3 9 0
15 503 140 9 1 0
16 504 140 1 9 0
17 18
18 19
19
20
20
0
NUM=16 ADISP=17
Fig. 8.38
(a) (A, Z), (S, Z), (X, D), (B, T), (C, B), (Y, X), (Z, X), (S, C), (Z, B).
(b) (A, Z), (D, Y), (A, X), (Y, B), (S, Y), (C, T), (X, S), (B, A), (C, S) y (X, T)
(c) (c) (A, C), (B, Z), (Y, A), (Z, X), (D, Z), (A, S), (B, T), (Z, Y), (T, Y) y (X, A).
BIBLIOGRAFÍA