al vrtice que ocupa una determinada columna. Y en la segunda
almacenamos el vrtice padre del vrtice que ocupa la columna, que en cada
iteracin ser V
i
, a partir del cual se reconstruir el camino mnimo.
Una vez que tenemos claro la informacin que contiene dicha tabla
podemos rellenarla siguiendo los siguientes pasos.
La primera fila tiene de la tabla se inicializa por defecto con la tupla
(, -1). El -1 indica que el vrtice de la columna an no tiene asignado ningn
padre.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 48 de 210
Recio Domnguez Daniel
En cada iteracin se rellena una fila, siguiendo los siguientes pasos:
1.- Buscamos los vrtices adyacentes al vrtice V
i
y en la columna
correspondiente al adyacente.
Si la distancia total recorrida hasta el momento ms la distancia entre
V
i
y el adyacente es menor o igual que la ya recorrida entonces
actualizamos la tupla con la nueva distancia y vrtice padre.
Es importante actualizar la tabla si la distancia es igual ya que as
conseguiremos obtener varias rutas mnimas entre el vrtice origen y destino.
2.- A continuacin tomamos como nuevo vrtice V
i
, el vrtice
correspondiente a la columna cuya distancia es mnima. Una vez escogido el
vrtice cuya distancia es mnima la columna queda cerrada, es decir no vuelve
a considerarse para rellenar el resto de la tabla.
Una vez que tenemos rellenada la tabla reconstruir el camino mnimo a
partir de la misma es bastante fcil. Se ha optado por reconstruir el camino
desde el vrtice destino al vrtice origen, por lo que el primer vrtice que forma
parte del camino parcialmente construido es el vrtice destino.
Acto seguido nos situamos en la primera posicin distinta de * de la
columna correspondiente al vrtice destino comenzando por la parte inferior de
la tabla y el vrtice padre es el siguiente que forma parte del camino. La
longitud del camino viene determinada por la distancia almacenada en dicha
posicin.
Ahora nos situamos en la columna del vrtice padre y repetimos el
proceso anterior hasta llegar al vrtice origen. En ese momento tendremos el
camino mnimo completo.
Para que la exposicin del algoritmo quede totalmente clara
expondremos algunos ejemplos.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 49 de 210
Recio Domnguez Daniel
Ejemplo 1
Aplicamos el algoritmo de Dijkstra para encontrar el camino mnimo
entre el vrtice v
1
y v
8
obteniendo la siguiente tabla.
V
1
(v
2
,P(v
2
)) (v
3
,P(v
3
)) (v
4
,P(v
4
)) (v
5
,P(v
5
)) (V
6
,P(v
6
)) (v
7
,P(v
7
)) (v
8
,P(v
8
)) m V
i
(0,NP) (,NP) (,NP) (,NP) (,NP) (,NP) (,NP) (,NP) 0 V
1
* (2,v
1
) (3,v
1
) (,NP) (,NP) (,NP) (,NP) (,NP) 2 V
2
* * (3,v
1
) (3,v
2
) (3,v
2
) (,NP) (,NP) (,NP) 3 V
3
* * * (3,v
2
) (3,v
2
) (,NP) (6,v
3
) (,NP) 3 V
4
* * * * (3,v
2
) (4,v
4
) (6,v
3
) (,NP) 3 V
5
* * * * * (4,v
5
) (6,v
3
) (,NP) 4 V
6
* * * * * * (6,v
3
) (8,v
6
) 6 V
7
* * * * * * * (8,v
7
) 8 V
8
A continuacin reconstruiremos el camino desde el vrtice v
1
a vrtice v
8
comenzando por este ltimo.
Para ir desde el vrtice v
8
al vrtice v
1
es necesario pasar por el padre
de v
8
. El camino construido hasta el momento es v
8
v
7
... v
1
.
Seguidamente miraramos quien es el padre del ltimo vrtice que forma
parte del camino parcialmente construido, en este caso es v
3
y as
sucesivamente.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 50 de 210
Recio Domnguez Daniel
El camino completo es:
v
8
{P(v
8
)} v
7
{P(v
7
)}
v
3
{P(v
3
)}
v
1
{P(v
1
)}.
Camino mnimo: v
1
v
3
v
7
v
8
. La longitud del camino es 8.
Podemos observar en la columna del vrtice de destino que existen dos
tuplas con padres distintos e igual distancia lo cual no ndica que existe ms de
un camino mnimo.
Reconstruccin del segundo camino:
v
8
{P(v
8
)} v
6
{P(v
6
)}
v
5
{P(v
5
)}
v
2
{P(v
2
)} v
1
{P(v
1
)}.
Camino mnimo: v
1
v
2
v
5
v
6
v
8
. La longitud del camino es 8.
Podemos observar que en la columna correspondiente al vrtice V
6
existen dos tuplas con padres distintos y misma distancia por lo que existe otro
camino mnimo ms.
Reconstruccin del tercer camino:
v
8
{P(v
8
)} v
6
{P(v
6
)}
v
4
{P(v
4
)}
v
2
{P(v
2
)} v
1
{P(v
1
)}.
Camino mnimo: v
1
v
2
v
4
v
6
v
8
. La longitud del camino es 8.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 51 de 210
Recio Domnguez Daniel
Ejemplo 2
Aplicamos el algoritmo de Dijkstra para encontrar el camino mnimo
entre el vrtice v
1
y v
4
obteniendo la siguiente tabla.
V
1
(v
2
,P(v
2
)) (v
3
,P(v
3
)) (v
4
,P(v
4
)) (v
5
,P(v
5
)) m V
i
(0,NP) (,NP) (,NP) (,NP) (,NP) 0 V
1
* (5,v1) (4,v1) (,NP) (,NP) 4 V
3
* (5,v1) * (12,v3) (6,v3) 5 V
2
* * * (7,v2) (6,v3) 6 V
5
* * * (7,v5) * 7 V
4
Recontraccin del primer camino mnimo desde el vrtice v
1
a v
4
.
V
4
{P(v
4
)} v
5
{P(v
5
)}
v
3
{P(v
3
)}
v
1
{P(v
1
)}.
Camino mnimo: v
1
v
3
v
5
v
4
. La longitud del camino es 7.
Recontraccin del segundo camino mnimo desde el vrtice v
1
a v
4
.
V
4
{P(v
4
)} v
2
{P(v
2
)}
v
1
{P(v
1
)}.
Camino mnimo: v
1
v
2
v
4
. La longitud del camino es 7.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 52 de 210
Recio Domnguez Daniel
Ejemplo3
Aplicamos el algoritmo de Dijkstra para encontrar el camino
mnimo entre el vrtice v
1
y v
4
obteniendo la siguiente tabla.
V
1
(v
2
,P(v
2
)) (v
3
,P(v
3
)) (v
4
,P(v
4
)) (v
5
,P(v
5
)) m V
i
(0,NP) (,NP) (,NP) (,NP) (,NP) 0 V
1
* (1,v1) (,NP) (,NP) (,NP) 1 V
2
* * (4,v2) (,NP) (,NP) 4 V
3
* * * (,NP) (,NP)
* * * * *
En este caso observamos que el vrtice destino no tiene padre asignado, lo
cual nos indica que el grafo no es conexo, por lo que no existe ningn camino
entre el vrtice origen y destino.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 53 de 210
Recio Domnguez Daniel
Algoritmo de Floyd.
El algoritmo de Floyd calcula el camino mnimo entre todos los pares de
vrtices del grafo ponderado y no negativo mediante tcnicas de programacin
dinmica.
Para ello calcularemos una serie de matrices D
k
[i,j] que debe cumplir:
Donde D
k
[i, j] = mnimo(D
k-1
[i,k] + D
k-1
[k,j]), D[i][j]). Longitud del camino ms
corto para ir desde el vrtice i al vrtice j pudiendo pasar por los vrtices
1,2,..., hasta k.
Bsicamente la expresin anterior nos dice: si para ir desde el vrtice i al j
mejoramos pasando por el vrtice k, este se aade al camino.
Adems para reconstruir el camino se hace uso de una matriz de trayectorias
donde en cada iteracin si se mejora el camino desde el vrtice i al vrtice j
pasado por k, este se anota en la matriz de trayectorias.
El algoritmo de Floyd quedara:
Func floyd (ady: Array[1..n,1..n] de entero) dev(D: Array[1..n,1..n] de entero, p:
Array[1..n,1..n] de entero )
var
i,j,k: Entero
prin
desde i=1 hasta n
desde j=1 hasta n
desde k=1 hasta n
si k <> i y k<>j
si D[i,j] > D[i,k] + D[k,j]
D[i, j] := D[i,k] + D[k,j]
P[i,j] := k // Vrtice de paso.
fsi
fsi
fdesde
fdesde
fdesde
D
k
-1[i, k]+ D
k-1
[k, j] (pasando por k).
D
k-1
[i, j] (no pasando por k).
D
k
[i, j] =
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 54 de 210
Recio Domnguez Daniel
fin
A continuacin veremos un ejemplo con ms detalle:
Ejemplo1
Calcularemos la sucesin de matrices D
k
. Sea M[i,j] la matriz de
adyacencias del grafo.
M [j, j] =
Primera iteracin
D
1
representa el camino ms corto para ir desde vrtice i al vrtice j
pudiendo pasar nicamente por el vrtice 1.
D
1
= P[i,j] =
V
1
V
2
V
3
V
4
V
1
0 5
V
2
50 0 15 5
V
3
30 0 15
V
4
15 5 0
V
1
V
2
V
3
V
4
V
1
0 5
V
2
50 0 15 5
V
3
30 35 0 15
V
4
15 20 5 0
V
1
V
2
V
3
V
4
V
1
0 0 0 0
V
2
0 0 0 0
V
3
0 1 0 0
V
4
0 1 0 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 55 de 210
Recio Domnguez Daniel
D
2
representa el camino ms corto para ir desde vrtice i al vrtice j
pudiendo pasar nicamente por el vrtice 1 y 2.
D
2
= P[i,j] =
D
3
representa el camino ms corto para ir desde vrtice i al vrtice j
pudiendo pasar nicamente por el vrtice 1, 2 y 3.
D
3
= P[i,j] =
D
4
representa el camino ms corto para ir desde vrtice i al vrtice j
pudiendo pasar nicamente por el vrtice 1, 2, 3 y 4. En la ltima etapa se
consideran todos los vrtices del grafo.
D
4
= P[i,j] =
Cmo se reconstruye el camino?.
Para ir desde un vrtice v
i
a un vrtice v
j
consultamos la posicin P[i,j] de
la matriz de trayectorias:
Si es 0 puede darse dos situaciones, que exista camino directo para ir
desde el vrtice i al j o que no exista camino entre ambos vrtices.
V
1
V
2
V
3
V
4
V
1
0 5 20 10
V
2
50 0 15 5
V
3
30 35 0 15
V
4
15 20 5 0
V
1
V
2
V
3
V
4
V
1
0 0 2 2
V
2
0 0 0 0
V
3
0 1 0 0
V
4
0 1 0 0
V
1
V
2
V
3
V
4
V
1
0 5 20 10
V
2
45 0 15 5
V
3
30 35 0 15
V
4
15 20 5 0
V
1
V
2
V
3
V
4
V
1
0 0 2 2
V
2
3 0 0 0
V
3
0 1 0 0
V
4
0 1 0 0
V
1
V
2
V
3
V
4
V
1
0 5 15 10
V
2
20 0 10 5
V
3
30 35 0 15
V
4
15 20 5 0
V
1
V
2
V
3
V
4
V
1
0 0 4 2
V
2
4 0 4 0
V
3
0 1 0 0
V
4
0 1 0 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 56 de 210
Recio Domnguez Daniel
Si existe camino la posicin P[i ,j] nos dice el vrtice k por el que hay
que pasar del para ir del vrtice i al vrtice j.
Seguidamente habr que reconstruir el camino para ir desde el vrtice i
al vrtice k y del vrtice k al vrtice j, para lo cual visitamos las posiciones
P[i, k] y P[k, j] respectivamente.
Este proceso se repite hasta completar el camino.
Reconstruccin del camino mnimo para ir desde el vrtice v
2
al vrtice v
3.
P[2,3] = 4 por lo que para ir de v
2
a v
3
es necesario pasar por el vrtice 4.
P[4,3] = 0 existe camino directo.
Camino mnimo: v
2
v
4
v
3
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 57 de 210
Recio Domnguez Daniel
3.2.- Algoritmos de distancias.
Excentricidad de un vrtice.
La excentricidad de un vrtice v de un grafo G es la distancia de v al
vrtice ms alejado de l, es decir, se trata de la mayor longitud del camino
ms corto entre el vrtice y cualquier otro.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Calculamos Dijsktra desde el vrtice v a resto de vrtices del grafo.
2.- Finalmente de todos los caminos mnimos obtenidos tomamos la
longitud mayor.
Seguidamente veremos un ejemplo.
Para el grafo de la figura calcularemos la excentricidad del vrtice v
1
.
Distancia mnima Valor camino mnimo
dist
min
(v
1
, v
2
) 5
dist
min
(v
1
, v
3
) 4
dist
min
(v
1
, v
4
) 7
dist
min
(v
1
, v
5
) 6
La excentricidad es 7.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 58 de 210
Recio Domnguez Daniel
Radio de un grafo.
El radio de un grafo G es la excentricidad ms pequea de cualquiera de
sus vrtices.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Para cada vrtice obtenemos la excentricidad.
2.- Obtener la excentricidad ms pequea.
Veamos un ejemplo.
Para el grafo de la figura calcularemos el radio.
Distancia mnima Valor camino mnimo
dist
min
(v
1
, v
2
) 5
dist
min
(v
1
, v
3
) 4
dist
min
(v
1
, v
4
) 7
dist
min
(v
1
, v
5
) 6
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 59 de 210
Recio Domnguez Daniel
Distancia mnima Valor camino mnimo
dist
min
(v
2
, v
1
) 5
dist
min
(v
2
, v
3
) 5
dist
min
(v
2
, v
4
) 2
dist
min
(v
2
, v
5
) 3
Distancia mnima Valor camino mnimo
dist
min
(v
3
, v
1
) 4
dist
min
(v
3
, v
2
) 5
dist
min
(v
3
, v
4
) 3
dist
min
(v
3
, v
5
) 2
Distancia mnima Valor camino mnimo
dist
min
(v
4
, v
1
) 7
dist
min
(v
4
, v
2
) 2
dist
min
(v
4
, v
3
) 3
dist
min
(v
4
, v
5
) 1
Distancia mnima Valor camino mnimo
dist
min
(v
5
, v
1
) 6
dist
min
(v
5
, v
2
) 3
dist
min
(v
5
, v
3
) 2
dist
min
(v
5
, v
4
) 1
Como sabemos la excentricidad de cada vrtice es la mayor longitud del
camino ms corto. A partir de los clculos realizados con anterioridad podemos
obtener una tabla con la excentricidad de cada vrtice.
Para obtener el radio basta con obtener el mnimo del array.
v
1
v
2
v
3
v
4
v
5
7 5 5 7 6
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 60 de 210
Recio Domnguez Daniel
Dimetro de un grafo.
El dimetro de un grafo G es la mayor distancia existente entre dos
vrtices cualesquiera del grafo, es decir, es la excentricidad ms grande de
cualquiera de sus vrtices.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Para cada vrtice obtenemos la excentricidad.
2.- Obtener la excentricidad mxima.
Veamos un ejemplo:
Para el grafo de la figura obtendremos el dimetro, aprovechado los
clculos anteriores realizados para el radio. El dimetro del grafo es 7.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 61 de 210
Recio Domnguez Daniel
Distancia de un vrtice.
La distancia de un vrtice "v" en un grafo G ponderado o no, es la suma
de las distancias mnimas a todos los vrtices del grafo.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Calcula Dijsktra para todos los vrtices del grafo.
2.- Sumar todas las distancias.
Si entre un vrtice v y otro cualquiera existiera ms de un camino
mnimo solo se tendr en cuenta un de los caminos a la hora sumar las
distancias.
Veamos un ejemplo:
Para el grafo de la figura calcular la distancia del vrtice v
1
y v
5
.
Distancia mnima Valor camino mnimo
dist
min
(v
1
, v
2
) 5
dist
min
(v
1
, v
3
) 4
dist
min
(v
1
, v
4
) 7
dist
min
(v
1
, v
5
) 6
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 62 de 210
Recio Domnguez Daniel
distancia 22
Distancia mnima Valor camino mnimo
dist
min
(v
5
, v
1
) 6
dist
min
(v
5
, v
2
) 3
dist
min
(v
5
, v
3
) 2
dist
min
(v
5
, v
4
) 1
distancia 12
Antes de comentar los algoritmos de la mediana y el centro de un grafo
definiremos el concepto de subgrafo inducido por el conjunto de vrtices del
grafo.
Sea S un conjunto de vrtices no vaci de un grafo G. El subgrafo
inducido por S es el subgrafo maximal de G, con vrtices en el conjunto S.
Las aristas que forman parte del subgrafo inducido son todas las aristas de G
que inciden o unen vrtices de S.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 63 de 210
Recio Domnguez Daniel
Algoritmo de la mediana.
La mediana de un grafo G es el subgrafo inducido por los vrtices que
tienen mnima distancia.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Calcular la distancia de cada vrtice. .
2.- Escoger el subconjunto de vrtices de mnima distancia.
3.- Construir el subgrafo inducido por dicho conjunto de vrtices
obtenidos en el paso 2.
Veamos un ejemplo.
Calcular la mediana en el siguiente grafo.
distancia(V
1
) 22
distancia(v
2
) 15
distancia(v
3
) 14
distancia(v
4
) 13
distancia(v
5
) 12
En este caso la mediana del grafo esta formada por un nico vrtice.
Dicho vrtice es v
5
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 64 de 210
Recio Domnguez Daniel
Algoritmo del centro.
El centro de un grafo G, es el subgrafo inducido por los vrtices que
tienen excentricidad mnima.
Para implementar el algoritmo pueden seguirse los siguientes pasos:
1.- Para cada vrtice calculamos la excentricidad.
2.- Escoger el subconjunto de vrtices de mnima excentricidad.
3.- Construir el subgrafo inducido por dicho conjunto de vrtices
obtenidos en el paso 2.
Veamos un ejemplo
Aprovechamos el clculo de la excentricidad realizado anteriormente.
El subconjunto de vrtices de mnima excentricidad esta formado por los
vrtices v
2
y v
3
.
v
1
v
2
v
3
v
4
v
5
7 5 5 7 6
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 65 de 210
Recio Domnguez Daniel
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 66 de 210
Recio Domnguez Daniel
5.3.- Conectividad.
Algoritmo de componentes conexas.
Se trata de determinar si un grafo dirigido o no, es conexo o no lo es.
Podemos usar la propiedad de que si un grafo es conexo es porque existe
camino entre todo par de vrtices o, lo que es lo mismo, a partir de cualquier
vrtice es posible alcanzar a todos los dems.
Para la implementacin se realiza mediante tcnicas de programacin
dinmica. Se hace uso de un array en la que cada posicin hace referencia a
un vrtice del grafo.
Aquellas posiciones que al finalizar la ejecucin posean el mismo valor
estarn conectadas y formaran parte de la misma componente conexa.
Inicialmente se suponen todos los vrtices desconectados por lo que
todas las posiciones del array tienen un valor distinto.
Seguidamente se itera sobre las aristas o matriz de adyacencias del
grafo, de tal forma que si existe una aritas entre el vrtice correspondiente a la
fila i y columna j se almacena en dos variables la componente mayor y
menor respectivamente.
Acto seguido se itera sobre el array de componente de tal forma que
todas las posiciones donde el valor es igual a la componente mayor se
actualizan con el valor de la componente menor, es decir, a vrtices
conectados se les asigna el mismo valor y se pasa a la siguiente arista
repitiendo dicho proceso.
Tras iterar sobre todas las aristas el array almacena tantos nmeros
distintos como componentes conexas tiene el grafo. Dicha componente conexa
viene determinada por el subgrafo inducido de los vrtices que pertenecen a
dicha componente conexa.
Veamos un ejemplo
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 67 de 210
Recio Domnguez Daniel
v
1
v
2
v
3
v
4
v
5
v
6
Mayor Menor
1 2 3 4 5 6 * *
En principio todos los vrtices estn desconectados.
v
1
v
2
v
3
v
4
v
5
v
6
Mayor Menor
1 2 3 1 5 6 4 1
El vrtice v
1
y v
4
estn conectados.
Actualizada la posicin del vrtice v
4
.
v
1
v
2
v
3
v
4
v
5
v
6
Mayor Menor
1 2 3 1 2 6 5 2
El vrtice v
2
y v
5
estn conectados.
Actualizada la posicin del vrtice v
5
.
v
1
v
2
v
3
v
4
v
5
v
6
Mayor Menor
1 2 3 1 2 3 6 3
El vrtice v
3
y v
6
estn conectados.
Actualizada la posicin del vrtice v
6
.
Como puede apreciarse el grafo posee tres componentes conexas que
son v
1
v
4
, v
2
v
5
y v
3
v
6
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 68 de 210
Recio Domnguez Daniel
Vrtices de corte.
Sea G un grafo y v un vrtice de G. Se dice que v es un vrtice de
corte si al eliminar el vrtice del grafo este es no conexo, es decir, el nmero de
componentes conexas es mayor que uno.
La implementacin del algoritmo consta de los siguientes pasos:
1.- Calculamos las componentes conexas que posee inicialmente el
grafo.
2.- Eliminamos un vrtice del grafo.
3.- En estas condiciones se calculan el nmero de componentes
conexas. Si el nmero de componentes actuales es distinto del nmero de
componentes calculadas inicialmente ms uno, entonces se trata de un vrtice
de corte.
4.- Restauramos el vrtice borrado, as como sus aristas y repetimos el
proceso con el resto de vrtices (ir al paso 2).
Ejemplo
El grafo posee tres vrtices de corte: v
3
, v
4
, v
7
. Basta observar que si
eliminamos algunos de estos vrtices el grafo no es conexo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 69 de 210
Recio Domnguez Daniel
Aristas puente.
Una arista e en un grafo G se dice que es una arista puente si al
eliminar la arista del grafo, este deja de ser conexo.
La implementacin del algoritmo consta de los siguientes pasos:
1.- Calculamos las componentes conexas que posee inicialmente el
grafo.
2.- Eliminamos una arista del grafo.
3.- En estas condiciones se calculan el nmero de componentes
conexas. Si el nmero de componentes actuales es distinto del nmero de
componentes calculadas inicialmente entonces se trata de una arista puente.
4.- Restauramos la arista del grafo y repetimos el proceso para el resto
de aristas del grafo. (Ir al paso 2)
Ejemplo
Las aristas puentes son v
4
v
5
, v
6
v
5
y v
3
v
7
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 70 de 210
Recio Domnguez Daniel
Bloques.
Un bloque B de un grafo G conexo es un subgrafo no separable de G y
mayor con esta propiedad. Los bloques permiten hacer una particin en el
conjunto de las aristas.
Un grafo conexo no trivial sin vrtices de corte recibe el nombre de grafo
no separable.
Un subgrafo G
1
de G es maximal con respecto a una propiedad si no hay
ningn otro subgrafo que tambin posea esa propiedad y que contenga a G.
Algunas propiedades.
a) Si G es no separable G es un bloque.
b) Los bloques permiten hacer una particin del conjunto de las aristas.
c) Cada dos bloques a lo sumo tienen un vrtice en comn y este es un
vrtice de corte.
d) Un bloque con exactamente un vrtice de corte se denomina bloque
final.
e) Un grafo G conexo con al menos un vrtice de corte tiene como
mnimo dos bloques.
f) Una arista puente es considerada un bloque.
El algoritmo para el clculo de bloque consta de 6 pasos:
1.- Calcular los vrtices de corte y aristas puente del grafo.
2.- Eliminar los vrtices de corte del grafo (guardando las aristas).
3.- Calcular las componentes conexas.
4.- Restaurar los vrtices de corte junto con las aristas y eliminar las
aristas puente del grafo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 71 de 210
Recio Domnguez Daniel
5.- Para cada vrtice de corte y aristas de cada componente conexa.
Si G existe una arista formada por el vrtice de corte y el vrtice origen o
destino (o al contrario, es decir, el vrtice origen o destino y el vrtice de corte
en caso de ser un grafo dirigido) de una arista de la componente conexa
actualmente procesada almacenamos la arista formada por el vrtice de corte
en un conjunto S.
Una vez procesadas todas las aristas de la componente conexa actual,
aadimos todas las aristas almacenadas en S, a la componente actual,
obteniendo las aristas de uno de los bloques del grafo.
6.- Finalmente aadimos como bloques todas las aristas puente del
grafo a la vez que las restauramos en el grafo G.
A continuacin veremos un ejemplo para cada tipo de grafo.
Ejemplo para un grafo no dirigido.
PASO 1.
Vrtices de corte {v
5
}.
Aristas puente {v
4
v
5
, v
5
v
6
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 72 de 210
Recio Domnguez Daniel
PASO 2.
Eliminamos el vrtice de corte y guardamos las aristas eliminadas
{v
5
v
6
, v
5
v
4
, v
1
v
5
, v
3
v
5
}.
PASO 3.
Componentes conexas {{v
1
v
2
, v
1
v
3
, v
3
v
2
}, {v
4
}, {v
6
}}.
PASO 4.
Restauramos el nico vrtice de corte v
5
junto con las aristas
eliminadas {v
5
v
6
, v
5
v
4
, v
1
v
5
, v
3
v
5
} y eliminamos las aristas puente.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 73 de 210
Recio Domnguez Daniel
PASO 5.
Comprobamos si en el grafo existe alguna arista formada por v
5
y
algn vrtice de las aristas de la componente conexa. Este proceso se
realiza para cada una de las componentes conexas.
Componentes conexas {{v
1
v
2
, v
1
v
3
, v
3
v
2
}, {v
4
}, {v
6
}}.
Primera componente conexa {v
1
v
2
, v
1
v
3
, v
3
v
2
}.
Conjunto de aristas encontradas {v
5
v
1
, v
5
v
3
}.
Aadimos las aristas encontradas a la lista de aristas de la
primera componente conexa obteniendo las aristas del primer bloque.
Bloque 1 {v
1
v
2
, v
1
v
3
, v
3
v
2
, v
5
v
1
, v
5
v
3
}.
El resto de componentes conexas nos las saltamos, pues no
tienen aristas que procesar.
PASO 6
Finalmente aadimos las aristas puente como bloque del
grafo.
Bloque 2 {v
4
v
5
}.
Bloque 3 {v
5
v
6
}.
Bloques del grafo:
Bloque 1 {v
1
v
2
, v
1
v
3
, v
3
v
2
, v
5
v
1
, v
5
v
3
}.
Bloque 2 {v
4
v
5
}.
Bloque 3 {v
5
v
6
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 74 de 210
Recio Domnguez Daniel
Ejemplo para un grafo dirigido.
PASO 1.
Vrtices de corte {v
2
, v
3
}.
Aristas puente {v
2
v
3
}.
PASO 2.
Eliminamos el vrtice de corte y guardamos las aristas eliminadas
{v
2
v
3
, v
2
v
5
, v
1
v
2
, v
4
v
2
, v
3
v
6
, v
3
v
7
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 75 de 210
Recio Domnguez Daniel
PASO 3.
Componentes conexas {{v
1
v
5
, v
5
v
4
}, {v
6
v
7
}}.
PASO 4.
Restauramos los vrtices de corte junto con las aristas eliminadas
{v
2
v
3
, v
2
v
5
, v
1
v
2
, v
4
v
2
, v
3
v
6
, v
3
v
7
} y eliminamos las aristas puente.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 76 de 210
Recio Domnguez Daniel
PASO 5.
Comprobamos si en el grafo existe alguna arista formada por
algn vrtice de corte
y algn vrtice de las aristas de la componente
conexa. Este proceso se realiza para cada una de las componentes
conexas.
Componentes conexas {{v
1
v
5
, v
5
v
4
}, {v
6
v
7
}}.
Primera componente conexa {v
1
v
5
, v
5
v
4
}.
Conjunto de aristas encontradas {v
2
v
5
, v
1
v
2
, v
4
v
2
}
Con el vrtice v
3
no se encontr ninguna arista.
Aadimos las aristas encontradas a la lista de aristas de la
primera componente conexa obteniendo las aristas del primer bloque.
Bloque 1 {v
1
v
5
, v
5
v
4
, v
2
v
5
, v
1
v
2
, v
4
v
2
}.
Segunda componente conexa {v
6
v
7
}.
Conjunto de aristas encontradas {v
3
v
6
, v
3
v
7
}.
Con el vrtice v
2
no se encontr ninguna arista.
Aadimos las aristas encontradas a la lista de aristas de la
segunda componente conexa obteniendo las aristas del segundo bloque.
Bloque 2 {v
6
v
7
, v
3
v
6
, v
3
v
7
}.
PASO 6
Finalmente aadimos las aristas puente como bloque del grafo.
Bloque 3 {v
2
v
3
}.
Bloques del grafo:
Bloque 1 {v
1
v
5
, v
5
v
4
, v
2
v
5
, v
1
v
2
, v
4
v
2
}.
Bloque 2 {v
6
v
7
, v
3
v
6
, v
3
v
7
}.
Bloque 3 {v
2
v
3
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 77 de 210
Recio Domnguez Daniel
3.3.- Algoritmos de bsquedas.
Bsqueda en profundidad (DFS) .
El algoritmo de recorrido en profundidad, en ingls depth-first search y
que denotaremos DFS para abreviar, permite obtener un rbol recubridor del
grafo original.
Si G es un grafo un grafo conexo, el algoritmo de bsqueda en
profundidad obtiene un rbol recubridor de G. Se trata de un grafo en el que
aparecen todos los vrtices de G, pero no todas sus aristas.
El rbol recubridor no es nico depende del vrtice de partida.
El algoritmo puede implementarse mediante una pila, de tal forma que el
vrtice activo o a partir del cual se expande el rbol siempre se encuentra en la
cima de la pila.
En cada paso se introduce en la pila unos de los vrtices adyacentes al
vrtice activo, aadindose al rbol recubridor la arista que une el vrtice activo
con dicho adyacente.
Puede ocurrir que el vrtice activo no posea adyacentes o que todos
hayan sido visitados con anterioridad y an no se han visitados todos los
vrtices del grafo, en tal caso el vrtice es retirado de la pila y continuamos con
el proceso con el nuevo vrtice activo.
El algoritmo termina cuando la pila est completamente vaca, lo que es
equivalente a decir que todos los vrtices del grafo han sido visitados.
Seguidamente detallaremos los pasos del algoritmo en un ejemplo.
Ejemplo
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 78 de 210
Recio Domnguez Daniel
Aplicaremos el algoritmo de bsqueda en profundidad comenzando por
el vrtice v
1
Pila Vrtices Aristas Visitados
v
1
v
2
v
1
v
2
v
1
v
2
v
1
v
2
v
3
v
2
v
3
v
1
v
2
v
3
v
1
v
2
v
3
v
5
v
3
v
5
v
1
v
2
v
3
v
5
v
1
v
2
v
3
v
5
* * v
1
v
2
v
3
v
5
v
1
v
2
v
3
v
6
v
3
v
6
v
1
v
2
v
3
v
5
v
6
v
1
v
2
v
3
v
6
v
4
v
6
v
4
v
1
v
2
v
3
v
5
v
6
v
4
v
1
v
2
v
3
v
6
v
4
* *
v
1
v
2
v
3
v
6
* *
v
1
v
2
v
3
* *
v
1
v
2
* *
v
1
* *
Pila vaca * *
La columna de vrtices visitados puede ser til para no introducir en la
pila vrtices considerados anteriormente. Adems afinando un poco mas y
aprovechado el conjunto de vrtices visitados podemos para la ejecucin del
algoritmo cuando dicho conjunto contenga todos los vrtices del grafo sin
necesidad de vaciar la pila.
Orden en el que se visitan los vrtices: v
1
, v
2
, v
3,
v
5,
v
6
y v
4
.
Puede observarse que el rbol recubridor construido depende del vrtice
de partida y del orden en el que se visiten los adyacentes al vrtice activo.
rbol recubridor obtenido:
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 79 de 210
Recio Domnguez Daniel
Bsqueda en anchura (BFS) .
El algoritmo de recorrido en anchura, en ingls breadth-first search y que
denotaremos BFS para abreviar, al igual que el algoritmo de bsqueda en
profundidad permite obtener un rbol recubridor donde los vrtices son
recorridos por niveles.
Al igual que en el caso anterior, si el grafo es conexo se encuentra el
rbol recubridor, el cual no es nico, depender del vrtice de partida el orden
en que se visitan los vrtices adyacentes al vrtice activo.
El algoritmo puede implementarse mediante una cola, de tal forma que el
vrtice activo o a partir del cual se expande el rbol siempre se encuentra en la
cabeza de la cola.
En cada paso se introduce en la cola unos de los vrtices adyacentes al
vrtice activo, aadindose al rbol recubridor la arista que une el vrtice activo
con dicho adyacente. Los vrtices adyacentes son introducidos por el final de
la cola de tal forma que el vrtice activo no cambia, hasta que este se queda
sin adyacentes, en este momento el vrtice es extrado de la cola y se repite el
proceso con el resto de vrtices, hasta que todos los vrtices del grafo han
sido visitados.
Seguidamente detallaremos los pasos del algoritmo en un ejemplo.
Ejemplo
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 80 de 210
Recio Domnguez Daniel
Aplicaremos el algoritmo de bsqueda en anchura comenzando por el
vrtice v
1.
Cola Vrtices Aristas Visitados
v
1
v
2
v
1
v
2
v
1
v
2
v
2
v
1
v
4
v
1
v
4
v
1
v
2
v
4
v
4
v
2
v
1
v
6
v
1
v
6
v
1
v
2
v
4
v
6
v
4
v
2
* * v
1
v
2
v
4
v
6
v
4
v
2
v
3
v
2
v
3
v
1
v
2
v
4
v
6
v
3
v
3
v
4
v
2
* * v
1
v
2
v
4
v
6
v
3
v
3
v
4
* * v
1
v
2
v
4
v
6
v
3
v
3
v
5
v
3
v
5
v
1
v
2
v
4
v
6
v
3
v
5
v
5
v
3
* *
v
5
* *
Cola vaca * *
La columna de vrtices visitados puede ser til para no introducir en la
cola vrtices considerados anteriormente. Adems afinando un poco mas y
aprovechado el conjunto de vrtices visitados podemos para la ejecucin del
algoritmo cuando dicho conjunto contenga todos los vrtices del grafo sin
necesidad de vaciar la cola.
Orden en el que se visitan los vrtices: v
1
, v
2
, v
4,
v
6,
v
3
y v
5
.
Puede observarse que el rbol recubridor construido depende del vrtice
de partida y del orden en el que se visiten los adyacentes al vrtice activo.
rbol recubridor obtenido:
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 81 de 210
Recio Domnguez Daniel
3.4.- rboles recubridores de peso mnimo.
Se han implementado dos algoritmos que devuelven un rbol recubridor
o un bosque de peso mnimo si el grafo no es conexo.
Algoritmo de Boruvka.
El algoritmo de Boruvka obtiene un rbol recubridor mnimo en un grafo
G ponderado y conexo (no se admiten ponderaciones negativas).
El algoritmo de Boruvka consiste en elegir desde cada vrtice la arista
de menor peso que sale de l, y as formar al inicio un conjunto de
componentes de vrtices unidos por dichas aristas.
A partir de entonces en cada paso se busca la arista de menor peso
entre los vrtices de cada componente y un vrtice que no lo sea, es decir,
cada componente se unir a otra distinta. El algoritmo termina cuando todos los
vrtices del grafo pertenecen a la misma componente.
A este algoritmo tambin se le denomina "el algoritmo de las burbujas".
El grafo se cubre por una coleccin de burbujas y en cada paso cada burbuja
se adhiere a su burbuja ms cercana.
Aplicar Boruvka al siguiente grafo ponderado y conexo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 82 de 210
Recio Domnguez Daniel
Paso 1
Elegimos de cada vrtice la arista de menor para formar un conjunto de
componentes de vrtices.
Paso 2
Buscamos las aristas de menor peso entre vrtices de componentes
distintas.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 83 de 210
Recio Domnguez Daniel
Como el grafo ya es conexo el algoritmo termina. El peso del rbol
recubridor es 16.
Veamos otro ejemplo.
Paso 1
Elegimos de cada vrtice la arista de menor para formar un conjunto de
componentes de vrtices.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 84 de 210
Recio Domnguez Daniel
Paso 2
Buscamos las aristas de menor peso entre vrtices de componentes
distintas.
Repetimos dicho proceso hasta que el grafo sea conexo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 85 de 210
Recio Domnguez Daniel
El grafo ya es conexo por lo que el algoritmo termina. El peso del rbol
recubridor es 66.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 86 de 210
Recio Domnguez Daniel
Algoritmo de Prim.
El algoritmo de Prim obtiene un rbol recubridor mnimo en un grafo G
ponderado (no se admiten ponderaciones negativas) y conexo.
La implementacin del algoritmo se ha realizado partiendo de un vrtice
que puede proporcionar el usuario, aunque no es obligatorio. Adems sea cual
sea el vrtice de partida el rbol recubridor siempre tendr el mismo peso
mnimo.
El algoritmo comienza con un vrtice y en cada interaccin aade al
grafo una arista de peso mnimo la cual tiene como origen un vrtice
perteneciente al rbol parcialmente construido y como destino un vrtice
perteneciente al grafo G y que no formaba parte del rbol, de tal forma que no
pueda insertarse ningn ciclo.
Dicho proceso se lleva a cabo hasta que todos los vrtices de G han
sido visitados.
Veamos un ejemplo:
Aplicar Prim al siguiente grafo ponderado y conexo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 87 de 210
Recio Domnguez Daniel
Como vrtice de partida tomaremos el vrtice v
1
.
T
0
= { v
1
}.
T
1
= T
0
+ {v
1
, v
6
}.
T
2
= T
1
+ {v
1
, v
4
}.
T
3
= T
2
+ {v
4
, v
7
}.
T
4
= T
3
+ { v
4
, v
5
}.
T
5
= T
4
+ { v
3
, v
5
}.
T
6
= T
5
+ { v
2
, v
4
}.
T
7
= T
6
+ { v
5
, v
8
}.
Peso del rbol recubridor = 16.
rbol recubridor obtenido:
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 88 de 210
Recio Domnguez Daniel
Algoritmo de Kruskal.
El algoritmo de Kruskal obtiene un rbol recubridor de peso mnimo en
un grafo G ponderado (no se admiten ponderaciones negativas) y conexo. Si
el grafo G no es conexo obtiene un bosque de peso mnimo.
Como paso previo se realiza un preprocesamiento a las aristas del grafo
ordenndolas de menor a mayor segn su ponderacin.
En cada iteracin se aade una arista de peso mnimo que no forme
ciclo con el rbol recubridor parcialmente construido.
Dicho algoritmo se ha implementado mediante tcnicas de programacin
dinmica haciendo uso de una tabla en la que se van realizando una serie de
clculos previos para encontrar el rbol recubridor de peso mnimo.
Para llevar a cabo la implementacin se ha usado una tabla
bidimensional con la cual tiene un nmero de columnas igual al nmero de
aristas del grafo ms uno y el nmero de columna igual al nmero de vrtices.
Adems haremos uso de dos variables m y M para almacenar el valor
de la componente de menor y mayor respectivamente.
Para rellenar la tabla se debe siguientes los siguientes pasos.
Paso 1
La primera fila se rellena con el nmero de fila correspondiente al vrtice
en la matriz de adyacencias.
El resto de filas se corresponden con las aristas ordenadas de menor a
mayor peso.
Paso 2
Ahora rellenaremos las filas correspondientes con las aristas. Sea una
arista e
1
que une los vrtice u y v.
En la fila anterior obtenemos el valor correspondiente a la columna que
indique u y v mediante la fila o columna correspondiente a la matriz de
adyacencias del grafo. El valor mximo se almacena en M y el valor mnimo
en m.
Si ambos valores son distintos entonces la arista forma parte del rbol
recubridor puesto que al aadirla no se introduce ningn ciclo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 89 de 210
Recio Domnguez Daniel
A continuacin podemos rellenar la fila correspondiente a dicha arista
teniendo en cuenta los valores calculados en la fila anterior.
Para obtener los valores de la fila correspondientes a la arista copiamos
los valores de la fila anterior excepto cuando el valor de la fila anterior sea igual
a M en cuyo caso se machara con el valor de la componente de menor m.
Este proceso se repite hasta que terminemos con todas las aristas del
grafo.
Veamos un ejemplo:
Aplicar Kruskal al siguiente grafo ponderado y conexo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 90 de 210
Recio Domnguez Daniel
rbol recubridor de peso mnimo obtenido. El peso del rbol recubridor es 16.
arista comp(v
1
) comp(v
2
) comp(v
3
) comp(v
4
) comp(v
5
) comp(v
6
) comp(v
7
) comp(v
8
) m M arista
1 2 3 4 5 6 7 8 * * *
e
1
={v
1
,v
6
} 1 2 3 4 5 1 7 8 1 6 e
1
e
2
={v
4
,v
5
} 1 2 3 4 4 1 7 8 4 5 e
2
e
3
={v
4
,v
7
} 1 2 3 4 4 1 4 8 4 7 e
3
e
4
={v
1
,v
4
} 1 2 3 1 1 1 1 8 1 4 e
4
e
5
={v
3
,v
5
} 1 2 1 1 1 1 1 8 1 3 e
5
e
6
={v
4
,v
6
} 1 2 1 1 1 1 1 8 * * *
e
7
={v
5
,v
7
} 1 2 1 1 1 1 1 8 * * *
e
8
={v
2
,v
4
} 1 1 1 1 1 1 1 8 1 2 e
8
e
9
={v
6
,v
7
} 1 1 1 1 1 1 1 8 * * *
e
10
={v
5
,v
8
} 1 1 1 1 1 1 1 1 1 8 e
10
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 91 de 210
Recio Domnguez Daniel
3.5.- Prfer
Algoritmo de codificacin.
Una secuencia de Prfer de longitud n-2 para n2 es cualquier
secuencia de enteros entre 1 y n, permitiendo repeticiones.
El algoritmo de codificacin que se presenta aqu, parte de un rbol
(grafo) para dar lugar a una secuencia de Prfer que lo determina
unvocamente.
Como observacin se puede comprobar que el grado de cada uno de los
vrtices es uno ms que el nmero de veces que su etiqueta aparece en la
secuencia de Prfer.
El algoritmo recibe como entrada un rbol A de n vrtices y retorna una
secuencia S de n-2 vrtices.
Implementacin:
func codificacinPrufer (g: Grafo) dev(S: secuencia de vrtices)
var
a: entero
prin
S := <inicializar a vaca>
// Nmero de aristas del grafo.
a := g.obtenerNmeroAristas()
mientras a-1 > 0
Encontrar un vrtice v de A de grado 1.
Sea v-w la arista que incide en v.
Introducir w en S.
Eliminar la arista v-w del grafo.
a := a-1
fmientras
fin
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 92 de 210
Recio Domnguez Daniel
La bsqueda del vrtice de grado 1 (hoja) se realiza en la matriz de
adyacencias del grafo comenzando de izquierda a derecha y de arriba abajo a
partir de la fila correspondiente al vrtice v.
Una vez que se encuentra la hoja w eliminamos arista formada por los
vrtices v-w para no volver a tenerla en cuenta.
Para determinar si un vrtice es hoja sumamos la fila correspondiente a
dicho vrtice, si el valor de la suma es 1 se trata de una hoja.
Obtener la codificacin de Prfer del siguiente rbol.
Matriz de adyacencias del grafo.
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1 1 1
v
2
1 0 1 1 1
v
3
1 0
v
4
1 0
v
5
1 0
v
6
1 0
v
7
1 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 93 de 210
Recio Domnguez Daniel
La primera hoja encontrada es el vrtice v
3
y v
3
-v
1
es la arista que incide
en v
3
.
Eliminamos dicha arista y aadimos v
1
a la secuencia.
S = {v
1
}.
El rbol nos quedara
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1 1
v
2
1 0 1 1
v
3
0
v
4
0
v
5
1 0
v
6
1 0
v
7
1 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 94 de 210
Recio Domnguez Daniel
La primera hoja encontrada es el vrtice v
4
y v
4
-v
2
es
la arista que incide
en v
4
.
Eliminamos dicha arista y aadimos v
2
a la secuencia.
S = {v
1
, v
2
}.
El rbol nos quedara
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1 1
v
2
1 0 1 1 1
v
3
0
v
4
1 0
v
5
1 0
v
6
1 0
v
7
1 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 95 de 210
Recio Domnguez Daniel
La primera hoja encontrada es el vrtice v
5
y v
5
-v
1
es la arista que incide
en v
5
.
Eliminamos dicha arista y aadimos v
1
a la secuencia.
S = {v
1
, v
2
, v
1
}.
El rbol nos quedara
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1
v
2
1 0 1 1
v
3
0
v
4
0
v
5
0
v
6
1 0
v
7
1 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 96 de 210
Recio Domnguez Daniel
La primera hoja encontrada es el vrtice v
6
y v
6
-v
2
es la arista que incide
en v
6
.
Eliminamos dicha arista y aadimos v
2
a la secuencia.
S = {v
1
, v
2
, v
1
, v
2
}.
El rbol nos quedara
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1
v
2
1 0 1
v
3
0
v
4
0
v
5
0
v
6
0
v
7
1 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 97 de 210
Recio Domnguez Daniel
La primera hoja encontrada es el vrtice v
7
y v
7
-v
2
es la arista que incide
en v
7
.
Eliminamos dicha arista y aadimos v
2
a la secuencia.
S = {v
1
, v
2
, v
1
, v
2
, v
2
}.
El rbol nos quedara
Como el tamao de la secuencia es n-2 el algoritmo termina, siendo n el
nmero de vrtices del rbol el algoritmo termina.
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
1
0 1
v
2
1 0
v
3
0
v
4
0
v
5
0
v
6
0
v
7
0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 98 de 210
Recio Domnguez Daniel
Algoritmo de decodificacin.
El procedimiento de decodificacin siguiente convierte una secuencia de
Prfer en su correspondiente rbol.
Este procedimiento de decodificacin establece una funcin f
d
: P
n-2
T
n
que hace corresponder a un conjunto de secuencias de Prfer de longitud n-2
un conjunto de rboles de n vrtices.
El algoritmo recibe como entrada el nmero de vrtices n que debe
tener el rbol a generar y una secuencia S de n-2 vrtices. Los vrtices de la
secuencia forman parte del rbol y pueden estar repetidos. A partir de la
secuencia proporcionada se genera un rbol.
El algoritmo podemos dividirlo en X pasos.
PASO 1
Crear un grafo G con n vrtices. (Sin aristas).
PASO 2
2.1.- Calcular el conjunto de vrtices que no forma parte de la
secuencia NS.
2.2.- Calcular el conjunto de vrtices ocupados VO.
2.3.- Obtener la diferencia entre ambos conjuntos NS VO.
PASO 3
Si la secuencia es vaca insertamos una arista formada por los
dos vrtices incluidos en NS VO y FIN.
En otro caso insertamos la arista que tiene como origen el primer
vrtice de la secuencia y como destino el primer vrtice de la diferencia
NS VO. Seguidamente eliminar el primer vrtice de la secuencia y
volver al PASO 2.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 99 de 210
Recio Domnguez Daniel
Veamos el siguiente ejemplo:
Sea n = 7 y la secuencia S = {v
1
, v
2
, v
4,
v
6
, v
2
}.
PASO 1
Sea G el grafo:
PASO 2.1
Secuencia S = {v
1
, v
2
, v
4,
v
6
, v
2
}.
Vrtices no incluidos en la secuencia NS = {v
3
, v
5
, v
7
}.
Vrtices ocupados VO = {}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 100 de 210
Recio Domnguez Daniel
PASO 3.1
Como la secuencia no est vaca formamos una arista que posee
como origen el primer vrtice de la secuencia y como destino el primer vrtice
de la diferencia entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
3
, v
5
, v
7
}.
Insertamos en G la nueva arista v
1
-v
3
y eliminamos v
1
de la
secuencia.
PASO 2.2
Secuencia S = {v
2
, v
4,
v
6
, v
2
}.
Vrtices no incluidos en la secuencia NS = {v
1
, v
3
, v
5
, v
7
}.
Vrtices ocupados VO = {v
3
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 101 de 210
Recio Domnguez Daniel
PASO 3.2
Como la secuencia no est vaca formamos una arista que posee
como origen el primer vrtice de la secuencia y como destino el primer vrtice
de la diferencia entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
1
, v
5
, v
7
}.
Insertamos en G la nueva arista v
2
-v
1
y eliminamos v
2
de la
secuencia.
PASO 2.3
Secuencia S = {v
4,
v
6
, v
2
}.
Vrtices no incluidos en la secuencia NS = {v
1
, v
3
, v
5
, v
7
}.
Vrtices ocupados VO = {v
1
, v
3
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 102 de 210
Recio Domnguez Daniel
PASO 3.3
Como la secuencia no est vaca formamos una arista que posee
como origen el primer vrtice de la secuencia y como destino el primer vrtice
de la diferencia entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
5
, v
7
}.
Insertamos en G la nueva arista v
4
-v
5
y eliminamos v
4
de la
secuencia.
PASO 2.4
Secuencia S = {v
6
, v
2
}.
Vrtices no incluidos en la secuencia NS = {v
1
, v
3
, v
4
, v
5
, v
7
}.
Vrtices ocupados VO = {v
1
, v
3
, v
5
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 103 de 210
Recio Domnguez Daniel
PASO 3.4
Como la secuencia no est vaca formamos una arista que posee
como origen el primer vrtice de la secuencia y como destino el primer vrtice
de la diferencia entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
4
, v
7
}.
Insertamos en G la nueva arista v
6
-v
4
y eliminamos v
6
de la
secuencia.
PASO 2.5
Secuencia S = {v
2
}.
Vrtices no incluidos en la secuencia NS = {v
1
, v
3
, v
4
, v
5
, v
6
, v
7
}.
Vrtices ocupados VO = {v
1
, v
3
, v
4
, v
5
}.
PASO 3.5
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 104 de 210
Recio Domnguez Daniel
Como la secuencia no est vaca formamos una arista que posee como origen
el primer vrtice de la secuencia y como destino el primer vrtice de la
diferencia entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
6
, v
7
}.
Insertamos en G la nueva arista v
2
-v
6
y eliminamos v
2
de la
secuencia.
PASO 2.6
Secuencia S = {}.
Vrtices no incluidos en la secuencia NS = {v
1
, v
2
, v
3
, v
4
, v
5
, v
6
, v
7
}.
Vrtices ocupados VO = {v
1
, v
3
, v
4
, v
5
, v
6
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 105 de 210
Recio Domnguez Daniel
PASO 3.6
Como la secuencia est vaca solo nos falta insertar una arista.
Los vrtices que forman parte de la misma se obtienen calculando la diferencia
entre NS y VO.
Calculamos la diferencia entre NS y VO.
NS VO = {v
2
, v
7
}.
Insertamos en G la nueva arista v
2
-v
7
y FIN.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 106 de 210
Recio Domnguez Daniel
3.6.- Algoritmo de emparejamientos
Un emparejamiento de un grafo simple G, es cualquier subgrafo
1-regular de G, es decir un subgrafo inducido por las aritas dos a dos no
incidentes entre s)
Un emparejamiento mximo en un grafo G es cualquier emparejamiento
de G de orden mximo, es decir, con el mayor nmero de vrtices posibles.
Un emparejamiento maximal de peso ptimo en un grafo G es un
emparejamiento de G de orden mximo donde la suma de las ponderaciones
de las aristas es mxima o mnima.
Un emparejamiento es completo o perfecto si tiene exactamente p/2
aristas, siendo p el orden del grafo.
Sea M un emparejamiento, se denomina arista emparejada respecto de
M a cada una de las aristas de G que estn en M. Si dicha arista no esta en
M se dice que no esta emparejada.
Se llaman vrtice emparejado con respecto a M a cada uno de los
vrtices incidentes con alguna arista de M, en otro caso se trata de un vrtice
no emparejado.
Una vez que tenemos claros los conceptos anteriores comentaremos los
tres algoritmos de emparejamientos.
Algoritmo de emparejamiento maximal simple
La implementacin del algoritmo trata de buscar un emparejamiento
mediante un camino alternado. Se denomina camino alternado de G con
respecto a M a un camino de G cuyas aristas son alternativamente
emparejadas y no emparejada.
En cada paso se escoge un vrtice no emparejado y busca un camino
alternado aumentante mediante BFS. En el camino no pueden a parecer
vrtices repetidos. Dicho camino deja de expandirse en cuanto encontremos un
vrtice de G que no haya sido emparejado. Repetimos este proceso para el
resto de vrtice del grafo. Al final obtendremos un emparejamiento maximal
que puede ser completo si todos los vrtices del grafo han sido emparejados.
Veamos un ejemplo:
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 107 de 210
Recio Domnguez Daniel
Comenzamos por el vrtice v
1
y construimos el camino alternado
formado por las aristas.
M = {v
1
, v
6
}.
A continuacin pasamos al vrtice v
2.
M = {v
2
, v
8
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 108 de 210
Recio Domnguez Daniel
Para el vrtice v
3
= {v
3
,v
7
}
Para el vrtice v
4
= {v
4
, v
9
}.
Para el vrtice v
5
= {{v
5
, v
9
}, {v
4
, v
6
}, {v
1
, v
7
}, {v
2
, v
8
}, {v
3
, v
10
}}
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 109 de 210
Recio Domnguez Daniel
Finalmente el emparejamiento nos queda.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 110 de 210
Recio Domnguez Daniel
Algoritmo de Kuhn-Munkres
Se trata de un algoritmo de emparejamiento de peso mximo para grafos
ponderados, bipartitos y completos.
Los grafos bipartitos completos k
m,n
, son grafos de (n + m) vrtices y
(m * n) aristas que admiten una particin de sus vrtices en sendos conjuntos V
y U de m y n vrtices respectivamente, de manera que cada uno de los m
vrtices de V es adyacente a todos y cada uno de los n vrtices de U. Se
denominan bipartitos completos porque no se pueden aadir arista alguna sin
que deje de ser bipartito.
Otro concepto importante es el de matriz de pesos del grafo. Se trata de
una matriz que posee tantas filas y columnas como elementos tiene los
conjuntos X e Y respectivamente. Cada posicin de la matriz almacena la
ponderacin de una arita cuyo origen pertenece al conjunto X y el destino al
conjunto Y.
Ahora explicaremos de forma detallada los cuatro pasos en los que
hemos dividido el algoritmo.
PASO 1
P.1.1.- Identificar los conjuntos V y U de vrtices.
P.1.2.- Obtener la matriz de pesos del grafo MatrizPesos.
Sean i y j los ndices para iterar por la matriz de pesos del grafo.
P.1.3.- Consideremos las tuplas L(v
i
) y L(u
j
) con un tamao igual al
nmero de vrtices que forman parte del conjunto V y U respectivamente.
Inicializamos las tuplas con un etiquetado viable
L(v
i
) se inicializa con el mximo de la fila correspondiente al
vrtice v
i
en MatrizPesos[i, j] con (j <= | V |) (cardinal de V).
L(u
j
) se inicializa a cero para todo u
j
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 111 de 210
Recio Domnguez Daniel
PASO 2
Seguidamente construimos un grafo que verifique la expresin:
L(u
j
) + L(v
i
) = MatrizPesos[i, j].
var
G: Grafo.
I, j: enteros
prin
G := <inicializamos el grafo>
// Iteramos sobre la matriz de pesos del grafo, si se cumple la expresin
// incluimos la arista al grafo g con la ponderacin correspondiente.
desde i := 0 hasta | V |
desde j := 0 hasta | U |
si L(u
j
) + L(v
i
) = MatrizPesos[i, j]
G.aadirArista(u, v, MatrizPesos[i, j])
fsi
fdesde
fdesde
fin
PASO 3
P.3.1.- Buscamos un emparejamiento mximo M en el grafo G con el
algoritmo de emparejamiento maximal simple.
P.3.2.- Si cada vrtice de V est emparejado con respecto a M, entonces
retorna M y FIN.
PASO 4
A continuacin cambiamos las etiquetas de los conjuntos L(v
i
) y L(u
j
).
Sea V(T) los vrtices del el primer camino alternado enraizado en un
vrtice no emparejado del conjunto V que no puede ser extendido ms en G.
P.4.1.- Para ello obtenemos los siguientes conjuntos.
I = V V(T).
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 112 de 210
Recio Domnguez Daniel
D = U V(T).
P.4.2.- Calculamos el valor que minimiza la expresin:
L(v
i
) + L(u
j
) MatrizPesos[i, j] con v
i
y u
i
pertenecientes a los
conjuntos I y D respectivamente.
P.4.3.- Finalmente cambiamos el etiquetado.
Para cada vrtice v
i
perteneciente a la interseccin restamos el valor del
mnimo en L(v
i
).
Para cada vrtice u
i
no perteneciente a la diferencia sumamos el valor
del mnimo en L(u
i
).
Volvemos al PASO 2.
Consideremos el siguiente grafo al cual aplicaremos el algoritmo de Kuhn-
Munkres.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 113 de 210
Recio Domnguez Daniel
PASO 1
Identificamos los conjuntos U y V.
U = {u
1
, u
2
, u
3
, u
4
, u
5
}.
V = {v
1
, v
2
, v
3
, v
4
, v
5
}.
Matriz de pesos del grafo, L(v
i
) y L(u
j
)
PASO 2.1
Construimos un grafo G
2.1
que verifique la expresin
L(u
j
) + Lv(v
i
) = MatrizPesos[i, j].
V/U u
1
u
2
u
3
u
4
u
5
L(v
i
)
v
1
5 1 1 3 2 5
v
2
0 1 3 3 4 4
v
3
2 5 4 3 0 5
v
4
2 2 3 4 4 4
v
5
6 2 0 0 1 6
L(u
j
) 0 0 0 0 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 114 de 210
Recio Domnguez Daniel
PASO 3.1
Buscamos un emparejamiento mximo en G
2.1
.
Como no se ha conseguido un emparejamiento mximo para los vrtices
del conjunto V cambiamos el etiquetado.
PASO 4.1
v
5
es el primer vrtice no emparejado perteneciente a V.
V(T) es el conjunto de vrtices del rbol alternado enraizado en
v
5
que no puede ser extendido ms.
V(T) = {v
5
, v
1,
u
1
}.
Calculamos los siguientes conjuntos.
V V(T) = {v
5
, v
1
}.
V V(T) = {u
2
, u
3
, u
4
, u
5
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 115 de 210
Recio Domnguez Daniel
Minimizamos la expresin L(u
j
) + L(v
i
) MatrizPesos[i, j] para los vrtices
que forman parte de los conjuntos I y D.
L(v
5
) + L(u
2
) - 2 = 4.
L(v
5
) + L(u
3
) - 0 = 6.
L(v
5
) + L(u
4
) - 0 = 6.
L(v
5
) + L(u
5
) - 1 = 5.
L(v
1
) + L(u
2
) - 1 = 4.
L(v
1
) + L(u
3
) - 1 = 4.
L(v
1
) + L(u
4
) - 3 = 2.
L(v
1
) + L(u
5
) - 2 = 3.
El mnimo es 2.
Ahora restamos el valor del mnimo a los vrtices que forman
parte del conjunto I en L(v
i
) y sumamos el valor del mnimo a los vrtices que
no forman parte del conjunto D en L(u
j
). Y volvemos al paso 2
PASO 2.2
Construimos un grafo G
2.2
que verifique la expresin
L(u
j
) + Lv(v
i
) = MatrizPesos[i, j].
V/U u
1
u
2
u
3
u
4
u
5
L(v
i
)
v
1
5 1 1 3 2 3
v
2
0 1 3 3 4 4
v
3
2 5 4 3 0 5
v
4
2 2 3 4 4 4
v
5
6 2 0 0 1 4
L(u
j
) 2 0 0 0 0
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 116 de 210
Recio Domnguez Daniel
Como no se ha conseguido un emparejamiento mximo para los vrtices
del conjunto V cambiamos el etiquetado.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 117 de 210
Recio Domnguez Daniel
PASO 3.2
Buscamos un emparejamiento mximo en G
2.2
.
PASO 4.2
v
5
es el primer vrtice no emparejado perteneciente a V.
V(T) es el conjunto de vrtices del rbol alternado enraizado en
v
5
que no puede ser extendido ms.
V(T) = {v
5
, v
1,
u
1
, v
4
, u
4
, v
2
, u
5
}.
Calculamos los siguientes conjuntos.
V V(T) = {v
5
, v
1
, v
4
, v
2
}.
V V(T) = {u
2
, u
3
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 118 de 210
Recio Domnguez Daniel
Minimizamos la expresin L(u
j
) + L(v
i
) MatrizPesos[i, j] para los vrtices
que forman parte de los conjuntos I y D.
L(v
5
) + L(u
2
) - 2 = 4.
L(v
5
) + L(u
3
) - 0 = 4.
L(v
1
) + L(u
2
) - 1 = 2.
L(v
1
) + L(u
3
) - 1 = 2.
L(v
4
) + L(u
2
) - 2 = 2.
L(v
4
) + L(u
3
) - 3 = 1.
L(v
2
) + L(u
2
) - 1 = 3.
L(v
2
) + L(u
3
) - 3 = 1.
El mnimo es 1.
Ahora restamos el valor del mnimo a los vrtices que forman
parte del conjunto I en L(v
i
) y sumamos el valor del mnimo a los vrtices que
no forman parte del conjunto D en L(u
j
). Y volvemos al paso 2
PASO 2.3
Construimos un grafo G
2.3
que verifique la expresin
L(u
j
) + Lv(v
i
) = MatrizPesos[i, j].
V/U u
1
u
2
u
3
u
4
u
5
L(v
i
)
v
1
5 1 1 3 2 2
v
2
0 1 3 3 4 3
v
3
2 5 4 3 0 5
v
4
2 2 3 4 4 3
v
5
6 2 0 0 1 3
L(u
j
) 3 0 0 1 1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 119 de 210
Recio Domnguez Daniel
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 120 de 210
Recio Domnguez Daniel
PASO 3.3
Buscamos un emparejamiento mximo en G
2.3
.
Como todos los vrtices del conjunto V estn emparejados el algoritmo
termina.
El peso del emparejamiento es 21.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 121 de 210
Recio Domnguez Daniel
Algoritmo de Kuhn-Munkres con preprocesamiento (peso mnimo).
El algoritmo de Kuhn-Munkres se utiliza para obtener un emparejamiento
de peso mximo en un grafo bipartito, ponderado y completo. Tambin
podemos usarlo para obtener el emparejamiento de peso mnimo aunque
previamente es necesario realizar un preprocesamiento a las ponderaciones de
las aristas del grafo.
El preprocesamiento cambia las ponderaciones de las aristas
manteniendo la relacin de orden, pero las aristas que antes eran mnimas
ahora son mximas por lo que bastara aplicar el algoritmo de Kuhn-Munkres y
deshacer los cambios en las ponderaciones de las aristas para obtener el
emparejamiento de peso mnimo.
PREPROCESAMIENTO.
1.- Calcular la ponderacin mxima de todas las aristas del grafo.
2.- Para cada arista cambiamos su peso por:
| PesoArista PonderacinMaxima |.
3.- Finalmente aplicamos el algoritmo de Kuhn-Munkres y obtenemos el
emparejamiento de peso mnimo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 122 de 210
Recio Domnguez Daniel
Encontrar el emparejamiento de peso mnimo en el siguiente grafo.
Realizar el preprocesamiento.
La arista v
5
u
1
es la que posee mayor ponderacin en el grafo. Su
peso es 6.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 123 de 210
Recio Domnguez Daniel
Ahora cambiamos las ponderaciones de las aristas.
A continuacin aplicaremos el algoritmo de Kuhn-Munkres obteniendo un
emparejamiento de peso mximo que nos dar las aristas de peso mnimo
cuando deshagamos los cambios realizados en el preprocesamiento.
Aristas del emparejamiento de peso mximo:
Arista (v
1
, u
3
, 5).
Arista (v
2
, u
1
, 6).
Arista (v
3
, u
5
, 6).
Arista (v
4
, u
2
, 4).
Arista (v
5
, u
4
, 6).
El peso del emparejamiento es 27.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 124 de 210
Recio Domnguez Daniel
Deshacemos los cambios en las ponderaciones obteniendo el peso
original de las aristas.
Aristas del emparejamiento de peso mnimo:
Arista (v
1
, u
3
, 1).
Arista (v
2
, u
1
, 0).
Arista (v
3
, u
5
, 0).
Arista (v
4
, u
2
, 2).
Arista (v
5
, u
4
, 0).
El peso del emparejamiento es 3.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 125 de 210
Recio Domnguez Daniel
Algoritmo de emparejamiento maximal de peso ptimo.
El problema de bsquedas de emparejamientos mximo de peso ptimo
(mximo o mnimo) es un problema NP-completo. Aunque existen mtodos
aproximados se ha optado por un algoritmo de bsqueda exhaustiva,
implementado mediante la tcnica de backtracing.
El esquema que implementa el backtracing:
proc btptimo(x: Etapa)
var
xsig: Etapa
cand: Candidatos
prin
si (esSolucin(x))
si (esMejor())
actualizaSolucin()
fsi
fsi
xsig := nuevaEtapa(x)
cand := calculaCandidatos(x)
mientras (quedanCandidatos(cand))
seleccionaCandidato(cand, xsig);
si (esPrometedor(cand, xsig))
anotaSolucin(cand, xsig);
btOptimo(xsig);
cancelaAnotacin(cand, xsig);
fsi
fmientras
fin
A continuacin comentaremos algunas caractersticas del problema que
se pretende resolver y detallaremos cada uno de los mtodos y clases que
hacen posible la bsqueda del emparejamiento de peso ptimo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 126 de 210
Recio Domnguez Daniel
Comenzaremos por la Clase Solucin
Clase Solucin
// Atributos
emparejamientos: Array[][] de enteros.
/// Almacena el peso del emparejamiento.
pesoEmparejamiento: real
/// Nmero de vrtices emparejados.
numVrticesEmparejados: entero
fclase
La matriz emparejamientos se inicializa con 0 excepto la diagonal
principal y posiciones en las que o existe aritas que se inicializa con infinito o
menos infinito dependiendo si el emparejamiento buscado es de peso mnimo o
mximo respectivamente.
Adems a lo largo de la ejecucin almacena las parejas encontradas a
las cuales les asignan un nmero que hace referencia al orden en el que se
han encontrado.
La profundidad al que se encuentra la solucin que viene determinada
por el nmero mximo de vrtices que pueden ser emparejados, pero
determinar esto en un grafo no es trivial, por ello en cada etapa marcamos la
fila y columna de los vrtices emparejados con el valor de la etapa para que no
vuelvan a ser considerados y saber cuando terminamos el proceso de
bsqueda de parejas. Dicho proceso finaliza cuando la matriz
emparejamientos no contiene ningn 0. Esto se comprueba en el mtodo
esSolucin.
Adems si emparejamiento buscado es de peso mnimo puede aplicarse
una poda al rbol de expansin si hemos encontrado previamente una posible
solucin. La poda de una rama se produce si el peso del emparejamiento
encontrado es menor o igual que el peso del emparejamiento parcialmente
construido. En dicho caso la rama no es examinada.
Si por el contrario el emparejamiento buscado es de peso mximo ser
necesario expandir el rbol completo, pues no es posible aplicar ninguna poda.
Por otra parte como se trata de un problema de optimizacin una
solucin se considera mejor otra, si existe un mayor nmero de vrtices
emparejados o si el nmero de vrtices emparejados es igual en ambas
soluciones se comprueba el peso y en funcin del tipo de emparejamiento se
escoge la solucin de mayor o menor peso. Esta comprobacin se realiza en el
mtodo esMejor. Cada vez que encontremos una solucin mejor
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 127 de 210
Recio Domnguez Daniel
actualizaremos la solucin obtenida hasta el momento, lo cual se realiza en el
mtodo actualizaSolucin.
Clase Candidatos
Clase Candidatos
// Atributos
vrticesSinPareja: Array[] de enteros;
// ndice para iterar sobre el array de candidatos.
i: entero
fila: entero
fclase
En el array vrticesSinPareja almacenamos las columnas de los
vrtices que an no tienen parejas.
El atributo fila indica la fila en la matriz de adyacencias donde se
encontraron los vrtices candidatos.
Los candidatos de una etapa son las columnas de los vrtices an
no emparejados escogidos de la primera fila de la matriz
emparejamientos en la que aparece un 0.
Clase Etapa
// Atributos
// Profundidad del rbol de expansin
k: entero
// Candidato actualmente procesado.
i: entero
fclase
El valor inicial de la etapa y candidato actualmente procesado
comienzan en 0.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 128 de 210
Recio Domnguez Daniel
Ahora detallaremos los atributos de la clase que da cuerpo a cada uno
de los mtodos del esquema.
Clase EmparejamientoMaximalPesoOptimoBacktracking
// Atributos
// Matriz de adyacencias del grafo.
adyacencias: Array[][] de real
tipoEmparejamineto: Lgico
// Fila del vrtice sin pareja.
fila: entero
// Columna del vrtice sin pareja
columna: entero
// Almacena las soluciones parciales encontradas
sol: Solucin
// Almacena la solucin ptima encontrada.
solptima: Solucin
fclase
El atributo tipoEmparejamiento informa del tipo de emparejamiento
buscado por el usuario. Si su valor es cierto buscamos un emparejamiento de
peso mximo, en otro caso de peso mnimo.
Por ltimo comentar algunos detalles del resto de mtodos del esquema.
En el mtodo nuevaEtapa tan solo incrementamos el valor de la etapa
actual.
En quedanCandidatos se comprueba si el atributo i utilizado para
iterar sobre el array verticesSinpareja que almacena los candidatos ha
llegado al final del array.
En selecionaCandidato actualizamos los atributos fila y columna del
vrtice no emparejado. Adems se incrementa el ndice del candidato usado
para iterar sobre el array que almacena los vrtices sin pareja y asignamos
dicho valor al atributo que indica en la etapa el candidato que se esta
procesando actualmente.
En anotaSolucin se marca la fila y columna de los vrtices
emparejados con el valor -k de la etapa. Por otra parte posicin de la matriz 2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 129 de 210
Recio Domnguez Daniel
emparejamientos correspondiente al emparejamiento se marca con el valor
k de la etapa indicando el orden en el que se ha encontrado la pareja.
Tambin incrementamos en dos el nmero de vrtices emparejados y
actualizamos el peso del emparejamiento parcialmente construido con el peso
de la nueva arista considerada.
Finalmente en cancelaAnotacin decrementamos el valor k y
restauramos el valor del candidato actualmente de la etapa. Adems se
restaura el valor de la fila y columna, se desmarcan la fila y columnas de los
ltimos vrtices emparejados. Tambin restauramos el valor del peso del
emparejamiento y vrtice emparejados con el valor que tenan antes de
considerar la nueva pareja. En definitiva las tpicas operaciones que deben
aparecer en toda vuelta atrs.
A continuacin veremos un par de ejemplos donde encontrar el
emparejamiento ptimo es trivial, pero son tiles para visualizar el rbol de
expansin generado. Adems a la hora de mostrar los candidatos pondremos
los propios vrtices en vez de la posicin que estos ocupan en la matriz de
adyacencias.
Emparejamiento mximo de peso mximo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 130 de 210
Recio Domnguez Daniel
rbol de expansin:
Etapa
k = 0 {v
2
, v
3
, v
4
}
peso = 0
k = 1
{v
4
} {v
4
} {v
3
}
peso = 2 peso = 10 peso = 4
k = 2
peso = 5 peso = 14 peso = 9
El emparejamiento ptimo de peso mximo es 14.
En este caso ha sido necesario expandir todo el rbol para obtener el
emparejamiento de peso mximo con el mayor nmero de vrtices.
Aristas del emparejamiento:
Arista (v
1
, v
3
, 10)
Arista (v
2
, v
4
, 4)
v
1
v
2
v
3
v
4
v
1 0 0 0
v
2
0 0 0
v
3
0 0 0
v
4
0 0 0
v
1
v
2
v
3
v
4
v
1 -1 1 -1
v
2
-1 -1 0
v
3
-1 -1 -1
v
4
-1 0 -1
v
1
v
2
v
3
v
4
v
1 -1 -1 1
v
2
-1 0 -1
v
3
-1 0 -1
v
4
-1 -1 -1
v
1
v
2
v
3
v
4
v
1 1 -1 -1
v
2
-1 -1 -1
v
3
-1 -1 0
v
4
-1 -1 0
v
1
v
2
v
3
v
4
v
1 1 -1 -1
v
2
-1 -1 -1
v
3
-1 -1 2
v
4
-1 -1 -2
v
1
v
2
v
3
v
4
v
1 -1 1 -1
v
2
-1 -1 2
v
3
-1 -1 -1
v
4
-1 -2 -1
v
1
v
2
v
3
v
4
v
1 -1 -1 1
v
2
-1 2 -1
v
3
-1 -2 -1
v
4
-1 -1 -1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 131 de 210
Recio Domnguez Daniel
Emparejamiento mximo de peso mnimo.
rbol de expansin:
Etapa
k = 0 {v
2
, v
3
, v
4
}
peso = 0
k = 1
{v
4
} {v
4
} {v
3
}
peso = 2 peso = 10 peso = 4
k = 2
peso = 5 peso = 9
El emparejamiento ptimo de peso mnimo es 5.
En este caso no ha sido necesario expandir todo el rbol pues ya
tenamos una solucin cuyo peso es 5 y por la segunda rama el
emparejamiento parcialmente construido tiene peso 10 por lo que no es posible
mejorar el emparejamiento encontrado inicialmente.
Aristas del emparejamiento:
Arista (v
1
, v
2
, 2)
Arista (v
3
, v
4
, 3)
v
1
v
2
v
3
v
4
v
1 0 0 0
v
2
0 0 0
v
3
0 0 0
v
4
0 0 0
v
1
v
2
v
3
v
4
v
1 -1 1 -1
v
2
-1 -1 0
v
3
-1 -1 -1
v
4
-1 0 -1
v
1
v
2
v
3
v
4
v
1 -1 -1 1
v
2
-1 0 -1
v
3
-1 0 -1
v
4
-1 -1 -1
v
1
v
2
v
3
v
4
v
1 1 -1 -1
v
2
-1 -1 -1
v
3
-1 -1 0
v
4
-1 -1 0
v
1
v
2
v
3
v
4
v
1 1 -1 -1
v
2
-1 -1 -1
v
3
-1 -1 2
v
4
-1 -1 -2
v
1
v
2
v
3
v
4
v
1 -1 -1 1
v
2
-1 2 -1
v
3
-1 -2 -1
v
4
-1 -1 -1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 132 de 210
Recio Domnguez Daniel
Seguidamente un par de ejemplos para grafos con un mayor nmero de
vrtices y aritas.
Ejemplo 1.
Aristas del emparejamiento de peso mximo:
Arista (v
1
, u
4
, 3).
Arista (v
2
, u
3
, 3).
Arista (v
3
, u
2
, 5).
Arista (v
4
, u
5
, 4).
Arista (v
5
, u
1
, 6).
El peso del emparejamiento es 21.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 133 de 210
Recio Domnguez Daniel
Aristas del emparejamiento ptimo de peso mnimo:
Arista (v
1
, u
3
, 1).
Arista (v
2
, u
1
, 0).
Arista (v
3
, u
5
, 0).
Arista (v
4
, u
2
, 2).
Arista (v
5
, u
4
, 0).
El peso del emparejamiento es 3.
Ejemplo 2.
Aristas del emparejamiento ptimo de peso mximo:
Arista (v
1
, v
5
, 4).
Arista (v
2
, v
6
, 1).
El peso del emparejamiento es 5.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 134 de 210
Recio Domnguez Daniel
Aristas del emparejamiento ptimo de peso mnimo:
Arista (v
1
, v
4
, 2).
Arista (v
2
, v
5
, -1).
El peso del emparejamiento es 1.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 135 de 210
Recio Domnguez Daniel
3.7.- Euler
Es euleriano ?.
Un grafo simple conexo es euleriano si y solo si todos los vrtices tienen
valencia par.
Si el grafo es dirigido y el grado de entrada y salida de cada vrtice de
es igual entonces es euleriano.
La implementacin del algoritmo hace distincin entre grafos simples y
dirigidos.
Si se trata de un grafo simple se suma las filas de la matriz de
adyacencias para cada vrtice y si todos tienen valencia par entonces el grafo
es euleriano. En caso contrario el grafo no es euleriano.
Si el grafo es dirigido se calcula el grado de entrada sumado la fila y el
grado de salida sumando la columna correspondiente al vrtice en la matriz de
adyacencias del grafo. Si el grado de entrada y salida de todos los vrtices es
igual entonces el grafo es euleriano.
A continuacin veremos dos ejemplos para cada tipo de grafo.
Grafos simples.
Ejemplo 1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 136 de 210
Recio Domnguez Daniel
Vrtices grado
v
1
4
v
2
4
v
3
4
v
4
2
v
5
2
v
6
2
v
7
2
Como todos los vrtices son de valencia par el grafo es euleriano.
Ejemplo 2.
Vrtices grado
v
1
3
v
2
4
v
3
4
v
4
2
v
5
2
v
6
1
Como el grafo posee dos vrtices impares no es euleriano.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 137 de 210
Recio Domnguez Daniel
A continuacin expondremos los ejemplos para los grafos dirigidos.
Grafos dirigidos.
Ejemplo 1
Vrtices Entrada Salida
v
1
2 2
v
2
2 2
v
3
2 2
v
4
2 2
v
5
3 3
v
6
2 2
v
7
1 1
Como todos los vrtices tienen el grado de salida igual al grado de
entrada el grafo es euleriano.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 138 de 210
Recio Domnguez Daniel
Ejemplo 2
Vrtices Entrada Salida
v
1
2 2
v
2
2 1
v
3
2 1
v
4
2 2
v
5
1 1
Como existen vrtices cuyo grado de salida es distinto al grado de
entrada el grafo no es euleriano.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 139 de 210
Recio Domnguez Daniel
3.8.- Algoritmos de bsqueda de trayectorias eulerianas.
Antes de comenzar a exponer los diversos algoritmos que tratan de
buscar trayectorias eulerianas en los grafos debemos tener claro una serie de
conceptos.
Comenzaremos definiendo el concepto de trayectoria como una
sucesin de vrtices con la propiedad de que cada vrtice es adyacente al
siguiente y tal que en la correspondiente sucesin de aristas todas son
distintas. Adems esta permitido que un vrtice aparezca ms de una vez.
Si dicha trayectoria comienza y termina en el mismo vrtice tenemos un
circuito.
Una vez definido el concepto general de trayectoria nos centraremos en
las trayectorias eulerianas la cual recorre todas las aristas de un grafo conexo.
Anlogamente si termina y comienza en el mismo vrtice se trata de un circuito
euleriano.
A continuacin comentaremos tres algoritmos que se encargan de
buscar trayectorias eulerianas.
Para que en un grafo conexo exista una trayectoria euleriana es
necesario que el grafo no posea ms de dos vrtices de valencia impar, por lo
que si un grafo conexo que tiene exactamente dos vrtices de valencia impar
tiene al menos una trayectoria euleriana. Cualquier trayectoria de Euler debe
comenzar en uno de los vrtices de grado impar y finalizar en el otro.
Sin embargo para que exista al menos un circuito euleriano todos los
vrtices deben tener grado par y el circuito puede construirse partiendo desde
cualquier vrtice.
Algoritmo de Fleury
El algoritmo de Fleury trata de buscar una trayectoria euleriana en un
grafo conexo y en el que no existen ms de dos vrtices de grado impar.
La implementacin del algoritmo se ha realizado mediante tcnicas de
programacin dinmica combinada con voraz.
La heurstica seguida para encontrar la trayectoria euleriana es la
siguiente. Se comprueba que previamente que el grafo satisface las
condiciones para que exista dicha trayectoria.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 140 de 210
Recio Domnguez Daniel
Seguidamente no situamos en unos de los vrtices impares si existen o
en caso contrario uno cualquiera de grado par.
A continuacin de todos los vrtices adyacentes respecto al que
estamos situados escogemos el primero segn orden existente en la matriz de
adyacencias y al ser posible que no sea una arista puente salvo que no exista
ninguna otra alternativa.
Una vez seleccionada la arista, esta no vuelve a tenerse en cuenta por lo que
es como si la hubiramos eliminado del grafo.
Repetimos este proceso hasta recorrer todas las aristas del grafo, pudiendo
repetir vrtices.
Si el grafo es no dirigido la trayectoria se encuentra sin problemas, sin
embargo en grafos dirigidos puede no encontrarse dicha trayectoria si el grafo
posee ms de un vrtice impar. En este caso lo nico que podemos hacer es
relanzar la bsqueda partiendo del otro vrtice impar.
Veamos algunos ejemplos:
Encontrar una trayectoria euleriana en el siguiente grafo no dirigido.
Vrtices Grado
v
1
2
v
2
2
v
3
3
v
4
3
v
5
2
v
6
2
v
7
2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 141 de 210
Recio Domnguez Daniel
Como posee dos vrtices impares y el grafo es no dirigido posee una
trayectoria euleriana abierta.
Los vrtices impares son v
3
y v
4
.
Comenzamos por el primer vrtice impar v
3
.
v
3
v
1
v
3
v
1
v
2
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 142 de 210
Recio Domnguez Daniel
v
3
v
1
v
2
v
3
La ltima arista tomada es puente, pues no existe ninguna alternativa.
v
3
v
1
v
2
v
3
v
4
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 143 de 210
Recio Domnguez Daniel
v
3
v
1
v
2
v
3
v
4
v
5
v
3
v
1
v
2
v
3
v
4
v
5
v
6
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 144 de 210
Recio Domnguez Daniel
v
3
v
1
v
2
v
3
v
4
v
5
v
6
v
7
La ltima arista tomada es puente, pues no existe ninguna alternativa.
v
3
v
1
v
2
v
3
v
4
v
5
v
6
v
7
v
4
.
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 145 de 210
Recio Domnguez Daniel
Encontrar una trayectoria euleriana en el siguiente grafo dirigido.
.
Vrtices Entrada Salida
v
1
2 2
v
2
1 1
v
3
1 1
v
4
2 2
v
5
2 1
v
6
0 1
El grafo no es euleriano pues existen vrtices con grado de entrada y
salida distintos, concretamente v
5
y v
6
. En este caso podemos intentar
encontrar dicha trayectoria partiendo de algunos de los vrtices anteriores.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 146 de 210
Recio Domnguez Daniel
Los vrtices con grado de entrada distinto del grado de salida son v
5
y v
6
.
Comenzamos por el primer vrtice impar v
5
.
v
5
v
4
v
5
v
4
v
1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 147 de 210
Recio Domnguez Daniel
v
5
v
4
v
1
v
2
v
5
v
4
v
1
v
2
v
3
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 148 de 210
Recio Domnguez Daniel
v
5
v
4
v
1
v
2
v
3
v
4
La ltima arista tomada es puente, pues no existe ninguna alternativa.
v
5
v
4
v
1
v
2
v
3
v
4
v
2
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 149 de 210
Recio Domnguez Daniel
v
5
v
4
v
1
v
2
v
3
v
4
v
2
v
5
.
La ltima arista tomada es puente, pues no existe ninguna alternativa.
En el siguiente paso nos damos cuenta que el vrtice v
5
no posee ningn
vrtice adyacente por lo que no se ha encontrado la trayectoria buscada pues
no se han recorrido todas las aristas. En este caso lo nico que podemos hacer
comenzar a construir la trayectoria desde el otro vrtice impar.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 150 de 210
Recio Domnguez Daniel
Comenzamos por el primer vrtice impar v
6
.
v
6
v
1
v
6
v
1
v
2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 151 de 210
Recio Domnguez Daniel
v
6
v
1
v
2
v
3
v
6
v
1
v
2
v
3
v
4
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 152 de 210
Recio Domnguez Daniel
v
6
v
1
v
2
v
3
v
4
v
1
v
6
v
1
v
2
v
3
v
4
v
1
v
5
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 153 de 210
Recio Domnguez Daniel
v
6
v
1
v
2
v
3
v
4
v
1
v
5
v
4
v
6
v
1
v
2
v
3
v
4
v
1
v
5
v
4
v
2
La ltima arista tomada es puente, pues no existe ninguna alternativa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 154 de 210
Recio Domnguez Daniel
v
6
v
1
v
2
v
3
v
4
v
1
v
5
v
4
v
2
v
5
.
En este caso partiendo desde el otro vrtice impar es posible encontrar la
trayectoria euleriana abierta pero puede ocurrir que dicha trayectoria no exista.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 155 de 210
Recio Domnguez Daniel
Veamos un ejemplo de grafo dirigido el que solo existen dos vrtices de
grado impar pero no existe una trayectoria euleriana.
Vrtices Entrada Salida
v
1
0 2
v
2
3 1
v
3
1 1
v
4
1 1
v
5
1 1
En este caso no existe trayectoria euleriana pues es imposible visitar las
aristas v
1
v
2
y v
1
v
5
si partimos del vrtice v
2
. Si por el contrario partiramos del
vrtice v
1
no podramos recorrer todas las que salen de dicho vrtice pues el
grado de entrada es cero. Como conclusin podemos decir que en grafos
dirigidos existe una trayectoria euleriana si el grado de entrada y salida de cada
vrtice son iguales, en otro caso la trayectoria puede no existir.
Seguidamente expondremos dos algoritmos encargados de buscar
trayectorias eulerianas cerradas en cualquier tipo de grafos, pero con
estrategias claramente distintas.
Por ello en ambos se exige que los grafos cumplan ciertas restricciones.
Si se trata de un grafo no dirigido todos los vrtices deben ser de grado par y si
es no dirigido los grados de entrada y salida de cada vrtice deben ser
idnticos para garantizar la existencia del ciclo euleriano.
Teniendo claro lo anteriormente comentado pasaremos a explicar
detalladamente las estrategias de ambos algoritmos.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 156 de 210
Recio Domnguez Daniel
Algoritmo de Tucker.
Tras comprobar las condiciones que permiten la ejecucin del algoritmo
se siguen dos estrategias segn el tipo de grafo.
Si el grafo es no dirigido para cada vrtice cuyo grado es mayor que dos
se duplica hasta conseguir que reducir su grado a dos, en caso de ser un grafo
dirigido duplicamos aquellos vrtices cuyo grado de entrada o salida sean
distintos de uno hasta reducirlos a ese valor.
Al final del proceso tenemos una lista de vrtices duplicados y los
respectivos vrtices con los que se identifica. Adems cabe mencionar que el
nmero de aristas del grafo original se conserva, lo nico que pueden aumentar
es el nmero de vrtices.
Una vez concluido el proceso de duplicacin el grafo queda dividido en
un conjunto de componentes conexas a partir de las cuales iremos
reconstruyendo los ciclos a la misma vez que identificamos los vrtices
duplicados con el vrtice resultado de la duplicacin para dejar el grafo como
estaba originalmente.
Para terminar de comprender el algoritmo veremos un par de ejemplos.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 157 de 210
Recio Domnguez Daniel
Aplicaremos el algoritmo de Tucker al siguiente grafo no dirigido.
Vrtices Grado
v
1
4
v
2
4
v
3
2
v
4
4
v
5
2
v
6
2
v
7
2
v
8
2
v
9
2
v
10
2
v
11
2
v
12
2
Los vrtices cuyo grado es mayor que dos son v
1
, v
2
y v
4
. Estos vrtices
sern duplicados hasta conseguir reducir el grado a dos para cada uno de
ellos.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 158 de 210
Recio Domnguez Daniel
Duplicamos el vrtice v
1
dando el vrtice v
13
.
Duplicamos el vrtice v
2
dando el vrtice v
14
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 159 de 210
Recio Domnguez Daniel
Finalmente para que todos los vrtices posean grado 2 duplicamos el
vrtice v
4
dando el vrtice v
15
.
Tras el proceso de duplicacin el grafo queda dividido en un conjunto de
componentes conexas concretamente cuatro y tenemos una lista de vrtices
duplicados y el correspondiente vrtice con el que se identifica.
Vrtice duplicado Vrtice con el que se identifica
v
1
v
13
v
2
v
14
v
4
v
15
Ahora reconstruiremos el grafo y la trayectoria euleriana cerrada
identificando los vrtices duplicados.
Si el grafo ha sido dividido en varias componentes conexas tomamos un
vrtice de la lista de duplicados tal que el vrtice duplicado y el vrtice con el
que se identifica estn en componentes conexas distintas comenzando por las
primeras posiciones de la tabla anterior. Adems en ese caso en la primera
iteracin reconstruiremos dos ciclos y los reensamblaremos por el final.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 160 de 210
Recio Domnguez Daniel
Si el grafo solo posee una componente conexa reconstruir la trayectoria
es trivial, viene determinada por el propio grafo, bastar identificar los vrtices
duplicados y al mismo tiempo actualizarlos en la trayectoria.
En este caso escogemos el vrtice duplicado v
4
y el vrtice resultado de
la duplicacin v
15
.
Reconstruimos los dos ciclos identificando el vrtice.
Primer ciclo {v
4
-v
7
-v
8
-v
9
-v
4
}.
Segundo ciclo {v
4
-v
3
-v
1
-v
2
-v
4
}.
Identificamos el vrtice y reensamblamos los ciclos.
Ciclo reensamblado {v
4
-v
7
-v
8
-v
9
-v
4
-v
3
-v
1
-v
2
-v
4
}.
Como el grafo an no es conexo escogemos de la lista de vrtices
duplicados uno que no haya sido considerado y cuyo vrtice duplicado
pertenezca a la trayectoria parcialmente construida para que sea ms fcil la
concatenacin del nuevo ciclo.
Por lo que escogemos el vrtice duplicado v
2
y el vrtice resultado de la
duplicacin v
14
Reconstruimos el ciclo identificando el vrtice {v
2
-v
5
-v
6
-v
2
}
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 161 de 210
Recio Domnguez Daniel
Identificamos el vrtice.
Reensamblamos el nuevo ciclo en la trayectoria parcialmente construida
por el final.
{v
4
-v
7
-v
8
-v
9
-v
4
-v
3
-v
1
-v
2
-v
5
-v
6
-v
2
-v
4
}.
Finalmente escogemos el vrtice duplicado v
1
y el vrtice resultado de la
duplicacin v
13
.
Construimos el ciclo identificando el vrtice {v
1
-v
10
-v
11
-v
12
-v
1
}
Por ltimo identificamos los vrtices y reensamblamos el ciclo por el final
en la trayectoria euleriana parcialmente construida obteniendo la trayectoria
cerrada completa.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 162 de 210
Recio Domnguez Daniel
Trayectoria euleriana cerrada {v
4
-v
7
-v
8
-v
9
-v
4
-v
3
-v
1
-v
10
-v
11
-v
12
-v
1
-v
2
-v
4
}.
Veamos otro ejemplo:
Vrtices Grado
v
1
4
v
2
2
v
3
2
v
4
4
v
5
2
v
6
2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 163 de 210
Recio Domnguez Daniel
Los vrtices cuyo grado es mayor que dos son v
1
y v
4
. Estos vrtices
sern duplicados hasta conseguir reducir el grado a dos para cada uno de
ellos.
Duplicamos el vrtice v
1
dando el vrtice v
7
.
Para terminar de conseguir que todos los vrtices tengan grado 2
duplicaremos el vrtice v
4
dando el vrtice
v
8
.
Vrtice duplicado Vrtice con el que se identifica
v
1
v
7
v
4
v
8
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 164 de 210
Recio Domnguez Daniel
Como el grafo ha sido dividido 2 componentes conexas tomamos un
vrtice de la lista de duplicados tal que el vrtice duplicado y el vrtice con el
que se identifica estn en componentes conexas distintas comenzando por las
primeras posiciones la tabla anterior. Adems en ese caso en la primera
iteracin reconstruiremos dos ciclos y los reensamblaremos por el final.
En este caso escogemos el vrtice duplicado v
4
y el vrtice resultado de
la duplicacin v
8
.
Reconstruimos los dos ciclos identificando el vrtice.
Primer ciclo {v
4
-v
1
-v
2
-v
3
-v
4
}.
Segundo ciclo {v
4
-v
5
-v
7
-v
6
-v
4
}.
Identificamos el vrtice y reensamblamos los ciclos.
Ciclo reensamblado {v
4
-v
1
-v
2
-v
3
-v
4
-v
5
-v
7
-v
6
-v
4
}.
El grafo ya es conexo por lo que solo nos queda identificar el resto de
vrtices si existen para obtener la trayectoria euleriana cerrada.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 165 de 210
Recio Domnguez Daniel
Identificamos el ltimo vrtice duplicado que nos queda v
1
con v
7
.
Identificamos el vrtice en la trayectoria {v
4
-v
1
-v
2
-v
3
-v
4
-v
5
-v
1
-v
6
-v
4
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 166 de 210
Recio Domnguez Daniel
Finalmente detallaremos un ejemplo para un grafo dirigido.
Vrtices Entrada Salida
v
1
3 3
v
2
1 1
v
3
1 1
v
4
1 1
v
5
2 2
v
6
1 1
v
7
1 1
v
8
1 1
v
9
1 1
Como se trata de un grafo dirigido debemos conseguir que todos los
vrtices tengan grado de entrada y salida igual a 1, por lo que duplicaremos los
vrtices v
1
y v
5
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 167 de 210
Recio Domnguez Daniel
Duplicamos el vrtice v
1
dando el vrtice v
10
.
Duplicamos el vrtice v
1
dando el vrtice v
11
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 168 de 210
Recio Domnguez Daniel
Duplicamos el vrtice v
5
dando el vrtice v
12
.
Una vez que los grados de entrada y salida de todos los vrtices son
iguales a 1 comenzamos el proceso reconstruccin de la trayectoria euleriana
cerrada e identificacin de vrtices para dejar el grafo como estaba
originalmente.
Vrtice duplicado Vrtice con el que se identifica
v
1
v
10
v
1
v
11
v
5
v
12
Como es la primera iteracin reconstruiremos dos ciclos. Buscamos un
vrtice duplicado y vrtice con el que se identifica de tal forma que pertenezcan
a componentes conexas distintas.
En este caso escogemos comenzando por las primeras posiciones de la
tabla el vrtice duplicado v
1
y el vrtice resultado de la duplicacin v
1
.
Reconstruimos los dos ciclos identificando el vrtice.
Primer ciclo {v
1
-v
2
-v
3
-v
1
}.
Segundo ciclo {v
1
-v
9
-v
1
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 169 de 210
Recio Domnguez Daniel
Identificamos el vrtice y reensamblamos los ciclos.
Ciclo reensamblado {v
1
-v
2
-v
3
-v
1
-v
9
-v
1
}.
Como el grafo an no es conexo escogemos de la lista de vrtices
duplicados uno que no haya sido considerado y cuyo vrtice duplicado
pertenezca a la trayectoria parcialmente construida para que sea ms fcil la
concatenacin del nuevo ciclo.
Por lo que escogemos el vrtice duplicado v
1
y el vrtice resultado de la
duplicacin v
11
.
Construimos el ciclo identificando el vrtice {v
1
-v
4
-v
12
-v
6
-v
7
-v
5
-v
8
-v
1
}.
Identificamos el vrtice.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 170 de 210
Recio Domnguez Daniel
Reensamblamos los ciclos {v
1
-v
2
-v
3
-v
1
-v
9
-v
1
-v
4
-v
12
-v
6
-v
7
-v
5
-v
8
-v
1
}.
Como el grafo ya es conexo tan solo nos falta identificar el resto de
vrtices duplicados.
Finalmente identificamos el vrtice duplicado v
5
y el vrtice resultado de
la duplicacin v
12
y obtenemos la trayectoria euleriana cerrada.
Identificamos el vrtice en la trayectoria {v
1
-v
2
-v
3
-v
1
-v
9
-v
1
-v
4
-v
5
-v
6
-v
7
-v
5
-v
8
-v
1
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 171 de 210
Recio Domnguez Daniel
Algoritmo de Hierholzer.
Tras comprobar las condiciones que permiten la ejecucin del algoritmo,
seguimos la siguiente estrategia independientemente del tipo de grafo.
Nos situamos en un vrtice cualquiera y construimos un ciclo. Si todas
las aristas del grafo han sido visitadas tenemos la trayectoria euleriana en otro
caso partimos de un vrtice que forme parte de la trayectoria euleriana
parcialmente construida y que an le queden adyacentes por considerar.
Partiendo de este vrtice construimos otro ciclo y lo reensamblamos con el
obtenido anteriormente comenzando por el principio de la lista que almacena la
trayectoria euleriana.
Para construir el ciclo basta coger en cada iteracin un adyacente del
vrtice en el cual nos encontramos. El vrtice actual en cada iteracin es el
adyacente obtenido. Dicho proceso se repetir hasta llegar al vrtice de partida.
Este proceso se realiza hasta que todas las aritas del grafo hayan sido
visitadas.
Veamos algunos ejemplos para terminar de comprender el algoritmo.
Aplicar el algoritmo de Hierholzer al siguiente grafo no dirigido.
El primer ciclo podemos construirlo partiendo de cualquier vrtice del
grafo, por ejemplo v
5
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 172 de 210
Recio Domnguez Daniel
Obtenemos el ciclo {v
5
-v
2
-v
1
-v
3
-v
4
-v
2
-v
6
-v
5
}.
A continuacin obtenemos otro ciclo partiendo de un vrtice
perteneciente al ciclo anteriormente encontrado para que sea ms fcil la
concatenacin de ambos.
Partimos del vrtice v
1
y obtenemos el ciclo {v
1
-v
10
-v
11
-v
12
-v
1
}.
Ahora reensamblamos los ciclos:
{v
5
-v
2
-v
1
-v
10
-v
11
-v
12
-v
1
-v
3
-v
4
-v
2
-v
6
-v
5
}.
Como an no se han recorrido todas las aristas del grafo obtendremos
otro ciclo partiendo de un vrtice contenido en los ciclos concatenados con
anterioridad. Por lo que podemos partir del vrtice v
4
, obteniendo el ciclo
{v
4
-v
7
-v
8
-v
9
-v
4
}.
Ahora concatenamos los ciclos y obtenemos la trayectoria euleriana
cerrada.
{v
5
-v
2
-v
1
-v
10
-v
11
-v
12
-v
1
-v
3
-v
4
-v
7
-v
8
-v
9
-v
4
-v
2
-v
6
-v
5
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 173 de 210
Recio Domnguez Daniel
Veamos un ejemplo para un grafo dirigido.
El primer ciclo podemos construirlo partiendo de cualquier vrtice del
grafo, por ejemplo v
3
.
Obtenemos el ciclo {v
3
-v
1
-v
2
-v
3
}.
A continuacin obtenemos otro ciclo partiendo de un vrtice
perteneciente al ciclo anteriormente encontrado para que sea ms fcil la
concatenacin de ambos.
Partimos del vrtice v
1
y obtenemos el ciclo {v
1
-v
4
-v
5
-v
6
-v
7
-v
5
-v
8
-v
1
}.
Ahora reensamblamos los ciclos:
{v
3
-v
1
-v
4
-v
5
-v
6
-v
7
-v
5
-v
8
-v
1
-v
2
-v
3
}.
Como an no se han recorrido todas las aristas del grafo obtendremos
otro ciclo partiendo de un vrtice contenido en los ciclos concatenados con
anterioridad. Por lo que podemos partir del vrtice v
1
, obteniendo el ciclo
{v
1
-v
9
-v
1
}.
Ahora concatenamos los ciclos y obtenemos la trayectoria euleriana
cerrada.
{v
3
-v
1
-v
9
-v
1
-v
4
-v
5
-v
6
-v
7
-v
5
-v
8
-v
1
-v
2
-v
3
}.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 174 de 210
Recio Domnguez Daniel
Problema del cartero
Este problema modeliza numerosas situaciones de la vida real como es
la recogida de basura de una ciudad, repartos de mercancas, en definitiva
situaciones donde se sale de punto y es necesario llegar o pasar por un
conjunto de zonas y regresar a dicho punto minimizando el coste del trayecto.
Tradicionalmente se conoce como problema del cartero debido al trabajo
que esta persona realizan, puesto que un cartero debe salir de la oficina,
repartir todas las cartas a todas las casas y volver a la oficina minimizando el
coste del recorrido.
El objetivo encontrar un recorrido cerrado de coste ptimo que pase por
todas las aristas del grafo, pudiendo repetir las que sean necesarias.
El algoritmo podemos dividirlo en cinco pasos bien diferenciados que
detallaremos a continuacin.
PASO 1
Obtener los vrtices impares del grafo.
PASO 2
Formar el grafo completo k
n
con los vrtices impares.
La ponderacin de las aristas del grafo anterior viene determinada por la
distancia del camino mnimo en el grafo original entre cada par de vrtice del
grafo completo formado por los vrtices impares. Para obtener el peso de las
aristas se ha empleado el algoritmo de Dijkstra.
PASO 3
Buscar un emparejamiento perfecto de peso mnimo en el grafo
completo formado por los vrtices impares.
PASO 4
Duplicar las aristas del camino mnimo anteriormente calculado segn el
emparejamiento obtenido, es decir, si se obtuvo la siguiente pareja (v1, v2) se
duplican las aristas del camino mnimo que une v1 con v2 en el grafo original.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 175 de 210
Recio Domnguez Daniel
PASO 5
Encontrar el recorrido cerrado de menor coste. Para ello se ha utilizado
el algoritmo de Fleury.
Seguidamente veremos un ejemplo en el que detallaremos cada uno de
los pasos anteriormente comentados. Sea G el siguiente grafo.
Vrtices Grado
v
1
4
v
2
4
v
3
3
v
4
4
v
5
3
v
6
1
v
7
1
PASO 1
Los vrtices impares son v
3
, v
5
, v
6
y v
7
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 176 de 210
Recio Domnguez Daniel
PASO 2
Construimos el grafo completo formado por los vrtices v
3
, v
5
, v
6
y v
7
.
Ahora calcularemos las ponderaciones de las aristas. Para ello
obtendremos la distancia del camino mnimo en G entre cada par de vrtices
del grafo completo formado por los vrtices impares.
d
G
(v
3
,
v
5
) = 2.
d
G
(v
3
,
v
6
) = 7.
d
G
(v
3
,
v
7
) = 2.
d
G
(v
5
,
v
7
) = 4.
d
G
(v
6
,
v
5
) = 6.
d
G
(v
6
,
v
7
) = 9.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 177 de 210
Recio Domnguez Daniel
Por lo que las ponderaciones de las aritas del grafo formado por los
vrtices impares nos queda.
PASO 3
Buscamos un emparejamiento perfecto de peso mnimo en el grafo
formado por los vrtices impares. Para ello se ha utilizado el algoritmo de
emparejamiento de peso ptimo explicado en la seccin dedicada a los
emparejamientos.
El emparejamiento obtenido esta formado por las aristas v
3
v
7
y v
5
v
6
.
PASO 4
Ahora debemos duplicar en G las aristas del camino mnimo existente
entre los vrtices emparejados para lo cual volvemos a aplicar Dijkstra.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 178 de 210
Recio Domnguez Daniel
Obtenemos las aristas que forman parte del camino mnimo entre v
3
y v
7
.
Obtenemos las aristas que forman parte del camino mnimo entre v
5
y v
6
.
Las aristas coloreadas de azul se duplican en G.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 179 de 210
Recio Domnguez Daniel
PASO 5
Finalmente encontramos el recorrido cerrado de coste mnimo aplicando
el algoritmo de Fleury teniendo en cuenta las aristas duplicadas, es decir,
podemos pasar por ellas dos veces.
El recorrido es v
6
-v
1
-v
2
-v
1
-v
4
-v
2
-v
4
-v
3
-v
7
-v
3
-v
4
-v
5
-v
2
-v
5
-v
1
-v
6
.
Orden en el que se recorren las aristas:
Arista (v
6
, v
1
, 2).
Arista (v
1
, v
2
, 3).
Arista (v
2
, v
1
, 3)
Arista (v
1
, v
4
, 4).
Arista (v
4
, v
2
, 6).
Arista (v
2
, v
4
, 6).
Arista (v
4
, v
3
, 1).
Arista (v
3
, v
7
, 2).
Arista (v
7
, v
3
, 2).
Arista (v
3
, v
4
, 1).
Arista (v
4
, v
5
, 1).
Arista (v
5
, v
2
, 1).
Arista (v
2
, v
5
, 1).
Arista (v
5
, v
1
, 5).
Arista (v
1
, v
6
, 2).
El peso total del recorrido es 36 unidades.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 180 de 210
Recio Domnguez Daniel
5.10.- Algoritmos de vrtice coloracin
Se denomina vrtice coloracin de un grafo G(V,A) a una asignacin
c: V/N que asocie a cada vrtice v
i
un color c
i
/N de tal forma que ha
vrtices adyacentes les correspondan colores distintos.
Dado un grafo G(V,A), siempre existe un valor umbral k para el cual G
admite una vrtice coloracin con una paleta de k colores, pero no una de
(k-1)-coloracin. Es decir k es el menor nmero de colores con los se puede
obtener una vrtice coloracin de G. Este valor se conoce como nmero
cromtico G.
Determinar el nmero cromtico de un grafo es un problema complejo,
no se conoce ningn algoritmo capaz de dar una solucin ptima en tiempo
polinmico, por lo que ser necesario utilizar tcnicas algortmicas capaces de
aproximar una solucin del problema en intervalos de tiempos polinomiales.
Seguidamente expondremos cuatro algoritmos de coloracin de vrtices
de carcter voraz y aplicaremos dichos algoritmos al siguiente grafo que
tomaremos como ejemplo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 181 de 210
Recio Domnguez Daniel
Algoritmo de coloracin Secuencial o Voraz.
Este algoritmo sigue una estrategia voraz, es decir comienza la
coloracin de los vrtices segn orden de los stos en la matriz de adyacencias
del grafo, por lo que la entrada del algoritmo es una ordenacin de los vrtices
del grafo.
La coloracin se realiza siguiendo los siguientes pasos.
1.- Asignar el color 1 al primer vrtice de la entrada del algoritmo.
2.- A continuacin escogemos el siguiente vrtice en la ordenacin y le
asignamos el menor color posible diferente respecto a sus adyacentes.
Repetimos este proceso hasta que todos los vrtices del grafo hayan sido
coloreados.
En cada paso se le asigna un color a un vrtice y no se le vuelve a
modificar ms a lo largo de la ejecucin de ah el carcter voraz del algoritmo.
Aplicaremos el algoritmo la grafo de la figura.
Orden de coloracin: v
1
, v
2
, v
3
, v
4
, v
5
, v
6
, v
7
.
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
color 1 2 1 3 1 2 2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 182 de 210
Recio Domnguez Daniel
Algoritmo de coloracin Welsh-Powell
La nica diferencia respecto al algoritmo voraz es el orden en el que se
realiza la coloracin de vrtices.
En este caso los vrtices se ordenan de mayor a menor grado, es decir
en funcin del nmero de vrtices adyacentes.
A continuacin aplicaremos la coloracin de Welsh-Powell al grafo
anterior.
Orden de coloracin: v
2
, v
4
, v
5
, v
1
, v
3
, v
6
, v
7
.
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
color 3 1 2 2 3 1 1
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 183 de 210
Recio Domnguez Daniel
Algoritmo de coloracin Matula-Marble-Isaacson
La nica diferencia respecto a los otros dos algoritmos de coloraciones
el orden en el que se realiza la coloracin vrtices.
En este caso el orden de los vrtices es inverso al proceso de seleccin.
Primero se elige v
n
como el vrtice de menor grado, luego se elige v
n-1
como el
vrtice de menor grado en G-{v
n
} (prescindiendo del vrtice v
n
), y as se
contina examinando los vrtices de menor grado y eliminndolos del grafo.
A continuacin aplicaremos la coloracin de Matatula-Marble-Isaacson al
grafo anterior.
Orden de coloracin: v
5
, v
4
, v
2
, v
1
, v
7
, v
3
, v
6
.
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
color 1 3 1 2 1 2 2
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 184 de 210
Recio Domnguez Daniel
Algoritmo de coloracin de Brelaz
El orden de coloracin de los vrtices depende del grado g(V) y grado de
saturacin o color de los vrtices gs(V) y es determinado en tiempo de
ejecucin. El grado de un vrtice es nmero de adyacentes del mismo y el
grado de saturacin es el nmero colores no repetidos usados en los
adyacentes o vecinos.
A continuacin expondremos los pasos del algoritmo:
PASO 1
Calcular el grado de todos los vrtices y colorear un vrtice de grado
mximo con el color 1.
PASO 2
Seleccionamos un vrtice, an sin colorear, con grado de saturacin o
color mximo. Si existen varios vrtices con el mismo grado de saturacin
mximo escogemos el de mayor grado entre esos vrtices. Si adems
coinciden en grado seleccionamos el primero comenzando por la izquierda de
la tabla.
PASO 3
Colorear el vrtice seleccionado en el paso 2 con el menor color posible.
PASO 4
Si todos los vrtices se han coloreado, FIN. En caso contrario, volver al
paso 3.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 185 de 210
Recio Domnguez Daniel
A continuacin aplicaremos la coloracin de Brelaz al grafo anterior.
La primera fila almacena el grado o el nmero de adyacentes de cada
vrtice y la segunda fila contiene el grado de color o saturacin de cada vrtice
que en principio es cero par todos los vrtices pues an no existe ningn
vrtice coloreado.
La ltima fila informa del color asignado al vrtice.
El primer vrtice coloreado es el vrtice de grado mximo que en nuestro
caso es v
2
al cual se le asigna el color 1. Tras colorearlo el grado de saturacin
sus vrtices adyacentes aumenta en una unidad.
A continuacin habra que escoger un vrtice de grado de saturacin o
color mximo pero existen varios por lo que seleccionamos el primer vrtice de
grado mximo no colorado comenzando por la izquierda de la tabla. Dicho
vrtice es v
4
al cual se le asigna el menor color posible. En este caso el color 2.
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 0 0 0 0 0 0 0
color - - - - - - -
orden - - - - - - -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 1 0 1 1 1 0 0
color - 1 - - - - -
orden - 1 - - - - -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 0 0
color - 1 - 2 - - -
orden - 1 - 2 - - -
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 186 de 210
Recio Domnguez Daniel
En los siguientes pasos volvemos a seleccionar vrtice con grado de
color mximo y si existiera ms de uno escogeramos el de mayor grado, hasta
colorear todos los vrtices del grafo. Veamos la evolucin de la tabla.
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 0 1
color - 1 - 2 3 - -
orden - 1 - 2 3 - -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 0 1
color 3 1 - 2 3 - -
orden 4 1 - 2 3 - -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 1 1
color 3 1 3 2 3 - -
orden 4 1 5 2 3 - -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 1 1
color 3 1 3 2 3 1 -
orden 4 1 5 2 3 6 -
vrtices
v
1
v
2
v
3
v
4
v
5
v
6
v
7
grado g(V) 2 4 2 3 3 1 1
saturacin gs(V) 2 0 1 1 2 1 1
color 3 1 3 2 3 1 1
orden 4 1 5 2 3 6 7
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 187 de 210
Recio Domnguez Daniel
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 188 de 210
Recio Domnguez Daniel
Es bipartito?
Los grafos bipartitos k
n
,
m
, que son aquellos que admiten una particin de
sus vrtices en dos conjuntos V = XY, de manera que las aristas tienen un
extremo en cada uno de estos conjuntos (van de vrtices en X a vrtices en Y).
El conjunto X e Y constan de n y m vrtices respectivamente.
| X | = n.
| Y | = m.
Un grafo bipartito si y solo si no contiene ciclos de orden impar o su
nmero cromtico X(G) es dos. Estas dos propiedades nos permiten saber si
un grafo es bipartito.
Teorema
El algoritmo de Brelaz colorea con dos colores a los grafos bipartitos.
Por lo que tenemos un algoritmo polinmico para decidir si un grafo es
bipartito o no.
Bastar aplicar la coloracin de Brelaz al grafo. Si el nmero de colores
usados es igual a dos entonces el grafo es bipartito. En otro caso el grafo no es
bipartito.
Veamos el siguiente ejemplo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 189 de 210
Recio Domnguez Daniel
Aplicamos el algoritmo de Brelaz.
Como el nmero de colores utilizados es dos el grafo es bipartito.
Veamos otro ejemplo
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 190 de 210
Recio Domnguez Daniel
Aplicamos el algoritmo de Brelaz.
Como el nmero de colores utilizados es distinto de dos el grafo no es
bipartito.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 191 de 210
Recio Domnguez Daniel
3.9.- Algoritmos de aristas coloracin
Expondremos dos algoritmos para la coloracin de las aristas de un
grafo, ambos de carcter voraz.
Algoritmo basado en rellenar un cuadrado latino
Un cuadrado latino es un matriz cuadrada cuya dimensin es n x n,
donde n es el nmero de vrtices del grafo. Cada posicin de la matriz
representa una arista entre dos vrtices.
Para llevar acabo la coloracin rellenaremos la matriz con n smbolos
de tal forma que no existan smbolos repetidos en ninguna fila o columna.
Como curiosidad cabe mencionar que el algoritmo es parecido a la
resolucin de sodokus salvo que en estos existen aristas previamente
coloreadas y nosotros rellenaremos el cuadrado latino sin ninguna restriccin
aadida.
Para rellenar la tabla se comienza de izquierda a derecha y de arriba
abajo asignado un color que no este ya en la fila y columna correspondiente a
la arista tratada.
Seguidamente veremos un ejemplo que aclarar todo lo expuesto
anteriormente.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 192 de 210
Recio Domnguez Daniel
Rellenamos el cuadrado latino.
vrtices v1 v2 v3 v4 v5 v6 v7 v8 v9
v1 0 1 2
3
4
5
v2 1 0 3
v3 2 3 0
1
v4
0 2 1
v5 3
1 2 0 4
5
v6
1 4 0
v7 4
0 1
v8
1 0
v9 5
0
Lgicamente el cuadrado latino es simtrico pues las aristas v
i
v
j
o v
j
v
i
son la misma para cualquier tipo de grafo en lo que a coloracin de arista se
refiere, por ello tienen asignado el mismo color.
Si una posicin del cuadrado latino aparece un infinito indica que no
existe arista entre ambos vrtices.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 193 de 210
Recio Domnguez Daniel
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 194 de 210
Recio Domnguez Daniel
Algoritmo basado en emparejamientos maximales
Este algoritmo colorea las aritas del grafo utilizando el algoritmo de
emparejamiento maximal simple.
Para ello comienza buscando un emparejamiento maximal en el grafo. Al
conjunto de aristas obtenidas les asigna el color k. Seguidamente elimina
dichas aristas del grafo y vuelve a calcular un emparejamiento maximal al cual
le asigna el color k+1. Dicho proceso se repite hasta eliminar todas las aritas
del grafo.
Iniciar k := 1
Paso 1
Encontrar un emparejamiento mximo M de G, y colorear todas las
aristas de M con el color k.
Hacer G := G - M.
Paso 2
Si el grafo no posee aristas, FIN. En caso contrario hacer k := k+1 y
volver al paso 1.
A continuacin detallaremos un ejemplo para el siguiente grafo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 195 de 210
Recio Domnguez Daniel
Calculamos un emparejamiento maximal al cual le asignamos el color 1.
Arista (v
1
, v
2
).
Arista (v
3
, v
5
).
Arista (v
4
, v
6
).
Arista (v
7
, v
8
).
Eliminamos del grafo las aristas del primer emparejamiento.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 196 de 210
Recio Domnguez Daniel
Calculamos otro emparejamiento maximal y le asignamos el color 2.
Arista (v
1
, v
7
).
Arista (v
2
, v
3
).
Arista (v
4
, v
5
).
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 197 de 210
Recio Domnguez Daniel
Eliminamos del grafo las aristas del segundo emparejamiento.
Calculamos otro emparejamiento maximal y le asignamos el color 3.
Arista (v
1
, v
3
).
Arista (v
5
, v
6
).
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 198 de 210
Recio Domnguez Daniel
Eliminamos del grafo las aristas del tercer emparejamiento.
Calculamos otro emparejamiento maximal y le asignamos el color 4.
Arista (v
1
, v
5
).
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 199 de 210
Recio Domnguez Daniel
Eliminamos del grafo la arista del cuarto emparejamiento.
Calculamos otro emparejamiento maximal y le asignamos el color 5.
Arista (v
5
, v
8
).
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 200 de 210
Recio Domnguez Daniel
Eliminamos del grafo la arista del quinto emparejamiento.
Como no quedan aristas por colorear el algoritmo termina.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 201 de 210
Recio Domnguez Daniel
3.10.- Hamilton
Un grafo conexo se dice hamiltoniano cuando admite un ciclo
hamiltoniano.
Un ciclo hamiltoniano es un ciclo que pasa por todos los vrtices del
grafo.
Un camino hamiltoniano es un camino simple que pasa por todos los
vrtices del grafo sin repetir ninguno.
Algoritmo de Dirac.
El problema de decidir si un grafo es hamiltoniano est abierto (no existe
un procedimiento para saber si lo es).
Teorema de Dirac.
Un grafo G (V, A) es hamiltoniano si todos los vrtices tienen valencia
(V) n/2 donde n es el nmero de vrtices del grafo. Esta condicin es
suficiente pero no necesaria por lo que si el grafo no satisface dicha relacin no
podemos asegurar que no sea hamiltoniano.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 202 de 210
Recio Domnguez Daniel
Ejemplo 1.
El grafo es hamiltoniano pues todos los vrtices tienen valencia mayor o
igual que 3.
Vrtices (V) n/2
v
1
5 6/2 = 3
v
2
3 6/2 = 3
v
3
4 6/2 = 3
v
4
4 6/2 = 3
v
5
3 6/2 = 3
v
6
3 6/2 = 3
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 203 de 210
Recio Domnguez Daniel
Ejemplo 2.
Como existen vrtices que no cumplen la relacin, no podemos asegurar
que el grafo no sea hamiltoniano.
Vrtices (V) n/2
v
1
6 8/2 = 4
v
2
3 8/2 = 4
v
3
4 8/2 = 4
v
4
4 8/2 = 4
v
5
3 8/2 = 4
v
6
4 8/2 = 4
v
7
2 8/2 = 4
v
8
2 8/2 = 4
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 204 de 210
Recio Domnguez Daniel
Bsqueda de trayectorias hamiltonianas.
El problema de bsqueda de trayectorias hamiltonianas es un problema
NP-completo. Aunque existen mtodos aproximados se ha optado por un
algoritmo de bsqueda exhaustiva, implementado mediante la tcnica de
backtracing.
El esquema que implementa el backtracing:
proc btptimo(x: Etapa)
var
xsig: Etapa
cand: Candidatos
prin
si (esSolucin(x))
si (esMejor())
actualizaSolucin()
fsi
fsi
xsig := nuevaEtapa(x)
cand := calculaCandidatos(x)
mientras (quedanCandidatos(cand))
seleccionaCandidato(cand, xsig);
si (esPrometedor(cand, xsig))
anotaSolucin(cand, xsig);
btOptimo(xsig);
cancelaAnotacin(cand, xsig);
fsi
fmientras
fin
A continuacin comentaremos algunas caractersticas del problema que
se pretende resolver y detallaremos cada uno de los mtodos y clases que
hacen posible la bsqueda de la trayectoria hamiltoniana.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 205 de 210
Recio Domnguez Daniel
Comenzaremos por la Clase Solucin
Clase Solucin
// Atributos
solucin : Array de enteros.
fclase
La solucin se almacena en un array de enteros donde que almacena la
posicin del vrtice respecto a la matriz de adyacencias del grafo.
El tamao del array y la profundidad a la que se encuentra la solucin en
caso de existir vienen determinados por el nmero de vrtices del grafo.
Podemos decir que si existe la solucin se encuentra a dicha profundidad en el
rbol de expansin, en otro caso no existe solucin.
Una vez que se encuentra una solucin el se para el proceso de
bsqueda y reconstruiremos la trayectoria a partir de las posiciones del los
vrtices en la matriz de adyacencias.
Adems al no tratarse de un problema de optimizacin el mtodo
esMejor retorna siempre cierto. y actualiza solucin se deja vaco.
Clase Candidatos
Clase Candidatos
// Atributos
vrticesDestinos: Array de enteros
i: entero
fclase
El array almacena las posiciones de los posibles vrtices destinos
respecto a la matriz de adyacencias del grafo del ltimo vrtice que forma parte
de la trayectoria hamiltoniana que no hayan sido ya considerados por lo que
todos los candidatos son prometedores, por ello el mtodo esPrometedor
siempre retornar cierto.
En la primera etapa
Los candidatos se obtienen en el mtodo calculaCandidatos.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 206 de 210
Recio Domnguez Daniel
El entero i se utiliza para iterar y seleccionar el vrtice candidato,
operacin realizada en el mtodo seleccionaCandidato.
Clase Etapa
Clase Etapa
// Atributos
k: entero
fclase
El entero almacena la profundidad del rbol de expansin.
Ahora detallaremos los atributos de la clase que da cuerpo a cada uno
de los mtodos del esquema.
Clase HamiltoBacktracing
Clase HamiltoBacktracing
// Matriz de adyacencias del grafo.
adyacencias: Array [][] de real
hamiltoniano: Array de entero
// Tipo de trayectoria bsqueda (ciclo o camino)
ciclo: Lgico
// Nmero de vrtices del grafo.
numVrtices: entero.
vrticeActual: entero
// Si su valor es cierto se ha encontrado la solucin.
solEncontrada: Lgico
// Almacenar la trayectoria si se encuentra.
sol: Solucin
fclase
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 207 de 210
Recio Domnguez Daniel
El array hamiltoniano almacena la secuencia de posiciones de los
vrtices que forman parte de la trayectoria respecto a la matriz de adyacencias
del grafo y el entero vrticeActual almacena la posicin del ltimo vrtice que
forma parte de la trayectoria.
El tipo de trayectoria buscada es elegida por el usuario.
Finalmente comentar que en el mtodo anotaEnSolucin se aade el
vrtice candidato a la trayectoria parcialmente construida y en
cancelaAnotacin solo decrementamos el valor de la etapa.
Para aclara todo lo expuesto anteriormente realizaremos una serie
ejemplo.
Consideremos el siguiente grafo en el cual encontrar el ciclo o camino
hamiltoniano es trivial pero nos servir para mostrar el rbol de expansin
completo. En el rbol en vez de mostraremos los vrtices y no las posiciones
que estos ocupan en la matriz de adyacencias.
En este caso el array que almacena la solucin posee tamao 3 y a
dicha profundidad obtendremos la solucin, pero seguiremos expandiendo el
rbol para ver como evoluciona aunque no es necesario y de hecho no se
realiza en la implementacin proporcionada para la aplicacin pues seria una
perdida de tiempo.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 208 de 210
Recio Domnguez Daniel
Al lado de cada tupla entre llaves aparecen lo candidatos.
Etapa [-, -, -] {v
1
, v
2
, v
3
}
k= 0
[v
1
, -, -] {v
2
, v
3
} [v
2
, -, -] {v
1
, v
3
} [v
3
, -, -] {v
1
, v
2
}
k = 1
[v
1
, v
2
, -] [v
1
, v
3
, -] [v
2
, v
1
, -] [v
2
, v
3
, -] [v
3
, v
1
, -] [v
3
, v
2
, -]
k = 2 {v
3
} {v
2
} {v
3
} {v
1
} {v
2
} {v
1
}
[v
1
, v
2
, v
3
] [v
1
, v
3
, v
2
] [v
2
, v
1
, v
3
] [v
2
, v
3
, v
1
] [v
3
, v
1
, v
2
] [v
3
, v
2
, v
1
]
La solucin encontrada es v
1
-v
2
-v
3
si se desea el camino o v
1
-v
2
-v
3
-v
1
en
el caso del ciclo, el resto del rbol no seria necesario generarlo.
En cada tupla se actualiza la posicin correspondiente con la etapa en la
que nos encontramos considerando que las posiciones del array comienzan en
cero.
A continuacin expondremos otro ejemplo con su rbol de expansin
para un grafo en el que existe un camino hamiltoniano. Una vez encontrado el
camino no seguiremos expandiendo el rbol.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 209 de 210
Recio Domnguez Daniel
Etapa
[-, -, -, -] {v
1
, v
2
, v
3
, v
4
}
k = 0
[v
1
, -, -, -,] {v
2
, v
3
, v
4
} [v
2
, -, -, -] {v
1
}
k = 1
[v
1
, v
2
, -, -] {} [v
1
, v
3
, -, -] {v
4
} [v
1
, v
4
, -, -] {v
3
} [v
2
, v
1
, -, -] {v
3
, v
4
}
k = 2
[v
1
, v
3
, v
4
, -] {} [v
1
, v
4
, v
3
, -] {} [v
2
, v
1
, v
3
, -] {v
4
}
k = 3
[v
2
, v
1
, v
3
, v
4
]
El camino hamiltoniano es v
2
-v
1
-v
3
-v
4
.
Finalmente podremos un ejemplo de bsqueda de un ciclo hamiltoniano en
el que solo mostraremos la solucin.
El ciclo hamiltoniano es v
3
-v
5
-v
1
.v
2
.v
4
-v
6-
v
3
.
Documentacin de la aplicacin Algraf Project
Borrego Ropero Rafael 210 de 210
Recio Domnguez Daniel
4.- Bibliografa
Apuntes de la asignatura de matemtica discreta de la escuela tcnica
superior de informtica de la universidad de Sevilla
http://ma1.eii.us.es/miembros/mcruz/MD/md_ii.html.
Apuntes de la asignatura de teora de grafos de la escuela tcnica
superior de informtica de la universidad de Sevilla
http://ma1.eii.us.es/Docencia/Doc_info/XSLT.asp?xml=teorgraf.xml&xsl=progra
ma.xsl&par=esp:.
Coloracin de vrtices y aristas
http://www.dma.fi.upm.es/grafos/color03.pdf.
Apuntes sobre grafos eulerianos
http://www.google.es/search?hl=es&q=grafos+German+Combariza&btnG=B%
C3%BAsqueda&meta=.
Conectividad en grafos http://mipagina.cantv.net/jhnieto/md/Grafos.pdf.