Professional Documents
Culture Documents
MANUAL DE ALGORÍTMICA
1.- Introducción................................................................................................... 6
2.- Conceptos generales. ................................................................................... 8
Grafos, tipos, ejemplos................................................................................ 8
Algunas definiciones. ................................................................................ 12
Algunos grafos básicos. ............................................................................ 17
Tipos de rutas ........................................................................................... 46
Grafo complementario............................................................................... 48
Grafo de línea. .......................................................................................... 50
3.- Algoritmos implementados. ......................................................................... 54
3.1.- Algoritmos sobre caminos mínimos. ..................................................... 54
Algoritmo de Dijkstra. ................................................................................ 54
Algoritmo de Floyd. ................................................................................... 61
3.2.- Algoritmos de distancias....................................................................... 65
Excentricidad de un vértice. ...................................................................... 65
Radio de un grafo...................................................................................... 67
Diámetro de un grafo................................................................................. 69
Distancia de un vértice. ............................................................................. 70
Algoritmo de la mediana............................................................................ 72
Algoritmo del centro. ................................................................................. 73
3.3.- Conectividad......................................................................................... 75
Algoritmo de componentes conexas. ........................................................ 75
Vértices de corte. ...................................................................................... 77
Aristas puente. .......................................................................................... 78
Bloques. .................................................................................................... 79
3.4.- Algoritmos de búsquedas. .................................................................... 88
Búsqueda en profundidad (DFS) .............................................................. 88
Búsqueda en anchura (BFS) .................................................................... 90
3.5.- Árboles recubridores de peso mínimo. ................................................. 92
Algoritmo de Boruvka. ............................................................................... 92
Algoritmo de Prim...................................................................................... 98
Algoritmo de Kruskal. .............................................................................. 100
3.6.- Prufer.................................................................................................. 103
Algoritmo de codificación. ....................................................................... 103
Algoritmo de decodificación. ................................................................... 110
3.7.- Algoritmo de emparejamientos ........................................................... 120
Algoritmo de emparejamiento maximal simple........................................ 121
Algoritmo de Kuhn-Munkres.................................................................... 128
Algoritmo de Kuhn-Munkres con preprocesamiento (peso mínimo)........ 142
Algoritmo de emparejamiento maximal de peso óptimo.......................... 146
3.8.- Euler ................................................................................................... 157
¿ Es euleriano ?. ..................................................................................... 157
3.9.- Algoritmos de búsqueda de trayectorias eulerianas. .......................... 162
Algoritmo de Fleury ................................................................................. 162
Algoritmo de Tucker. ............................................................................... 183
Algoritmo de Hierholzer........................................................................... 201
Problema del cartero ............................................................................... 205
3.10.- Algoritmos de vértice coloración....................................................... 212
Algoritmo de coloración Secuencial o Voraz. .......................................... 213
1.- Introducción.
- Problema de rutas.
- Problemas de ubicación.
- Problemas de emparejamientos.
v7 v∞1 v2
∞ v3
∞ v4
∞ v5
1 v6
∞ v7
∞
v1 ∞ 1 ∞ 1 ∞ ∞ ∞
v2 1 ∞ 1 1 1 ∞ ∞
v3 ∞ 1 ∞ ∞ ∞ 1 ∞
v4 1 1 ∞ ∞ 1 ∞ ∞
v5 ∞ 1 ∞ 1 ∞ ∞ 1
v6 ∞ ∞ 1 ∞ ∞ ∞ ∞
v1 v2 v3 v4 v5
v1 ∞ ∞ 1 ∞ 1
v2 1 ∞ ∞ 1 ∞
v3 ∞ 1 ∞ ∞ ∞
v4 1 ∞ 1 ∞ ∞
v5 ∞ ∞ ∞ 1 ∞
v1 v2 v3 v4 v5 v6 v7
v1 ∞ 3 ∞ ∞ 5 2 ∞
v2 3 ∞ 3 6 1 ∞ ∞
v3 ∞ 3 ∞ 1 ∞ ∞ 2
v4 ∞ 6 1 ∞ 1 ∞ ∞
v5 5 1 ∞ 1 ∞ ∞ ∞
v6 2 ∞ ∞ ∞ ∞ ∞ ∞
v7 ∞ ∞ 2 ∞ ∞ ∞ ∞
Matriz de adyacencias.
v1 v2 v3 v4 v5 v6 v7 v8
v1 ∞ 2 3 ∞ ∞ ∞ ∞ ∞
v2 ∞ ∞ ∞ 1 1 ∞ ∞ ∞
v3 ∞ ∞ ∞ ∞ ∞ ∞ 1 ∞
v4 ∞ ∞ ∞ ∞ ∞ 1 ∞ ∞
v5 ∞ ∞ ∞ ∞ ∞ 1 ∞ ∞
v6 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 4
v7 ∞ ∞ ∞ ∞ ∞ ∞ ∞ 2
v8 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
Algunas definiciones.
Subgrafo.
Ejemplo.
Subgrafo H.
No es un subgrafo.
Ejemplo
Ejemplo
Subgrafo inducido por las aristas {v1v4, v4v5, v5v6, v6v3, v4v3}.
Grafos completos.
Ejemplo k4.
Ejemplo k5.
Caminos simples.
Ejemplo
Ciclos.
Un ciclo tiene longitud par si “n” es par y longitud impar si “n” es par.
Ejemplo C5.
Árbol.
Ejemplo.
Bosque
Conjunto de árboles.
Ejemplo.
Existen más tipos de grafos como los bipartitos los cuales se comentan
más adelante. Concretamente hay un apartado dedicados exclusivamente para
ellos y en el algoritmo de Kuhn-Munkres se comenta previamente los grafos
bipartitos completos.
Grafos nulos
Rueda
Como en los casos de los grafos ciclos y los grafos estrella, la familia de
los grafos ruedas toma su apelativo de la figura con la que se representan
estos grafos. En este caso, la figura que muestra un grafo rueda viene a ser el
resultado de la unión de las dos familias citadas anteriormente, esto es, un
vértice central rodeado de los demás vértices del grafo en forma de círculo, de
forma que éstos se unen mediante aristas entre vértices consecutivos, y, a su
vez, mediante una arista más, quedan unidos al vértice central, dando al
conjunto el aspecto de una rueda con sus radios.
Así, para cada n≥4, el grafo rueda, W n, con n+1 vértices, se define como
la unión K1+Cn, de un vértice aislado con un ciclo de longitud n.
Cubos
Cubo de dimensión 1.
Cubo de dimensión 2.
Cubo de dimensión 3.
Al igual que en los casos de los demás cubos, el grafo que representa el
cubo de dimensión tres sigue la misma relación de vértices y aristas descrita en
la introducción de este apartado. Por lo tanto, el cubo de 3 dimensiones, tal y
como es comúnmente conocido, cuenta con 8 vértices de grado 3, para lo cual
necesita 12 aristas.
Cubo de dimensión 4.
Cubo de dimensión 5.
Rejillas
Rejilla rectangular
Rejilla triangular
Grafos Platónicos
Tetraedro
Hexaedro
Octaedro
Icosaedro
Dodecaedro
Herschel
Harary
Grafos enlazados.
Enlazados LN, R
vi, vj ∈ V, tales que (j<r ∧ j+n=i+r) ∨ (j=r ∧ j=i+r), la arista (vi, vj) ∈ A
Enlazados LN, R, S
r ≠ s,
vi, vj ∈ V, tales que (j<r ∧ j+n=i+r) ∨ (j=r ∧ j=i+r), la arista (vi, vj) ∈ A, y
vk, vl ∈ V, tales que (l<r ∧ l+n=k+r) ∨ (l=r ∧ l=k+r), la arista (vk, vl) ∈ A
Grafo de Petersen
Grafo de Grötzsch.
Grafo de Heawood
Tutte
El aspecto más importante que presenta este grafo es que se utiliza para
refutar la conjetura de Tait, que afirmaba que "todo grafo 3-regular, 3-conexo y
planar es hamiltoniano". Esta conjetura tenía importancia para demostrar de
una forma sencilla el teorema de los cuatro colores, pero fracasó a causa de
este grafo contraejemplo.
Tipos de rutas
Definiremos:
Camino.
Recorrido.
Camino simple.
Camino cerrado.
Ciclo.
Circuito.
Camino 1: v1v3v5v2v4v3v1v2.
Camino 2: v4v2v5v3v1.
Recorrido 1: v4v2v5v3v1.
Recorrido 2: v5v3v1v2.
Ciclo: v1v3v5v2v1
Circuito: v1v2v5v3v2v4v3v1.
Grafo complementario.
Grafo complementario.
Grafo complementario.
Grafo de línea.
Ejemplo 1
Grafo de línea.
Ejemplo 2.
Grafo de línea.
Algoritmo de Dijkstra.
Una vez que tenemos claro la información que contiene dicha tabla
podemos rellenarla siguiendo los siguientes pasos.
Ejemplo 1
Ejemplo 2
Ejemplo3
Algoritmo de Floyd.
Para ello calcularemos una serie de matrices Dk[i,j] que debe cumplir:
Básicamente la expresión anterior nos dice: “si para ir desde el vértice “i” al “j”
mejoramos pasando por el vértice “k”, este se añade al camino.
var
i,j,k: Entero
prin
fin
Ejemplo1
V1 V2 V3 V4
V1 0 5 ∞ ∞
M [j, j] = V2 50 0 15 5
V3 30 ∞ 0 15
V4 15 ∞ 5 0
Primera iteración
D1 representa el camino más corto para ir desde vértice “i” al vértice “j”
pudiendo pasar únicamente por el vértice 1.
V1 V2 V3 V4 V1 V2 V3 V4
V1 0 5 ∞ ∞ V1 0 0 0 0
D1 = V2 50 0 15 5 P[i,j] = V2 0 0 0 0
V3 30 35 0 15 V3 0 1 0 0
V4 15 20 5 0 V4 0 1 0 0
D2 representa el camino más corto para ir desde vértice “i” al vértice “j”
pudiendo pasar únicamente por el vértice 1 y 2.
V1 V2 V3 V4 V1 V2 V3 V4
V1 0 5 20 10 V1 0 0 2 2
D2 = V2 50 0 15 5 P[i,j] = V2 0 0 0 0
V3 30 35 0 15 V3 0 1 0 0
V4 15 20 5 0 V4 0 1 0 0
D3 representa el camino más corto para ir desde vértice “i” al vértice “j”
pudiendo pasar únicamente por el vértice 1, 2 y 3.
V1 V2 V3 V4 V1 V2 V3 V4
V1 0 5 20 10 V1 0 0 2 2
D3 = V2 45 0 15 5 P[i,j] = V2 3 0 0 0
V3 30 35 0 15 V3 0 1 0 0
V4 15 20 5 0 V4 0 1 0 0
D4 representa el camino más corto para ir desde vértice “i” al vértice “j”
pudiendo pasar únicamente por el vértice 1, 2, 3 y 4. En la última etapa se
consideran todos los vértices del grafo.
V1 V2 V3 V4 V1 V2 V3 V4
V1 0 5 15 10 V1 0 0 4 2
D4 = V2 20 0 10 5 P[i,j] = V2 4 0 4 0
V3 30 35 0 15 V3 0 1 0 0
V4 15 20 5 0 V4 0 1 0 0
Si es “0” entonces existe camino directo para ir desde el vértice “i” al “j” y
el camino se obtiene directamente.
Excentricidad de un vértice.
1.- Calculamos Dijsktra desde el vértice “v” a resto de vértices del grafo.
La excentricidad es 7.
Radio de un grafo.
Veamos un ejemplo.
v1 v2 v3 v4 v5
7 5 5 7 6
Diámetro de un grafo.
Veamos un ejemplo:
Distancia de un vértice.
Veamos un ejemplo:
distancia 22
Distancia mínima Valor camino mínimo
distmin(v5, v1) 6
distmin(v5, v2) 3
distmin(v5, v3) 2
distmin(v5, v4) 1
distancia 12
Algoritmo de la mediana.
Veamos un ejemplo.
distancia(V1) 22
distancia(v2) 15
distancia(v3) 14
distancia(v4) 13
distancia(v5) 12
En este caso la mediana del grafo esta formada por un único vértice.
Dicho vértice es v5.
Veamos un ejemplo
v1 v2 v3 v4 v5
7 5 5 7 6
3.3.- Conectividad.
Tras iterar sobre todas las aristas el array almacena tantos números
distintos como componentes conexas tiene el grafo. Dicha componente conexa
viene determinada por el subgrafo inducido de los vértices que pertenecen a
dicha componente conexa.
Veamos un ejemplo
v1 v2 v3 v4 v5 v6 Mayor Menor
1 2 3 4 5 6 * *
v1 v2 v3 v4 v5 v6 Mayor Menor
1 2 3 1 5 6 4 1
v1 v2 v3 v4 v5 v6 Mayor Menor
1 2 3 1 2 6 5 2
v1 v2 v3 v4 v5 v6 Mayor Menor
1 2 3 1 2 3 6 3
Vértices de corte.
Ejemplo
El grafo posee tres vértices de corte: v3, v4, v7. Basta observar que si
eliminamos algunos de estos vértices el grafo no es conexo.
Aristas puente.
Ejemplo
Bloques.
Algunas propiedades.
a) Si G es no separable G es un bloque.
b) Los bloques permiten hacer una partición del conjunto de las aristas.
2.- Eliminar los vértices de corte del grafo (guardando las aristas).
4.- Restaurar los vértices de corte junto con las aristas y eliminar las
aristas puente del grafo.
6.- Finalmente añadimos como bloques todas las aristas puente del
grafo a la vez que las restauramos en el grafo G.
PASO 1.
PASO 2.
PASO 3.
PASO 4.
PASO 5.
PASO 6
Bloque 2 {v4v5}.
Bloque 3 {v5v6}.
Bloque 2 {v4v5}.
Bloque 3 {v5v6}.
PASO 1.
PASO 2.
PASO 3.
PASO 4.
PASO 5.
PASO 6
Bloque 3 {v2v3}.
Bloque 3 {v2v3}.
Ejemplo
Orden en el que se visitan los vértices: v1, v2, v3, v5, v6 y v4.
Ejemplo
Orden en el que se visitan los vértices: v1, v2, v4, v6, v3 y v5.
Algoritmo de Boruvka.
Paso 1
Paso 2
Paso 1
Paso 2
Algoritmo de Prim.
Dicho proceso se lleva a cabo hasta que todos los vértices de G han
sido visitados.
Veamos un ejemplo:
T0 = { v1}.
T1 = T0 + {v1, v6}.
T2 = T1 + {v1, v4}.
T3 = T2 + {v4, v7}.
T4 = T3 + { v4, v5}.
T5 = T4 + { v3, v5}.
T6 = T5 + { v2, v4}.
T7 = T6 + { v5, v8}.
Algoritmo de Kruskal.
Además haremos uso de dos variables “m” y “M” para almacenar el valor
de la componente de menor y mayor respectivamente.
Paso 1
Paso 2
Ahora rellenaremos las filas correspondientes con las aristas. Sea una
arista e1 que une los vértice u y v.
Si ambos valores son distintos entonces la arista forma parte del árbol
recubridor puesto que al añadirla no se introduce ningún ciclo.
Este proceso se repite hasta que terminemos con todas las aristas del
grafo.
Veamos un ejemplo:
3.6.- Prufer
Algoritmo de codificación.
Implementación:
var
a: entero
prin
S := <inicializar a vacía>
Introducir w en S.
a := a-1
fmientras
fin
La búsqueda del vértice 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 vértice “v”.
Una vez que se encuentra la hoja “w” eliminamos arista formada por los
vértices v-w para no volver a tenerla en cuenta.
S = {v1}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ 1 ∞ ∞
v2 1 0 ∞ ∞ ∞ 1 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 1 ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
S = {v1, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ 1 ∞ ∞
v2 1 0 ∞ 1 ∞ 1 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ 1 ∞ 0 ∞ ∞ ∞
v5 1 ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ 1 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ ∞ 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ ∞ ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ ∞ ∞
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ ∞ ∞ ∞ ∞ 0 ∞
v7 ∞ ∞ ∞ ∞ ∞ ∞ 0
Algoritmo de decodificación.
PASO 1
PASO 2
PASO 3
PASO 1
Sea G el grafo:
PASO 2.1
PASO 3.1
PASO 2.2
PASO 3.2
PASO 2.3
PASO 3.3
PASO 2.4
PASO 3.4
PASO 2.5
Secuencia S = {v2}.
PASO 3.5
Como la secuencia no está vacía formamos una arista que posee como origen
el primer vértice de la secuencia y como destino el primer vértice de la
diferencia entre NS y VO.
PASO 2.6
Secuencia S = {}.
Vértices no incluidos en la secuencia NS = {v1, v2, v3, v4, v5, v6, v7}.
PASO 3.6
Como la secuencia está vacía solo nos falta insertar una arista.
Los vértices que forman parte de la misma se obtienen calculando la diferencia
entre NS y VO.
Una vez que tenemos claros los conceptos anteriores comentaremos los
tres algoritmos de emparejamientos.
Veamos un ejemplo:
M = {v1, v6}.
Para el vértice v5 = {{v5, v9}, {v4, v6}, {v1, v7}, {v2, v8}, {v3, v10}}
Algoritmo de Kuhn-Munkres
PASO 1
Sean “i” y “j” los índices para iterar por la matriz de pesos del grafo.
PASO 2
var
G: Grafo.
I, j: enteros
prin
G := <inicializamos el grafo>
desde i := 0 hasta | V |
desde j := 0 hasta | U |
si L(uj) + L(vi) = MatrizPesos[i, j]
G.añadirArista(u, v, MatrizPesos[i, j])
fsi
fdesde
fdesde
fin
PASO 3
PASO 4
I = V ∩ V(T).
D = U – V(T).
Volvemos al PASO 2.
PASO 1
V/U u1 u2 u3 u4 u5 L(vi)
v1 5 1 1 3 2 5
v2 0 1 3 3 4 4
v3 2 5 4 3 0 5
v4 2 2 3 4 4 4
v5 6 2 0 0 1 6
L(uj) 0 0 0 0 0
PASO 2.1
PASO 3.1
PASO 4.1
L(v5) + L(u2) - 2 = 4.
L(v5) + L(u3) - 0 = 6.
L(v5) + L(u4) - 0 = 6.
L(v5) + L(u5) - 1 = 5.
L(v1) + L(u2) - 1 = 4.
L(v1) + L(u3) - 1 = 4.
L(v1) + L(u4) - 3 = 2.
L(v1) + L(u5) - 2 = 3.
El mínimo es 2.
V/U u1 u2 u3 u4 u5 L(vi)
v1 5 1 1 3 2 3
v2 0 1 3 3 4 4
v3 2 5 4 3 0 5
v4 2 2 3 4 4 4
v5 6 2 0 0 1 4
L(uj) 2 0 0 0 0
PASO 2.2
PASO 3.2
PASO 4.2
L(v5) + L(u2) - 2 = 4.
L(v5) + L(u3) - 0 = 4.
L(v1) + L(u2) - 1 = 2.
L(v1) + L(u3) - 1 = 2.
L(v4) + L(u2) - 2 = 2.
L(v4) + L(u3) - 3 = 1.
L(v2) + L(u2) - 1 = 3.
L(v2) + L(u3) - 3 = 1.
El mínimo es 1.
V/U u1 u2 u3 u4 u5 L(vi)
v1 5 1 1 3 2 2
v2 0 1 3 3 4 3
v3 2 5 4 3 0 5
v4 2 2 3 4 4 3
v5 6 2 0 0 1 3
L(uj) 3 0 0 1 1
PASO 2.3
PASO 3.3
PREPROCESAMIENTO.
| PesoArista – PonderaciónMaxima |.
Realizar el preprocesamiento.
var
xsig: Etapa
cand: Candidatos
prin
si (esSolución(x))
si (esMejor())
actualizaSolución()
fsi
fsi
xsig := nuevaEtapa(x)
cand := calculaCandidatos(x)
mientras (quedanCandidatos(cand))
seleccionaCandidato(cand, xsig);
si (esPrometedor(cand, xsig))
anotaSolución(cand, xsig);
btOptimo(xsig);
cancelaAnotación(cand, xsig);
fsi
fmientras
fin
Clase Solución
// Atributos
fclase
Clase “Candidatos”
Clase Candidatos
// Atributos
fila: entero
fclase
Los candidatos de una etapa son las columnas de los vértices aún
no emparejados escogidos de la primera fila de la matriz
“emparejamientos” en la que aparece un 0.
Clase “Etapa”
// Atributos
fclase
Clase “EmparejamientoMaximalPesoOptimoBacktracking”
// Atributos
tipoEmparejamineto: Lógico
fclase
Por último comentar algunos detalles del resto de métodos del esquema.
Árbol de expansión:
Etapa
v1 v2 v3 v4
k=0 v1 ∞ 0 0 0 {v2, v3, v4}
v2 0 ∞ 0 0
v3 0 0 ∞ 0 peso = 0
v4 0 0 0 ∞
v1 v2 v3 v4 v1 v2 v3 v4 v1 v2 v3 v4
v1 ∞ 1 -1 -1 v1 ∞ -1 1 -1 v1 ∞ -1 -1 1
k=1
v2 -1 ∞ -1 -1 v2 -1 ∞ -1 0 v2 -1 ∞ 0 -1
v3 -1 -1 ∞ 0 v3 -1 -1 ∞ -1 v3 -1 0 ∞ -1
v4 -1 -1 0 ∞ v4 -1 0 -1 ∞ v4 -1 -1 -1 ∞
v1 v2 v3 v4 v1 v2 v3 v4 v1 v2 v3 v4
v1 ∞ 1 -1 -1 v1 ∞ -1 1 -1 v1 ∞ -1 -1 1
k=2 v2 -1 ∞ -1 -1 v2 -1 ∞ -1 2 v2 -1 ∞ 2 -1
v3 -1 -1 ∞ 2 v3 -1 -1 ∞ -1 v3 -1 -2 ∞ -1
v4 -1 -1 -2 ∞ v4 -1 -2 -1 ∞ v4 -1 -1 -1 ∞
Árbol de expansión:
Etapa
v1 v2 v3 v4
k=0 v1 ∞ 0 0 0 {v2, v3, v4}
v2 0 ∞ 0 0
v3 0 0 ∞ 0 peso = 0
v4 0 0 0 ∞
v1 v2 v3 v4 v1 v2 v3 v4 v1 v2 v3 v4
v1 ∞ 1 -1 -1 v1 ∞ -1 1 -1 v1 ∞ -1 -1 1
k=1
v2 -1 ∞ -1 -1 v2 -1 ∞ -1 0 v2 -1 ∞ 0 -1
v3 -1 -1 ∞ 0 v3 -1 -1 ∞ -1 v3 -1 0 ∞ -1
v4 -1 -1 0 ∞ v4 -1 0 -1 ∞ v4 -1 -1 -1 ∞
v1 v2 v3 v4 v1 v2 v3 v4
v1 ∞ 1 -1 -1 v1 ∞ -1 -1 1
k=2 v2 -1 ∞ -1 -1 v2 -1 ∞ 2 -1
v3 -1 -1 ∞ 2 v3 -1 -2 ∞ -1
v4 -1 -1 -2 ∞ v4 -1 -1 -1 ∞
peso = 5 peso = 9
Ejemplo 1.
Ejemplo 2.
3.8.- Euler
¿ Es euleriano ?.
Grafos simples.
Ejemplo 1
Vértices grado
v1 4
v2 4
v3 4
v4 2
v5 2
v6 2
v7 2
Ejemplo 2.
Vértices grado
v1 3
v2 4
v3 4
v4 2
v5 2
v6 1
Grafos dirigidos.
Ejemplo 1
Ejemplo 2
Sin embargo para que exista al menos un circuito euleriano todos los
vértices deben tener grado par y el circuito puede construirse partiendo desde
cualquier vértice.
Algoritmo de Fleury
Una vez seleccionada la arista, esta no vuelve a tenerse en cuenta por lo que
es como si la hubiéramos eliminado del grafo.
Repetimos este proceso hasta recorrer todas las aristas del grafo, pudiendo
repetir vértices.
Vértices Grado
v1 2
v2 2
v3 3
v4 3
v5 2
v6 2
v7 2
v3 v1
v3 v1 v2
v3 v1 v2 v3
v3 v1 v2 v3 v4
v3 v1 v2 v3 v4 v5
v3 v1 v2 v3 v4 v5 v6
v3 v1 v2 v3 v4 v5 v6 v7
v3 v1 v2 v3 v4 v5 v6 v7 v4.
Los vértices con grado de entrada distinto del grado de salida son v5 y v6.
v5 v4
v5 v4 v1
v5 v4 v1 v2
v5 v4 v1 v2 v3
v5 v4 v1 v2 v3 v4
v5 v4 v1 v2 v3 v4 v2
v5 v4 v1 v2 v3 v4 v2 v5 .
v6 v1
v6 v1 v2
v6 v1 v2 v3
v6 v1 v2 v3 v4
v6 v1 v2 v3 v4 v1
v6 v1 v2 v3 v4 v1 v5
v6 v1 v2 v3 v4 v1 v5 v4
v6 v1 v2 v3 v4 v1 v5 v4 v2
v6 v1 v2 v3 v4 v1 v5 v4 v2 v5.
Por ello en ambos se exige que los grafos cumplan ciertas restricciones.
Si se trata de un grafo no dirigido todos los vértices deben ser de grado par y si
es no dirigido los grados de entrada y salida de cada vértice deben ser
idénticos para garantizar la existencia del ciclo euleriano.
Algoritmo de Tucker.
Si el grafo es no dirigido para cada vértice 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 vértices cuyo grado de entrada o salida sean
distintos de uno hasta reducirlos a ese valor.
Vértices Grado
v1 4
v2 4
v3 2
v4 4
v5 2
v6 2
v7 2
v8 2
v9 2
v10 2
v11 2
v12 2
Los vértices cuyo grado es mayor que dos son v1, v2 y v4. Estos vértices
serán duplicados hasta conseguir reducir el grado a dos para cada uno de
ellos.
Identificamos el vértice.
{v4-v7-v8-v9-v4-v3-v1-v2-v5-v6-v2-v4}.
Vértices Grado
v1 4
v2 2
v3 2
v4 4
v5 2
v6 2
Los vértices cuyo grado es mayor que dos son v1 y v4. Estos vértices
serán duplicados hasta conseguir reducir el grado a dos para cada uno de
ellos.
Una vez que los grados de entrada y salida de todos los vértices son
iguales a 1 comenzamos el proceso reconstrucción de la trayectoria euleriana
cerrada e identificación de vértices para dejar el grafo como estaba
originalmente.
Identificamos el vértice.
Algoritmo de Hierholzer.
Este proceso se realiza hasta que todas las aritas del grafo hayan sido
visitadas.
{v5-v2-v1-v10-v11-v12-v1-v3-v4-v2-v6-v5}.
Como aún no se han recorrido todas las aristas del grafo obtendremos
otro ciclo partiendo de un vértice contenido en los ciclos concatenados con
anterioridad. Por lo que podemos partir del vértice v4, obteniendo el ciclo
{v4-v7-v8-v9-v4}.
{v5-v2-v1-v10-v11-v12-v1-v3-v4-v7-v8-v9-v4-v2-v6-v5}.
{v3-v1-v4-v5-v6-v7-v5-v8-v1-v2-v3}.
Como aún no se han recorrido todas las aristas del grafo obtendremos
otro ciclo partiendo de un vértice contenido en los ciclos concatenados con
anterioridad. Por lo que podemos partir del vértice v1, obteniendo el ciclo
{v1-v9-v1}.
{v3-v1-v9-v1-v4-v5-v6-v7-v5-v8-v1-v2-v3}.
PASO 1
PASO 2
PASO 3
PASO 4
PASO 5
Vértices Grado
v1 4
v2 4
v3 3
v4 4
v5 3
v6 1
v7 1
PASO 1
PASO 2
Construimos el grafo completo formado por los vértices v3, v5, v6 y v7.
dG (v3, v5) = 2.
dG (v3, v6) = 7.
dG (v3, v7) = 2.
dG (v5, v7) = 4.
dG (v6, v5) = 6.
dG (v6, v7) = 9.
Por lo que las ponderaciones de las aritas del grafo formado por los
vértices impares nos queda.
PASO 3
PASO 4
Obtenemos las aristas que forman parte del camino mínimo entre v3 y v7.
Obtenemos las aristas que forman parte del camino mínimo entre v5 y v6.
El recorrido es v6-v1-v2-v1-v4-v2-v4-v3-v7-v3-v4-v5-v2-v5-v1-v6.
Dado un grafo G(V,A), siempre existe un valor umbral “k” para el cual G
admite una vértice coloración con una paleta de “k” colores, pero no una de
(k-1)-coloración. Es decir “k” es el menor número de colores con los se puede
obtener una vértice coloración de G. Este valor se conoce como número
cromático G.
vértices v1 v2 v3 v4 v5 v6 v7
color 1 2 1 3 1 2 2
vértices v1 v2 v3 v4 v5 v6 v7
color 3 1 2 2 3 1 1
vértices v1 v2 v3 v4 v5 v6 v7
color 1 3 1 2 1 2 2
PASO 1
PASO 2
PASO 3
PASO 4
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 0 0 0 0 0 0 0
color - - - - - - -
orden - - - - - - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 1 0 1 1 1 0 0
color - 1 - - - - -
orden - 1 - - - - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 2 0 1 1 2 0 0
color - 1 - 2 - - -
orden - 1 - 2 - - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 2 0 1 1 2 0 1
color - 1 - 2 3 - -
orden - 1 - 2 3 - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 2 0 1 1 2 0 1
color 3 1 - 2 3 - -
orden 4 1 - 2 3 - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 2 0 1 1 2 1 1
color 3 1 3 2 3 - -
orden 4 1 5 2 3 - -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación gs(V) 2 0 1 1 2 1 1
color 3 1 3 2 3 1 -
orden 4 1 5 2 3 6 -
vértices v1 v2 v3 v4 v5 v6 v7
grado g(V) 2 4 2 3 3 1 1
saturación 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
¿Es bipartito?
Los grafos bipartitos kn,m, que son aquellos que admiten una partición de
sus vértices en dos conjuntos V = X∪Y, de manera que las aristas tienen un
extremo en cada uno de estos conjuntos (van de vértices en X a vértices en Y).
| X | = n.
| Y | = m.
Teorema
vértices 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
Iniciar k := 1
Paso 1
Hacer G := G - M.
Paso 2
3.-12.- Hamilton
Un ciclo hamiltoniano es un ciclo que pasa por todos los vértices del
grafo.
Algoritmo de Dirac.
Teorema de Dirac.
Ejemplo 1.
Ejemplo 2.
var
xsig: Etapa
cand: Candidatos
prin
si (esSolución(x))
si (esMejor())
actualizaSolución()
fsi
fsi
xsig := nuevaEtapa(x)
cand := calculaCandidatos(x)
mientras (quedanCandidatos(cand))
seleccionaCandidato(cand, xsig);
si (esPrometedor(cand, xsig))
anotaSolución(cand, xsig);
btOptimo(xsig);
cancelaAnotación(cand, xsig);
fsi
fmientras
fin
Clase Solución
// Atributos
solución : Array de enteros.
fclase
Clase “Candidatos”
Clase Candidatos
// Atributos
fclase
En la primera etapa
Clase “Etapa”
Clase Etapa
// Atributos
k: entero
fclase
Clase “HamiltoBacktracing”
Clase “HamiltoBacktracing”
vérticeActual: entero
k= 0
k=1
[v1, v2, -] [v1, v3, -] [v2, v1, -] [v2, v3, -] [v3, v1, -] [v3, v2, -]
[v1, v2, v3] [v1, v3, v2] [v2, v1, v3] [v2, v3, v1] [v3, v1, v2] [v3, v2, v1]
Etapa
[-, -, -, -] {v1, v2, v3, v4}
k=0
k=1
[v1, v2, -, -] {} [v1, v3, -, -] {v4} [v1, v4, -, -] {v3} [v2, v1, -, -] {v3, v4}
k=2
[v1, v3, v4, -] {} [v1, v4, v3, -] {} [v2, v1, v3, -] {v4}
k=3
4.- Bibliografía