Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GRAFOS
LICENCIATURA EN INFORMATICA
27/05/2013
INTRODUCCIÓN
Estas estructuras tienen aplicaciones en diferentes dominios, entre ellos transporte terrestre,
aéreo y marítimo, redes de computadoras, mapas, ubicación geográficas de varias ciudades,
asignación de tareas, etc.
Recordemos que existen diferencias sustanciales entre grafos y arboles y entre ellas tenemos
que los arboles son una estructura jerárquica aplicada sobre una colección de nodos en
donde uno de los nodos es la raíz, mientras que en grafos existen varios caminos entre un
nodo u otro, tomando en cuenta también que el árbol establece un único camino desde el
nodo raíz hasta un nodo cualquiera del árbol, diferenciándose del grafo que se encarga de
estudiar las relaciones de unidades que interactúan unas con otras.
DEFINICIÓN
Una grafica G consta de dos conjuntos: V(G) y A(G). El primero lo integran elementos
llamados nodos o vértices; el segundo, arcos o aristas. Por lo tanto, podemos denotar una
grafica G como:
G= (V,A)
Lazo o Bucle: Un lazo o bucle es una arista que conecta a un vértice consigo mismo;
es decir, a= (u, u).
Camino Simple: El camino es simple si todos sus nodos so distintos, con excepción
del primero y del ultimo, que pueden ser iguales; es decir, P es simple si v1, v2,…., son
distintos.
Ciclo: Un ciclo es un camino simple cerrado de longitud 3 o mayor. Un ciclo de longitud
k se llama k-ciclo.
Grafo Conexo: Se dice que un grafo es conexo si existe un camino simple entre
cualesquiera dos de sus nodos.
Grafo árbol: Se dice que un grafo G es del tipo árbol o árbol libre si G es una grafica
conexa sin ciclos.
Grafo completo: Se dice que un grafo es completo si cada vértice v de G es
adyacente a todos los demás vértices de G. Una grafica completa de n vértices tendrá
n (n – 1)/2 aristas.
Grafo etiquetado: Se dice que un grafo G esta etiquetada si sus aristas tienen
asignado un valor. Es decir, si cada arista a tiene un valor numérico no negativo c(a),
llamado costo, peso o longitud de a, entonces G tiene peso o esta etiquetado. En este
caso, cada camino P de G tendrá asociado un peso o longitud que será la suma de los
pesos de las aristas que forman el camino P.
Multígrafo: Un grafo se denomina multígrafo si al menos dos de sus vértices están
conectados entre si por medio de dos aristas. En este caso, las aristas reciben el
nombre de aristas múltiples o paralelas.
GRAFOS DIRIGIDOS
Se caracterizan porque sus aristas tienen asociadas una dirección; es decir, son pares
ordenados. Los vértices se utilizan para representar información, mientras que las aristas
representan una relación con dirección o jerarquía entre aquellos.
Un grafo dirigido G, también es llamado dígrafo, se caracteriza porque cada arista a tiene una
dirección asignada; es decir, cada arista esta asociada a un par ordenado (u, v) de vértice G.
Una arista dirigida a= (u, v) se llama arco, y generalmente se expresa u v. Para las aristas
de los dígrafos se aplica la siguiente terminología:
a empieza en v.
u es el origen o punto inicial de a, y v es el destino o punto terminal de a.
u es un predecesor de v y v es un sucesor o vecino de u.
u es adyacente hacia v y v es adyacente desde u.
Los dígrafos son estructuras de datos abstractas; por lo tanto, los lenguajes de programación
no cuentan con herramientas que permitan su manejo. Para su representación se requiere
usar otras estructuras de datos. Existes varias opciones para realizar esto ultimo; la elección
de la mas adecuada depende del uso que se le vaya dar a la información almacenada en los
vértices y en las aristas.
Las representaciones más utilizadas son las matrices y listas de adyacencia, que se
describirán mas adelante. Es importante señalar que algunos lenguajes de programación,
como LISP o SCHEME, no utilizan arreglos bidimensionales (matrices) como estructura de
datos estándar; por lo tanto, se usan arboles o listas para la representación de dígrafos.
Ejemplo: N = {a,b,c}, A = {(a,b), (b,c), (c,a)}
GRAFOS NO DIRIGIDOS
Su característica principal es que sus aristas son pares no ordenados de vértices. Es decir, si
existe un camino del vértice i al j, será exactamente el mismo camino del vértice j al i.
Estos grafos se utilizan para modelar relaciones simétricas entre diferentes objetos, que se
representan por medio de los vértices, mientras que las aristas se usan para indicar las
relaciones entre ellos. Por ejemplo, el costo de un boleto de avión para ir de la ciudad de
Panama a Bocas del Toro será el mismo en cualquiera de las direcciones que se realice el
viaje.
Los grafos no dirigidos so estructuras de datos abstractos; por lo tanto, se deben apoyar en
otras estructuras para su representación en memoria. Las dos representaciones más
utilizadas matriz de adyacencia y lista de adyacencia.
Considerando la simetría de las relaciones entre los elementos de los grafos, se requiere
cambiar cada arista no dirigida entre u y v por dos aristas dirigidas, una de u a v y otra de v a
u; por lo tanto, la matriz de adyacencia resultara una matriz simétrica, y en la lista de
adyacencia el vértice u estará en la lista de adyacencia del vértice v, y viceversa.
arista(a,b). a b
arista(b,a).
arista(b,c).
arista(c,b).
arista(c,a).
arista(a,c).
c
MATRIZ DE ADYACENCIA
Una matriz de adyacencia es una matriz booleana, de orden n, donde n, indica el numero de
vértices de G. Los renglones y columnas de la matriz representan a los vértices y su contenido
la existencia o no de arco entre ellos. Por lo tanto, cada elemento i, j de la matriz almacena un
1, o un 0, dependiendo de si existe o no un arco entre los vértices i y j.
Para generar la matriz de adyacencia correspondiente a un dígrafo se le da un orden arbitrario
a sus vértices, y se asigna a los renglones y a las columnas de una matriz el mismo orden. Un
elemento de la matriz será 1 si los vértices correspondientes al renglón y a la columna están
unidos por una arista (son adyacentes), y 0 en caso contrario.
Una ventaja de las matrices de adyacencia es que el tiempo de acceso al elemento requerido
es independiente del tamaño de V y A. El tiempo de búsqueda es del orden de 0(n). Sin
embargo, su principal desventaja es que requiere un espacio de almacenamiento de n2
posiciones, aunque el número de arcos de G no sobrepase ese numero.
La matriz de adyacencia es útil en los algoritmos diseñados para conocer si existe una arista
entre dos nodos.
Una lista de adyacencia para el vértice a es una lista ordenada de todos los vértices
adyacentes de a. Por lo tanto, una lista de adyacencia para representar un grafo dirigido esta
formado por tantas listas como vértices que tenga G. Para guardar los vértices de G se puede
utilizar otra lista o un arreglo.
Este tipo de representación se recomienda cuando el número de arista es menor a n2. El uso
de lista de adyacencia permite ahorrar espacio de almacenamiento. Sin embargo, usar una
lista en lugar de una matriz tiene la desventaja de que el tiempo de búsqueda de las arista
puede ser mayor, ya que se pierde el acceso directo que permite la matriz. La operación de
búsqueda será del orden de 0(n).
OBTENCIÓN DE CAMINOS
Para el caso de las graficas dirigidas, generalmente resulta de interés encontrar los caminos,
directos o indirectos, entre sus vértices. A su vez al trabajar con dígrafos etiquetados se
requiere encontrar el camino mas corto entre dos vértices dados o entre todos sus vértices. Es
decir, interesan aquellos caminos que nos permitan desde un vértice origen a un vértice
destino recorriendo la menor distancia o con el menor costo.
Los algoritmos mas usados para este fin son: Dijkstra, Floyd y Warsall. Los tres algoritmos
utilizan una matriz de adyacencia etiquetada, donde:
M[i, j] = 0 si i = j.
M[i, j] = infinito si no existe un camino de i a j, donde i es diferente a j.
M[i, j] = costo de ir del vértice i al vértice j, si existe a(i, j)
Este algoritmo se caracteriza por encontrar el camino mas corto de un vértice elegido a
cualquier otro vértice del dígrafo, donde la longitud de un camino es la suma de los pesos de
las aristas que lo forman. Las aristas deben tener un peso no negativo.
Para el siguiente ejemplo se buscará la ruta mas corta o el camino de menor longitud que
existe desde a hasta z considerando lo siguiente:
Ejemplo:
Vértice[s] Paso1 Paso2 Paso3 Paso Paso5 Paso6 Paso7 Paso
A [0, a] * * * * * * *
B [16,a] [16,a] [11,c] [11,c] * * * *
C [10,a] [9,d] [9,d] * * * * *
D [5,a] [5,a] * * * * * *
E ---- [20,d] [19,c] [19,c] [18,f] [18,f] [18,f] *
F ---- ---- [21,c] [15,b] [15,b] * * *
G ---- ---- ---- [17,b] [17,b ] [17,b] * *
Z ---- ---- ---- ---- [31,f] [31,f] [23,e] [23,e]
Con este ejemplo encontramos que la ruta mas corta o camino de menor longitud que existe
entre “a” que para este problema es nuestro punto de partida y “z”, nuestro destino final es: {a,
d, c, b, f, e, z}
Leyenda:
Rojo: Aristas y vértices pertenecientes a la solución momentánea.
Azul: Aristas y vértices candidatos.
Paso 1:
En este primer paso, podemos apreciar que hay tres candidatos: Los vértices b, c y d. En este
caso, hacemos el camino desde el vértice a, hasta el vértice d, ya que es el camino más corto
de los tres.
Ahora, vemos que se añade un nuevo candidato, el vértice e, y el vértice c, pero esta vez a
través del d. Pero el camino mínimo surge al añadir el vértice c.
Solución momentánea:
Camino: ADC
Distancia:9
Paso 3:
En este paso se añade como candidato el vértice f. En este caso el camino mínimo hallado es
el siguiente:
Solución momentánea:
Camino: ADCB
Distancia:11
Paso 4
Como podemos comprobar, se han añadido un candidato nuevo, el vértice g, a través del
vértice b. El mínimo camino hallado en todo el grafo hasta ahora es el siguiente:
Solución momentánea:
Camino: ADCBF
Distancia:15
Paso 5
En este antepenúltimo paso, se añaden tres vértices candidatos, los vértices g, z y e. Este
último ya estaba pero en esta ocasión aparece a través del vértice f. En este caso el camino
mínimo, que cambia un poco con respecto al anterior, es:
Solución momentánea:
Camino: ADCBG
Distancia:17
Paso 6:
En el penúltimo paso, vuelve a aparecer otro candidato: el vértice e, pero esta vez a través del
vértice f. De todas formas, el camino mínimo vuelve a cambiar para retomar el camino que
venía siguiendo en los pasos anteriores:
Solución momentánea:
Camino: ADCBFE
Distancia:18
Paso 7:
Por fin, llegamos al último paso, en el que sólo se añade un candidato, el vértice z a través del
e. El camino mínimo y final obtenido es nada más y nada menos k:
Solución Final:
Camino: ADCBFEZ
Distancia:23
ALGORITMO DE FLOYD
El algoritmo de Floyd encuentra el camino mas corto entre todos los vértices de la digráfica.
Se la grafica dirigida G= (V, A) donde cada arco u v, tiene asociado un peso. El algoritmo
de Floyd permitirá encontrar el camino mas corto entre cada par ordenado u y v.
La matriz de distancias sirve como punto de partida para este algoritmo. Se realizan k
iteraciones sobre la matriz buscando el camino mas corto; por lo tanto, en la K-ésima
iteración, M[i, j] tendrá el camino de menor costo para llegar de i a j, pasando por un numero
de vértices menor a k, el cual se calculara según la siguiente expresión:
M k-1 [i, j]
Mk [i, j]mín= M k-1[i, k] + M k-1[k, j]
Se elegirá el camino mas corto entre el valor obtenido en la iteración (k – 1) y el que resulta de
pasar por el vértice k. En el algoritmo se usa la matriz de costos, M, donde M[i, j] será igual al
costo de ir de i a j, a un valor muy grande (infinito) sino existe camino de i a j, o a cero si i = j.
Ejemplo:
• C: matriz de costos.
• Eficiencia: O(n3)
A←C
for k=1 to n
for i=1 to n
for j=1 to n
A[i,j] ← min(A[i,j],A[i,k]+A[k,j])
K
I J
Otro ejemplo de este algoritmo aplicando una tabla de matrices puede ser la siguiente:
4 6 d
b
2
a 3 3
6
11 e
a) c
5 b)
a b c d e a b c d e
a a
0 4 11 --- --- 0 4 11 10 6
b b
--- 0 --- 6 2 --- 0 --- 6 2
c c
--- 3 0 6 --- --- 3 0 6 5
d d
--- --- --- 0 --- --- --- --- 0 -
e e --
--- --- 5 3 0
--- --- 5 3 0
--- --- 5 3 0
--- --- 5 3 0
Usando “a” como vértice de
Usando “b” como vértice de pivote o
pivote o vértice intermedio:
vértice intermedio.
Estado inicial del algoritmo,
En este paso ya “a” puede llegar a
matríz de adyacencias.
“d ” por medio del pivote “b” (con
distancia igual a 10)
También “a” alcanza llegar a “e”
Usando “b” como vértice de pivote o
vértice intermedio: por medio de “b” (con distancia
igual a 6).
Se logra encontrar el camino de
Por ultimo “c” alcanza llegar a “e”
“a” a “d”(con distancia igual a 10).
También se encuentra el camino por medio del pivote “b” (con
de “a” a “e”, (con distancia igual a distancia igual a 5)
6.
Lo mismo sucede de “c” a “e”,
(con distancia igual a 5)
c)
d)
a b c d e a b c d e
a a 0 4 11 10 6
0 4 11 10 6
b b --- 0 --- 6 2
--- 0 --- 6 2
c c --- 3 0 6 5
--- 3 0 6 5
d d --- --- --- 0 ---
--- --- --- 0 ---
e e --- 8 5 3 0
--- 8 5 3 0
Usando “c” como vértice de pivote o Usando “d” como vértice de pivote o
--- --- 5 3 0
--- ---
vértice intermedio: 5 3 0 vértice intermedio:
a
0 4 11 9 6
b
--- 0 7 5 2
c
--- 3 0 6 5
d
--- --- --- 0 ---
e
--- 8 5 3 0
El estado final de matriz almacena las distancias mínimas entre cada uno de los vértices de la
digráfica dada.
Si además de obtener la menor distancia entre todos los vértices de la grafica dirigida se
requiere conocer la trayectoria encontrada para cada vértice, se deberá ir guardando dicha
trayectoria ---vertices intermedios---. Esta variante del algoritmo de Floyd utiliza un arreglo
auxiliar (T) de N X N elementos, donde T[i, j] será igual a k si k es un nodo intermedio entre i y
j.
Ejemplo #2:
a b c d e a b c d e a b c d e
a * * * b b a * * * b b
a * * * * *
b * * * * * b * * * * *
b * * * * *
c * * * * B c * * * * b
c * * * * * d * * * * * d * * * * *
d * * * * * e * * * * * e * c * * *
e * * * * *
a) b) c)
a b c d e a b c d e
a * * * b b a * * * e b
b * * * * * b * * e e *
c * * * * b c * * * * b
d * * * * * d * * * * *
e e * c * * *
* c * * *
d) e)
ALGORITMO DE WARSHALL
El algoritmo de Warshall encuentra, si es posible un camino entre cada uno de los vértices de
la grafica dirigida. Es decir, la solución encontrada por el algoritmo no presenta las distancias
entre los vértices, solo muestra si hay un camino o no entre ellos.
Ejemplo: Este ejemplo del algoritmo de Warshall es usado con el mismo grafo
empleado para el algoritmo de Floyd.
a b c d e a b c d e
a 0 1 1 0 0 a 0 1 1 1 1
b 0 0 0 1 1 b 0 0 0 1 1
c 0 1 0 1 0 c 0 1 0 1 1
d 0 0 0 0 0 d 0 0 0 0 0
e 0 0 1 1 0 e 0 0 1 1 0
a) 5 b)
--- --- 3 0 --- --- 5 3 0
a b c d e a b c d e
a a 1 1 1 1 1
0 1 1 1
1 b 0 1 1 1 1
b
0 0 0 1 c 0 1 1 1 1
c
1
d d 0 0 0 0 0
0 1 0 1
e 1 e 0 1 1 1 1
0 0 0 0
0
--- --- 5e) 3 0
c)
0 1 1 1
1
--- --- 5 3