You are on page 1of 19

Introduccin

Grafos en general

El origen de la palabra grafo es griego y su significado etimolgico es "trazar".
aparece con gran frecuencia como respuesta a problemas de la vida cotidiana, algunos
ejemplos podran ser los siguientes:un grfico de una serie de tareas a realizar indicando
su secuenciacin (un organigrama), grafos matemticos que representan las relaciones
binarias, una red de carreteras, la red de enlaces ferroviarios o areos o la red elctrica
de una ciudad, (ver la figura 1). En cada caso es conveniente representar grficamente el
problema dibujando un grafo como un conjunto de puntos (nodos o vrtices) con lneas
conectndolos (arcos).



De aqu se podra deducir que un grafo es bsicamente un objeto geomtrico
aunque en realidad sea un objeto combinatorio, es decir,un conjunto de puntos y un
conjunto de lneas tomado de entre el conjunto de lneas que une cada par de vrtices.
Por otro lado, debido a su generalidad y a la gran diversidad de formas que pueden
usarse, resulta complejo tratar con todas las ideas relacionadas con un grafo.

Para facilitar el estudio de este tipo de dato, a continuacin se realizar un
estudio de la teora de grafos desde el punto de vista de las ciencias de la computacin,
considerando que dicha teora es compleja y amplia,aqu slo se realizar una
introduccin a la misma, describindose el grafo como un tipo de dato y mostrndose
los problemas tpicos y los algoritmos que permiten solucionarlos usando un ordenador.

Los grafos son estructuras de datos no lineales que tienen una naturaleza
generalmente dinmica, u estudio podra dividirse en dos grandes bloques; grafos
dirigidos y grafos no dirigidos (pueden ser considerados un caso particular de los
anteriores).

Un ejemplo de grafo dirigido lo constituye la red de aguas de una ciudad ya que
cada tubera slo admite que el agua la recorra en un nico sentido, por el contrario, la
red de carreteras de un pas representa en general un grafo no dirigido, puesto que una
misma carretera puede ser recorrida en ambos sentidos. No obstante, podemos dar unas
definiciones generales para ambos tipos.

A continuacin daremos definiciones de los dos tipos de grafos y de los
conceptos que llevan asociados.
Notacin y conceptos

Un grafo G es un conjunto en el que hay definida una relacin binaria,es decir,
G=(V,A) tal que V es un conjunto de objetos a los que denominaremos vrtices o nodos
y
A _ V x V es una relacin binaria a cuyos elementos denominaremos arcos o aristas.

Dados x, y e V, puede ocurrir que:

(x, y) e A, en cuyo caso diremos que x e y estn unidos mediante un arco y,

(x, y) e A, en cuyo caso diremos que no lo estn.

Si las aristas tienen asociada una direccin(las aristas (x,y) y (y,x) no son
equivalentes) diremos que el grafo es dirigido,en otro caso ((x,y)=(y,x)) diremos que el
grafo es no dirigido.




Veamos algunos conceptos sobre grafos:

- Diremos que un grafo es completo si A=VxV,o sea,si para cualquier pareja de
vrtices existe una arista que los une(en ambos sentidos si el grafo es no dirigido).El
nmero de aristas ser:

Para grafos dirigidos:

Para grafos no dirigidos:

donde n=|V| .

- Un grafo dirigido es simtrico si para toda arista (x, y) e A tambin aparece la
arista (y, x) e A y es antisimtrico si dada una arista (x, y) e A implica que (y, x)
e A.

- Tanto a las aristas como a los vrtices les puede ser asociada informacin, a esta
informacin se le llama etiqueta, si la etiqueta que se asocia es un nmero se le
llama peso,costo o longitud, un grafo cuyas aristas o vrtices tienen pesos asociados
recibe el nombre de grafo etiquetado o ponderado.

- El nmero de elementos de V se denomina orden del grafo, un grafo nulo es un
grafo de orden cero.

- Se dice que un vrtice x es incidente a un vrtice y si existe un arco que vaya de x a
y ((x, y) e A),a x se le denomina origen del arco y a y extremo del mismo, de igual
forma se dir que y es adyacente a x, en el caso de que el grafo sea no dirigido si x
es adyacente (resp. incidente) a y entonces y tambin es adyacente (resp. incidente) a
x.

- Se dice que dos arcos son adyacentes cuando tienen un vrtice comn que es a la
vez origen de uno y extremo del otro.

- Se denomina camino (algunos autores lo llaman cadena si se trata de un grafo no
dirigido)en un grafo dirigido a una sucesin de arcos adyacentes:
C={(v
1
,v
2
),(v
2
,v
3
),...,(v
n-1
,v
n
), v
i
e V}.

- La longitud del camino es el nmero de arcos que comprende y en el caso en el
que el grafo sea ponderado se calcular como la suma de los pesos de las aristas que
lo constituyen.

- Un camino se dice simple cuando todos sus arcos son distintos y se dice elemental
cuando no utiliza un mismo vrtice dos veces.Por tanto todo camino elemental es
simple y el recproco no es cierto.

- Un camino se dice Euleriano si es simple y adems contiene a todos los arcos del
grafo.

- Un circuito (o ciclo para grafos no dirigidos) es un camino en el que coinciden los
vrtices inicial y final, un circuito se dice simple cuando todos los arcos que lo
forman son distintos y se dice elemental cuando todos los vrtices por los que pasa
son distintos. La longitud de un circuito es el nmero de arcos que lo componen. Un
bucle es un circuito de longitud 1 (estn permitidos los arcos de la forma (i,i) y
notemos que un grafo antisimtrico carecera de ellos).

- Un circuito elemental que incluye a todos los vrtices de un grafo lo llamaremos
circuito Hamiltoniano.

- Un grafo se denomina simple si no tiene bucles y no existe ms que un camino para
unir dos nodos.

- Diremos que un grafo no dirigido es bipartido si el conjunto de sus vrtices puede
ser dividido en dos subconjuntos (disjuntos) de tal forma que cualquiera de las
aristas que componen el grafo tiene cada uno de sus extremos en un subconjunto
distinto, un grafo no dirigido ser bipartido si y slo si no contiene ciclos con un
nmero de aristas par.

- Dado un grafo G=(V,A),diremos que G
'
=(V,A
'
) con A
'
c A es un grafo parcial de
G y un subgrafo de G es todo grafo G
'
=(V
'
,A
'
) con V
'
_ V y A
'
_ A donde A
'
ser el
conjunto de todas aquellas aristas que unan en el grafo G dos vrtices que estn en
V
'
., se podran combinar ambas definiciones dando lugar a lo que llamaremos
subgrafo parcial .



- Se denomina grado de entrada de un vrtice x al nmero de arcos incidentes en l,
se denota o
e
(x).

- Se denomina grado de salida de un vrtice x al nmero de arcos adyacentes a l, se
denota o
s
(x).

- Para grafos no dirigidos tanto el grado de entrada como el de salida coinciden y
hablamos entonces de grado y lo notamos por o (x).

- A todo grafo no dirigido se puede asociar un grafo denominado dual construido de
la siguiente forma:

G (V, A) ------> G
'
(V
'
, A
'
)

donde A' est construido de la siguiente forma: si e
1
,e
2
e a A son adyacentes --> (e
1
,e
2
)
e a A' con e
1
,e
2
e a V', en definitiva, para construir un grafo dual se cambian vrtices
por aristas y viceversa.



- Dado un grafo G, diremos que dos vrtices estn conectados si entre ambos existe
un camino que los une.

- Llamaremos componente conexa a un conjunto de vrtices de un grafo tal que
entre cada par de vrtices hay al menos un camino y si se aade algn otro vrtice
esta condicin deja de verificarse. Matemticamente se puede ver como que la
conexin es una relacin de equivalencia que descompone a V en clases de
equivalencia,cada uno de los subgrafos a los que da lugar cada una de esas clases de
equivalencia constituira una componente conexa. Un grafo diremos que es conexo
si slo existe una componente conexa que coincide con todo el grafo.
Bsqueda de caminos mnimos en grafos

Supongamos que tenemos un grafo dirigido sencillo etiquetado G = {V, A} de
grado n, V = {1,..., n} y con etiquetas en los arcos no negativas.

Entre un vrtice y todos los dems vrtices del grafo

Nos planteamos el problema de dado un vrtice determinar el camino de costo
mnimo de ese vrtice a todos los dems vrtices de V.

Para resolver el problema aplicaremos un algoritmo debido a Dijkstra que
esencialmente era a partir de un conjunto S de vrtices (S c V) cuya distancia ms corta
desde el origen es conocida y en cada paso se agrega un nuevo vrtice v a S cuya
distancia a su vez desde el origen sea la ms corta posible. Si la suposicin que
hacamos de que las etiquetas son siempre no negativas se cumple, puede comprobarse
que siempre es posible encontrar un camino ms corto desde el origen y un vrtice v que
slo pase a travs de los vrtices de S (camino "inherente"). Si se utiliza adems un
vector D donde se almacena las longitudes de los caminos inherentes ms cortos a cada
vrtice, una vez que S incluya a todos los vrtices, todos los caminos son inherentes de
forma que D contendr la distancia ms corta del origen a cada vrtice.

Notacin:

- Origen = vrtice 1 (obviamente esto no es una condicin)

- Sea S un vector de n componentes representando el conjunto de vrtices cuya
distancia ms corta desde el origen ya es conocida.

- D es un vector de n componentes donde D [i] indica en cada paso la distancia ms
corta entre el origen y el vrtice i:

a. bien mediante el camino directo si existe el arco (i,j).

b. bien a travs de los vrtices de S (de los que se conoce su distancia ms corta
al origen),

Al final D contendr el costo del camino mnimo entre el origen y cada vrtice.

- C es la matriz de costos del grafo. C [1,i] representa el costo del arco (1,i). Si el arco
no existe, se le asigna un valor fuera de rango ()

- P es un vector de dimensin n a travs del cual reconstruiremos el camino ms corto
del origen al resto de los vrtices. As P[i] contiene el vrtice inmediato anterior a i
en el camino ms corto.

Inicialmente es evidente que S = {1} y i D[i] = C[1 i] con P[i] = 1
Con estas premisas el algoritmo de Dijkstra se puede esquematizar as:

Algoritmo Dijkstra()

1. S = {1}

2. for (i = 2; i<=n; i++ )
{
D[i] = C[I,i]
P[i] = 1
}

3. while ( S = V )
{
elegir w e V-S / D[w] sea mnimo
S= S U{w}
for (cada vrtice v e V -S)
if (D[v] > D[w] + C[w, v])
{
D[v] = D[w] + C[w, v]
P[v] = w
}
}

Veamos un ejemplo del algoritmo, supongamos que queremos encontrar los
caminos mnimos del vrtice 1 al resto en el grafo siguiente:





En principio:

- S= {1}

- D [2] = 60; D [3] = 10; D [4] = 100; D [5] =

- P[i] = 1 i

Iteraci6n 1:

V -S = {2,3,4,5} w = 3 -> S = {1,3} -> V -S = {2,4,5}

D [2] = min(D [2] , D [3] + C [3,2]) = min(60, 50) = 50 -> P [2] = 3

D [4] = min(D [4] , D [3] + C [3,4]) = min(100, 40) = 40 -> P [4] = 3

D [5] = min(D [5] , D [3] + C [3,5]) = min (,) =

As D [2] = 50; D [4] = 40; D [5] = 00; P [2] = 3; P [4] = 3; P [5] = 1

Iteraci6n 2:

V -S = {2,4,5} w = 4 -> S = {1,3,4} -> V- S = {2,5}

D [2] = min(D [2] , D [4] + C [4,2]) = min(50, 00) = 50 -> P [2] = 3

D [5] = min(D [5] , D [4] + C [4,5]) = min( 00,60) = 60 -> P [5] = 4

As D [2] = 50; D [5] = 60; p [2] = 3; P [5] = 4

Iteraci6n 3:

V -S = {2,5} w = 2 -> S = {1,3,4,2} -> V- S = {5}

D [5] = min(D [5] , D[2] + C [2,5]) = min(60, 55) = 55 -> P [5] = 2

As D [5] = 55; P[5] = 2

Finalmente w = 5 -> S = {1,3,4,2,5} -> FIN DEL ALGORlTMO


Para reconstruir el camino ms corto del origen a cada vrtice, se asignan los
predecesores en orden inverso. Por ejemplo, si se quiere conocer el camino desde el
origen al vrtice S, se ,tiene que:

P [5] = 2-+ P [2] = 3-+ P [3] = 1 siendo por tanto el camino (1,3,2,5) con costo 55 .

Aunque la implementacin de este algoritmo es simple si la realizamos en base a
una matriz de adyacencia, en la prctica se utiliza normalmente una implementacin en
base a listas de adyacencia. La razn de esta eleccin es que en la primera la eficiencia
es O(n
2
) para cualquier grafo; sin embargo la mayora de los grafos que nos
encontramos en la prctica tiene un nmero de aristas bastante pequeo (grafos que
podemos denominar dispersos o no densos ) y por tanto el uso de listas de adyacencia se
presenta como una solucin ms eficiente. Para conseguir una mejor eficiencia en esta
implementacin del algoritmo de Dijkstra se ha echado mano de una estructura de datos
formada por un APO que tiene como etiqueta los vrtices del grafo y como clave el
coste de ir desde el vrtice inicial en el problema a ese vrtice de tal forma que obtener
el vrtice con mnimo coste sera O(log n).
Entre cada par de vrtices del grafo

En lugar de buscar los caminos mnimos de un vrtice a los dems nos podemos
plantear buscar el camino ms corto entre cualquier pareja de vrtices, es decir, dado un
grafo dirigido etiquetado G = {V, A} en el que las etiquetas son no negativas encontrar
el camino de longitud " ms corta entre dos vrtices cualesquiera de ese grafo.

Podra pensarse, para resolver el problema, en aplicar el algoritmo de Dijkstra n
veces, una por vrtice, pero en lugar de eso, aplicaremos un nuevo algoritmo creado por
Floyd que va encontrando los caminos de forma iterativa.

Notacin:

- V = {1, ..., n} conjunto de vrtices.

- A es una matriz de tamao n x n en la que se calcular en cada A
ij
la longitud ms
corta del camino que va de i a j.

- P es una matriz de tamao n x n que utilizaremos para recuperar los caminos ms
cortos.

- C es una matriz de dimensin n x n conteniendo los costos de los arcos. Si no existe
arco de un
vrtice i a otro j el correspondiente valor C [i,j] = .

Inicialmente A [i,j] = { C[i,j] si i = j, 0 si i = j }.

A continuacin se itera sobre A n veces de forma que tras hacer la k iteracin
A[i,j] tiene un valor correspondiente a la longitud ms pequea de cualquier camino de i
a j que no pase por un vrtice de ndice mayor que k, es decir, cualquier vrtice
intermedio entre i y j (extremos del camino) ha de ser menor o igual que k. Por tanto en
cada iteracin k se usar la siguiente frmula:

A
k
[i,j] = min(A
k-1
[i,j] ,A
k-1
[i,k] +A
k-1
l [k,j])
3
es decir, cada A
k
[i,j] se obtiene
comparando A
k-1
[i,j], el coste de ir de i a j sin pasar por k o cualquier vrtice de ndice
mayor, con A
k-1
[i,k] +A
k-1
[k,j], el costo de ir primero de i a k y despus de k a j sin
pasar por un vrtice de ndice mayor que k de forma que si el paso por el vrtice k
produce un camino i ms corto que el indicado por A
k-1
[i,j], se elige ese coste para A
k

[i,j] .As mismo, cada iteracin P [i,j] contendr el vrtice k que permiti al algoritmo
de Floyd encontrar el valor ms pequeo de A[i, j] .Inicialmente P[i,j] = 0, puesto que
inicialmente el camino ms corto de i a j es el propio arco.

El algoritmo sera el siguiente:

Algoritmo Floyd()

1. for (i = 1; i <= n; i++ )
for (j = 1; j <=n ; j++)
{
A[i, j]= C[i, j]
P[i, j]= 0
}

2. for (i = 1; i <= n; i++)
A[i, i]= 0

3. for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
for (j = l; j <=n ; j++)
if ((i = j) && (A[i,k]+A[k,j] < A[i, j]))
{
A[i, j]= A[i, k]+A[k, j]
P[i, j]= k
}

Veamos un ejemplo con el siguiente grafo:







A
0
= P
0

=






A
1
= P
1

=






A
2
= P
2

=






A
3
= P
3
=
0 7 * 5 *
0 2 * 6
5 * 0 * *
* 3 0 *
* 7 * 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 7 * 5 *
0 2 * 6
5 [12] 0 10 *
* 3 0 *
* 7 * 0
0 0 0 0 0
0 0 0 0 0
0 [1] 0 [1] 0
0 0 0 0 0
0 0 0 0 0
0 7 [9] 5 [13]
0 2 * 6
5 12 0 10 [18]
* 3 0 *
* 7 * 0
0 0 [2] 0 2
0 0 0 0 0
0 1 0 1 [2]
0 0 0 0 0
0 0 0 0 0
0 7 9 5 13
[7] 0 2 [12] 6
5 12 0 10 18





A
4
= P
4

=





A
5
= P
5

=

A
5
=A
4
con la
que el algoritmo
termina. Con objeto de recuperar los caminos de
cualquier vrtice i a cualquier otro j puede usarse el siguiente procedimiento:

Algoritmo recuperar_camino (i, j de tipo vrtice)

1.k= P[i, j]

2. if (k = 0)
{
recuperar_camino (i, k)
escribir (k)
recuperar_camino (k, j)


[8] [15] 3 0 [21]
[12] [19] 7 [17] 0
0 0 2 0 2
3 0 0 3 0
0 1 0 1 2
[3] [3] 0 0 [3]
[3] [3] 0 [3] 0
0 7 [8] 5 13
7 0 2 12 6
5 12 0 10 18
8 15 3 0 21
12 19 7 17 0
0 0 [4] 0 2
3 0 0 3 0
0 1 0 1 2
3 3 0 0 3
3 3 0 3 0
0 7 8 5 13
7 0 2 12 6
5 12 0 10 18
8 15 3 0 21
12 19 7 17 0
0 0 4 0 2
3 0 0 3 0
0 1 0 1 2
3 3 0 0 3
3 3 0 3 0

You might also like