• No se han encontrado resultados

MANUAL DE ALGORÍTMICA

N/A
N/A
Protected

Academic year: 2021

Share "MANUAL DE ALGORÍTMICA"

Copied!
248
0
0

Texto completo

(1)

Borrego Ropero Rafael 1 de 248 Recio Domínguez Daniel

MANUAL DE ALGORÍTMICA

Proyecto fin de carrera Escuela Técnica Superior de Ingeniería Informática Departamento Matemáticas Aplicadas I Tutor: Alberto Márquez Pérez

Borrego Ropero, Rafael

[email protected] Recio Domínguez, Daniel [email protected]

(2)
(3)

Borrego Ropero Rafael 3 de 248 Recio Domínguez Daniel

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

(4)

Algoritmo de coloración Welsh-Powell ... 215

Algoritmo de coloración Matula-Marble-Isaacson ... 216

Algoritmo de coloración de Brelaz... 217

¿Es bipartito? ... 221

3.11.- Algoritmos de aristas coloración ... 225

Algoritmo basado en rellenar un cuadrado latino ... 225

Algoritmo basado en emparejamientos maximales... 228

3.-12.- Hamilton ... 235

Algoritmo de Dirac... 235

Búsqueda de trayectorias hamiltonianas... 239

(5)

Borrego Ropero Rafael 5 de 248 Recio Domínguez Daniel

(6)

1.- Introducción.

Nos encontramos ante una aplicación desarrollada para el departamento de matemática aplicada I con el objetivo de proporcionar una herramienta que ayude al desarrollo de las prácticas de las asignaturas dedicadas al estudio de los grafos y la investigación.

La aplicación desarrollada tiene como objetivos mejorar algunos aspectos de la aplicación “Algraf” la cual ha sido punto de partida de este proyecto por lo que se mantiene la compatibilidad con versiones anteriores.

La aplicación resuelve todos los problemas recogidos en versiones anteriores de “Algraf” y se han incluido algunos nuevos por los que ahora la aplicación da solución a gran cantidad de problemas entre los que podemos destacar.

- Problema de rutas. - Problemas de ubicación.

- Problemas de compatibilidades o coloración. - Problemas de minimización de costes. - Problemas de emparejamientos.

Los conceptos expuestos a continuación están enfocados a la comprensión única y exclusivamente a los algoritmos desarrollados para la aplicación. Se ha pretendido que sea un manual autocontenido por lo que cualquier concepto necesario para entender de los algoritmos o funcionamiento de la aplicación está debidamente explicado.

(7)

Borrego Ropero Rafael 7 de 248 Recio Domínguez Daniel

(8)

2.- Conceptos generales.

Grafos, tipos, ejemplos.

Un grafo G es un conjunto finito, no vacío de vértices V(G) y un conjunto de aritas E(G) que puede ser vacío formado por pares no ordenados de elementos pertenecientes a V(G). Solo se establecerá un orden cuado hablemos de grafos dirigidos y a las aristas se las denomina arcos.

Ejemplo de grafo no dirigido.

La matriz de adyacencias del grafo es simétrica respecto a la diagonal principal por ser no dirigido.

v1 v2 v3 v4 v5 v6 v7

v1 ∞ 1 ∞ 1 ∞ ∞ ∞

v 1 ∞ 1 1 ∞ ∞

(9)

Borrego Ropero Rafael 9 de 248 Recio Domínguez Daniel

Si dos o más aristas unen el mismo par de vértices se llaman aristas paralelas y en este caso tenemos un multigrafo.

Si una arista une un mismo vértice se trata de un lazo o bucle. Si en un grafo se permite aristas paralelas y bucles obtenemos un seudografo.

Ejemplo de grafo dirigido.

Matriz de adyacencias del grafo.

v1 v2 v3 v4 v5 v1 ∞ ∞ 1 ∞ 1 v2 1 ∞ ∞ 1 ∞ v3 ∞ 1 ∞ ∞ ∞ v4 1 ∞ 1 ∞ ∞ v5 ∞ ∞ ∞ 1 ∞ www.detodoprogramacion.com

(10)

Un grafo es ponderado si cada arista lleva asociada una magnitud, longitud, dificultad al recorrerla…

Ejemplo de grafo ponderado no dirigido.

La matriz de adyacencias del grafo es simétrica respecto a la diagonal principal por ser no dirigido.

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 ∞ ∞ ∞ ∞

(11)

Borrego Ropero Rafael 11 de 248 Recio Domínguez Daniel

Ejemplo de grafo ponderado dirigido.

Matriz de adyacencias.

Si G es un grafo no dirigido y e = uv es una arista de G diremos que “u” es adyacente a “v” o que “v” es adyacente a “u” o “e” une “u” y “v”, e incide en “v” y “u”.

En caso de tratarse de un grafo dirigido diremos que “u” es adyacente a “v” y “v” es adyacente desde “u”. El arco (u, v) es incidente desde “u” e

incidente hacia “v”. 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 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞ www.detodoprogramacion.com

(12)

Algunas definiciones.

Tamaño y orden de un grafo.

El orden de un grafo G es el número de vértices del grafo y tamaño es el número de aristas.

p = orden (G) = | V (G) |. q = tamaño (G) = | E (G) |.

Valencia o grado de un vértice “v”.

En un grafo no dirigido el grado de un vértice “v” es el número de aristas que inciden en él o número de vértices adyacentes.

En grafos dirigidos se distingue entre grado de entrada y salida del vértice.

El grado de entrada de “v” se define como el número de vértices adyacentes y el grado de salida de “v” es el número de vértices

adyacentes hacia el “v” o número de vértices que apuntan a “v”.

Subgrafo.

Un grafo H es subgrafo de un grafo G si V(H) ⊆ V(G). Ejemplo.

(13)

Borrego Ropero Rafael 13 de 248 Recio Domínguez Daniel

Subgrafo H.

No es un subgrafo.

(14)

Subgrafo inducido por vértices.

Sea S un conjunto de vértices no vacío de un grafo G. El subgrafo inducido por S es el subgrafo maximal de G con vértices en el conjunto S. Al conjunto de aristas lo denotaremos por <S>.

En <S> están todas las aristas de G que unen dos vértices de S. Un subgrafo H es subgrafo inducido por vértices si existe S ⊆ V (G) tal que H = <S>.

(15)

Borrego Ropero Rafael 15 de 248 Recio Domínguez Daniel

Subgrafo inducido por lo vértices {v1, v4, v5, v6}.

Subgrafo inducido por aristas.

Sea X un conjunto no vació de aristas de G. El subgrafo inducido por X es el subgrafo mínimo de G con X el conjunto de aristas y <X> el conjunto de vértices.

En <X> están todos los vértices incidentes con alguna arista de X. Un subgrafo es subgrafo inducido por aristas si H = <X> para algún X ≠∅⊆ E (G).

(16)

Ejemplo

(17)

Borrego Ropero Rafael 17 de 248 Recio Domínguez Daniel

Algunos grafos básicos.

Grafos completos.

Sea G un grafo de orden “p”. G es completo si dos vértices cualesquiera del grafo son siempre adyacentes, es decir, todos sus vértices tienen valencia o grado p-1 (kp).

Ejemplo k4.

Ejemplo k5.

(18)

Caminos simples.

Un grafo de orden p ≥ 1 que es un camino simple se denota Pp.

Un camino simple tiene longitud par si “p” es impar y longitud impar si “p” es par.

Ejemplo

Ciclos.

Los ciclos Cn o n-ciclos para p ≥ 3, son grafos que se asemejan a

(19)

Borrego Ropero Rafael 19 de 248 Recio Domínguez Daniel

(20)

Árbol.

Un árbol de “n” vértices es un grafo conexo, sin ciclos con exactamente n-1 aristas.

Además posee las siguientes propiedades.

a) Dos vértices cualesquiera están unidos por un único camino. b) Si al grafo le eliminamos cualquiera de sus aristas queda dividido exactamente en dos componentes conexas dando lugar a un bosque.

(21)

Borrego Ropero Rafael 21 de 248 Recio Domínguez Daniel

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.

(22)

Árbol n-ario completo.

Una de las formas de representación de la información, como estructura de datos, más utilizada es el árbol.

Un árbol consiste en un nodo inicial, llamado raíz, del que parten un cierto número de aristas, denominadas ramas, cada una hasta un nuevo vértice. Los vértices extremos de una arista se llaman también vértice padre, aquel que se representa más cerca de la raíz, y el otro vértice hijo. A su vez, estos vértices hijos pueden presentar ramas hacia nuevos nodos hijos, que deberán ser siempre nodos diferentes, ya que un árbol no puede presentar ciclos. Por último, aquellos vértices que no presentan ramas hacia ningún hijo, se denominan hojas.

El caso de los árboles n-arios completos es un caso particular dentro de los árboles. La referencia a n-arios-completos se debe a que el número de ramas que sale de cada nodo padre, que es en todos los casos igual a n.

Para definir completamente un grafo perteneciente a esta familia, en realidad son necesarios 2 parámetros.

Uno es la n anteriormente comentado, y el otro es el número de niveles que se le quiere dar al grafo, esto es, el número de ramas que deberá tener el grafo desde el vértice raíz hasta cualquiera de los vértices hoja.

(23)

Borrego Ropero Rafael 23 de 248 Recio Domínguez Daniel

Grafos nulos

Un grafo nulo es aquel que no contiene aristas.

Un grafo nulo puede tener un número de vértices cualquiera pero todos ellos son vértices aislados. Obviamente, en un grafo nulo el número de componentes conexas será igual al número de vértices.

Un ejemplo de grafo nulo de cuatro vértices puede observarse en la figura.

(24)

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, Wn, con n+1 vértices, se define como

(25)

Borrego Ropero Rafael 25 de 248 Recio Domínguez Daniel

Cubos

Otra de las familias de grafos que suelen considerarse con bastante asiduidad es la de los cubos. Esta familia está formada por los cubos de las distintas dimensiones, desde el cubo de dimensión 1, como observaremos en el apartado siguiente, hasta cualquier número de dimensiones.

Sea K un entero positivo mayor que 1. El k-cubo, Qk, es el grafo cuyos

vértices son las k-tuplas ordenadas de ceros y unos, en el cual dos vértices están unidos por una arista si y sólo si difieren exactamente en una posición. Así, por ejemplo, para k=3, los vértices son (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), y (1, 1, 1) y, por ejemplo, (0, 0, 0) está unido con (0, 0, 1), (0, 1, 0) y (1, 0, 0) pero no con ningún otro vértice.

Se puede comprobar que un k-cubo tiene 2k vértices, 2(k-1)k aristas y es bipartito.

Cubo de dimensión 1.

El grafo que representa el cubo de dimensión 1, tal y como se ha explicado en el apartado anterior, tiene 21 vértices y (1/2)21 = 1 arista.

(26)

Cubo de dimensión 2.

Como ya se ha explicado en apartados anteriores, el grafo que representa el cubo de dimensión dos tiene un total de 4 vértices de grado 2, para lo cual son necesarias 4 aristas.

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.

(27)

Borrego Ropero Rafael 27 de 248 Recio Domínguez Daniel

Cubo de dimensión 4.

Como en los casos anteriores, el cubo de 4 dimensiones también cumple la relación de vértices y aristas descrita, por lo que tiene 24 vértices y 25 aristas, lo que le da un grado 4 a todos sus vértices, como ya sabíamos.

(28)

Cubo de dimensión 5.

Para terminar con los grafos relativos a la familia de los cubos n-dimensionales que se incluyen en la aplicación del presente proyecto fin de carrera, el cubo de 5 dimensiones constará, naturalmente, de 32 vértices con 80 aristas. Como en el resto de cubos, se puede comprobar que el grado de todos y cada uno de los vértices del grafo coincide con la dimensión, en este caso, 5.

(29)

Borrego Ropero Rafael 29 de 248 Recio Domínguez Daniel

Rejillas

La familia de grafos que recibe la denominación de rejillas contiene aquellos grafos cuya representación da como resultado una trama de figuras regulares repetidas un cierto número de veces, lo que da al conjunto el aspecto de una rejilla, lo que le da nombre a la familia.

Así, podrían existir tantos tipos de rejillas como figuran geométricas quisiéramos utilizar como base para la construcción de las mismas.

En el presente trabajo se han considerado solamente las dos más sencillas: la rejilla rectangular y la rejilla triangular, que se explican a continuación.

Rejilla rectangular

La familia de grafos que componen las rejillas rectangulares se compone de todos aquellos grafos cuya representación tiene la forma de un rectángulo dividido en un cierto número de porciones de ancho por otro cierto número de porciones de alto, lo que da al conjunto el aspecto de una rejilla formada, a su vez, por rectángulos de igual tamaño.

Estos grafos se caracterizan por tener lo que podríamos denominar tres grupos diferentes de vértices. Los vértices correspondientes a las esquinas del rectángulo, que tendrán, naturalmente, grado 2; los vértices que forman los lados del rectángulo, que tendrán grado 3; y los vértices interiores, que tendrán grado 4.

El número de aristas de estos grafos está claramente determinado por las dimensiones que le demos al rectángulo. Para un número “i” de vértices de ancho y un número “j” de alto, el número de aristas del grafo vendrá determinado por la fórmula (j-1)i + (i-1)j.

(30)

Grafo rejilla rectangular de 20 x 5.

Rejilla triangular

La familia de grafos de las rejillas triangulares, paralelamente a la del rejillas rectangulares, contiene grafos cuya representación es un triangulo dividido en porciones triangulares iguales.

Como es fácil de suponer, el número de porciones en que se puede dividir el triángulo de la rejilla también está limitado. A diferencia de la rejilla rectangular, las dimensiones de la rejilla triangular se determinan perfectamente con un solo parámetro que será el número de vértices por cada lado.

Al igual que ocurre con las rejillas rectangulares, en las triangulares también podemos encontrar tres grupos diferentes de vértices. Los vértices correspondientes a las esquinas del triángulo, que tendrán, igualmente, grado 2; los vértices que forman los lados del triángulo, que tendrán en este caso grado 4; y los vértices interiores, que tendrán grado 6.

El número de aristas de estos grafos también viene determinado, lógicamente, por las dimensiones que le demos al triángulo. Para un número

(31)

Borrego Ropero Rafael 31 de 248 Recio Domínguez Daniel

Grafo rejilla triangular de 11 vértices de lado.

(32)

Grafos Platónicos

En el espacio de tres dimensiones, un poliedro es un sólido limitado por superficies, llamadas comúnmente caras, cada una de las cuales es un plano. Un sólido se dice que es convexo si cualesquiera dos puntos de su interior pueden unirse mediante una línea recta que se encuentre completamente en el interior del sólido.

Sea ϕϕϕϕ una cara de un grafo plano G. Definimos el grado de ϕϕϕϕ, denotado por d(ϕϕϕϕ), al número de aristas del contorno de ϕϕϕϕ.

Los vértices y las aristas de un poliedro, que forman el esqueleto del sólido, forman un grafo simple en el espacio de tres dimensiones. Se puede ver que si el poliedro es convexo el grafo resultante es planar, y claramente, que también es conexo. Que el grado mínimo de cada vértice será, como mínimo, de 3 y que el grado de cada cara es también como mínimo de 3. Además, en particular el grafo resultante también es simple, por lo que se puede establecer la definición:

Un grafo conexo, simple y plano G se denomina poliédrico si d(v) 3 para cada vértice v de G y d(ϕϕϕϕ)3 para cada cara ϕϕϕϕ de G.

Teorema: Sea P un poliedro convexo y sea G su grafo poliédrico. Para cada n3 sea vn el número de vértices de G de grado n y sea fn el número de caras de G de grado n.

<< vérticesG + carasG = aristasG +2 >>

El poliedro P, y por lo tanto el grafo G, tiene al menos una cara limitada por un ciclo de longitud n para

n=3, 4, o 5.

Los antiguos griegos descubrieron cinco poliedros regulares. Se dice que un poliedro es regular si es convexo y sus caras son polígonos regulares congruentes (esto es, que los ángulos del poliedro son todos iguales). Estos cinco poliedros son conocidos como sólidos platónicos.

Usando la fórmula de Euler se puede demostrar que no existe ningún otro poliedro regular además de los 5 que descubrieron los griegos y cuyos grafos correspondientes constituyen la familia que se incluye en la herramienta y los cuales se presentan a continuación.

(33)

Borrego Ropero Rafael 33 de 248 Recio Domínguez Daniel

A continuación, se detalla un poco más cada uno de los citados grafos. Tetraedro

El grafo platónico que representa la figura del tetraedro consta, naturalmente, de 4 vértices y 6 aristas.

Como se puede observar en la figura siguiente, todos los vértices del grafo tienen grado 3, y las caras de la figura representada son todas triángulos, como corresponde a dicha figura.

El grafo platónico tetraedro se encuentra representado planarmente en la siguiente figura.

(34)

Hexaedro

Como el hexaedro que representa, el grafo platónico hexaedro tiene 8 vértices y 12 aristas, formando 6 caras de cuatro lados. Como todos sabemos ya, la figura geométrica hexaedro recibe también el nombre de cubo refiriéndose al cubo de tres dimensiones, por lo que el grafo platónico hexaedro, coincide exactamente con el grafo que representa el cubo tridimensional.

El grafo platónico hexaedro se encuentra representado planarmente en la siguiente figura.

(35)

Borrego Ropero Rafael 35 de 248 Recio Domínguez Daniel

Octaedro

Como es bien conocido, un octaedro es una figura geométrica que, como su propio nombre indica, consta de ocho caras, en forma de triángulo. Como es lógico, el grafo que lo representa tiene sus mismas características, como ya hemos visto en los ejemplos anteriores, es decir, 6 vértices y 12 aristas. El grado de todos los vértices de este grafo, obviamente, es 4.

El grafo platónico octaedro se encuentra representado planarmente en la siguiente figura.

(36)

Icosaedro

Como en todos los casos anteriores el grafo platónico icosaedro, al representar la figura geométrica de la que toma nombre, posee también sus mismas características. En el caso del icosaedro, 12 vértices de grado 5, con 30 aristas, para lograr formar 20 caras triangulares.

El grafo platónico icosaedro se encuentra representado planarmente en la siguiente figura.

(37)

Borrego Ropero Rafael 37 de 248 Recio Domínguez Daniel

Dodecaedro

La última de las figuras representadas en la aplicación y, por lo tanto, contenidas en el presente texto, mediante un grafo platónico es la del dodecaedro. Este grafo contará, pues, con los mismos 20 vértices y las mismas 30 aristas que dan a la figura mencionada sus características 12 caras pentagonales. Para ello, los vértices de este grafo tienen todos grado 3.

El grafo platónico dodecaedro se encuentra representado planarmente en la siguiente figura.

(38)

Herschel

Se ha incluido en la aplicación el grafo atribuido a Herschel ya que tiene la particularidad de constituir el ejemplo más pequeño de grafo poliédrico no-hamiltoniano.

(39)

Borrego Ropero Rafael 39 de 248 Recio Domínguez Daniel

Harary

Otra de las familias que se incluyen en el presente trabajo es la correspondiente a los grafos de Harary.

Los grafos de Harary se definen mediante dos parámetros: el número de vértices del grafo, que se denota por n; y el grado mínimo que debe tener cada vértice del grafo, que se denota por k. Debido a esta notación, los grafos de Harary suelen describirse mediante la simbología: Hk, n.

Estos grafos cumplen la propiedad de hacer que cada uno de sus vértices tenga, como mínimo grado k, pero utilizando para ello el mínimo número de aristas posible.

Un ejemplo de este tipo de grafos, donde se pueden observar las características descritas es H11, 10.

(40)

Grafos enlazados.

Los grafos enlazados se caracterizan porque, si numeramos sus vértices, las aristas del grafo enlazan vértices cuyo número se diferencia un una cantidad fija -que podemos llamar k-, es decir, siguiendo una determinada progresión lineal.

Por ejemplo, si hacemos k=2, el vértice 1 se uniría al 3, el 2 al 4, y así sucesivamente con todos los vértices del grafo.

Si en lugar de tener en cuenta tan sólo este valor de k, tomáramos una serie completa de valores k1, k2, ... , kn, obtendríamos un grafo que podríamos denominar n-enlazado. Los grafos enlazados más comunes son aquellos para los que n=1, que denotamos por Ln,r y aquellos en los que n=2, que denotamos por Ln,r,s.

Enlazados LN, R

Dado un grafo G, definido por un conjunto de vértices V y un conjunto de aristas A. Supongamos v1, ..., vn los vértices contenidos en V. Se dice que G es un grafo enlazado Ln, r si cumple que:

vi, vj∈ V, tales que (j<r ∧ j+n=i+r) ∨ (j=r ∧ j=i+r), la arista (vi, vj) ∈ A

Los grafos enlazados Ln, r se caracterizan porque todos sus vértices tienen grado dos. Para r>1, la forma de estos grafos, situando sus vértices en círculo, es de estrella, como se puede observar en el ejemplo de la figura. L5,2.

(41)

Borrego Ropero Rafael 41 de 248 Recio Domínguez Daniel

Enlazados LN, R, S

Dado un grafo G, definido por un conjunto de vértices V y un conjunto de aristas A. Supongamos v1, ..., vn los vértices contenidos en V. Se dice que G es un grafo enlazado Ln, r, s si cumple que:

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

Los grafos enlazados Ln, r, s se caracterizan porque todos sus vértices

tienen grado cuatro. Un ejemplo de estos grafos es el que se puede observar en la figura L7, 2, 3.

(42)

Grafo de Petersen

El grafo que aquí se presenta debe su nombre a que la primera persona que lo estudió fue Petersen en el año 1891. Las tres representaciones más habituales del grafo de Petersen.

Entre las muchas cualidades interesantes que presenta este grafo, podemos mencionar las siguientes.

Es un grafo 3-regular y de cintura 5, siendo además, el grafo de orden mínimo que cumple estas características.

Es un grafo de diámetro 2 lo que se traduce en que tiene 10 vértices de la forma más compacta posible.

Tiene valor de conectividad y de arista-conectividad 3, característica esta que ha sido ampliamente estudiada en la rama de las redes de

(43)

Borrego Ropero Rafael 43 de 248 Recio Domínguez Daniel

Grafo de Grötzsch.

Otro de los grafos que por su relevancia han sido incluidos en la aplicación como grafo singular es el denominado grafo Grötzsch. Para entender el interés que presenta este grafo es necesario primero introducir algunos conceptos de la Teoría de Grafos. A continuación pasamos a definir brevemente tales conceptos.

Para cualquier grafo G un subgrafo completo de G se denomina clique de G. El número de vértices del clique más grande de G se denomina el número clique de G y se denota por cl(G).

Sea G un grafo. Un coloreado de vértices de G asigna colores, normalmente denotados por 1, 2, 3,... a los vértices de G, uno por cada vértice, de forma que vértices adyacentes tienen asignados colores diferentes.

Un k-coloreado de G es un coloreado que consiste en k colores diferentes y, en ese caso, el grafo G se dice que es k-coloreable.

El mínimo número “k” para el cual existe un k-coloreado del grafo G se denomina número cromático de G (o índice cromático de G) .

Teorema: Para cada k≥1 existe un grafo k-cromático Mk que no tiene

subgrafos triángulos (K3).

De esta familia de grafos Mi denominada familia Mycielski, el de Grötzsch representa el grafo M4.

La siguiente figura muestra una representación del grafo de Grötzsch.

(44)

Grafo de Heawood

Se trata de un grafo 3-regular de cintura 6 con menor número de vértices.

(45)

Borrego Ropero Rafael 45 de 248 Recio Domínguez Daniel

Tutte

El grafo de Tutte es un grafo planar, 3-conexo no hamiltoniano.

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.

Una representación de este grafo como la de la figura nos permitirá comprobar las propiedades descritas.

(46)

Tipos de rutas

A continuación definiremos algunos conceptos sobre rutas que debemos conocer para comprender algunos de los algoritmos explicados.

Definiremos: Camino. Recorrido. Camino simple. Camino cerrado. Ciclo. Circuito.

Un camino “w” simple en un grafo G es una sucesión de alternada de vértices y aristas o arcos (si es dirigido) w: v0e1v1e2v2…vn-1envn comenzando y terminando

con vértices tal que ei = vi-1vi con 1≤ i ≤ n.

Diremos que “w” tiene longitud “n” si posee “n” aritas.

Un camino de longitud cero se denomina camino trivial. Ejemplo.

(47)

Borrego Ropero Rafael 47 de 248 Recio Domínguez Daniel

Un recorrido o trayectoria es un camino donde no se repiten aristas. Un posible ejemplo basándonos en el grafo anterior.

Recorrido 1: v4v2v5v3v1.

Recorrido 2: v5v3v1v2.

Un camino simple es un camino en el que no se repiten vértices. Camino simple: v4v2v5v3v1.

Un ciclo es un camino simple v0v1…vn con n ≥ 3, v0 = vn y los “n” vértices

son distintos. Al ciclo de longitud “n” lo denominaremos n-ciclo. Ciclo: v1v3v5v2v1

Un ciclo es un camino cerrado que cumple las propiedades anteriores y un camino simple es un camino abierto.

Un camino cerrado donde no se repiten es un circuito. Circuito: v1v2v5v3v2v4v3v1.

Vértices repetidos Aristas repetidas Abierto Cerrado Tipo ruta

SI SI Camino SI SI SI Camino cerrado SI NO Recorrido SI NO SI Circuito NO NO SI Camino simple NO NO SI Ciclo www.detodoprogramacion.com

(48)

Grafo complementario.

El grafo complementario de G (Ĝ) es un grafo con V(Ĝ) = V(G) y tal que si uv es una arista de Ĝ si y solo si uv no es una arista de G.

Ejemplo 1. (Grafo no dirigido)

(49)

Borrego Ropero Rafael 49 de 248 Recio Domínguez Daniel

Ejemplo 2. (Grafo dirigido).

Grafo complementario.

(50)

Grafo de línea.

El grafo de línea L(G) de G es un grafo que posee tantos vértices como aristas tiene G, es decir, | V(L(G)) | = | E(G) |. Dos vértices “v” y “u” de L(G) son adyacentes si “u” y “v” son aristas de G y inciden en un mismo vértice.

Ejemplo 1

(51)

Borrego Ropero Rafael 51 de 248 Recio Domínguez Daniel

(52)

Ejemplo 2.

(53)

Borrego Ropero Rafael 53 de 248 Recio Domínguez Daniel

(54)

3.- Algoritmos implementados.

3.1.- Algoritmos sobre caminos mínimos.

Algoritmo de Dijkstra.

Sea G un grafo ponderado no trivial la distancia entre dos vértices u y v en G es la longitud mínima ponderada de todos los caminos u-v en G, si existe, en otro caso infinito.

El algoritmo de Dijkstra calcula la distancia en desde un vértice fijo tomado como origen al resto de vértices del grafo.

Dicho algoritmo se ha implementado mediante técnicas de programación dinámica haciendo uso de una tabla en la que se van realizando una serie de cálculos previos para encontrar la distancia mínima entre el vértice origen y el resto de vértices del grafo.

Para llevar a cabo la implementación se ha usado una tabla bidimensional la cual posee tantas filas y columnas como vértices posee el grafo. Además se utilizan dos variables temporales “m” y “Vi“ las cuales se van

machacando en cada iteración las cuales almacenaran la distancia mínima recorrida hasta el momento y el vértice en el que nos encontramos actualmente en un determinado instante de la ejecución respectivamente. Inicialmente la variable “m” tiene el valor cero y “Vi“ almacena el vértice origen.

Además debemos saber que en cada posición se almacena una tupla de dos componentes. En la primera componente se almacena la distancia desde el vértice “Vi“al vértice que ocupa una determinada columna. Y en la segunda

almacenamos el vértice padre del vértice que ocupa la columna, que en cada iteración será “Vi“, a partir del cual se reconstruirá el camino mínimo.

Una vez que tenemos claro la información 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 vértice de la columna aún no tiene asignado ningún padre.

(55)

Borrego Ropero Rafael 55 de 248 Recio Domínguez Daniel

En cada iteración se rellena una fila, siguiendo los siguientes pasos: 1.- Buscamos los vértices adyacentes al vértice “Vi“ y en la columna

correspondiente al adyacente.

Si la distancia total recorrida hasta el momento más la distancia entre “Vi“ y el adyacente es menor o igual que la ya recorrida entonces

actualizamos la tupla con la nueva distancia y vértice padre.

Es importante actualizar la tabla si la distancia es igual ya que así conseguiremos obtener varias rutas mínimas entre el vértice origen y destino.

2.- A continuación tomamos como nuevo vértice “Vi“, el vértice

correspondiente a la columna cuya distancia es mínima. Una vez escogido el vértice cuya distancia es mínima 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 mínimo a partir de la misma es bastante fácil. Se ha optado por reconstruir el camino desde el vértice destino al vértice origen, por lo que el primer vértice que forma parte del camino parcialmente construido es el vértice destino.

Acto seguido nos situamos en la primera posición distinta de “*” de la columna correspondiente al vértice destino comenzando por la parte inferior de la tabla y el vértice padre es el siguiente que forma parte del camino. La longitud del camino viene determinada por la distancia almacenada en dicha posición.

Ahora nos situamos en la columna del vértice padre y repetimos el proceso anterior hasta llegar al vértice origen. En ese momento tendremos el camino mínimo completo.

Para que la exposición del algoritmo quede totalmente clara expondremos algunos ejemplos.

(56)

Ejemplo 1

Aplicamos el algoritmo de Dijkstra para encontrar el camino mínimo entre el vértice v1 y v8 obteniendo la siguiente tabla.

V1 (v2,P(v2)) (v3,P(v3)) (v4,P(v4)) (v5,P(v5)) (V6,P(v6)) (v7,P(v7)) (v8,P(v8)) m Vi (0,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) 0 V1 * (2,v1) (3,v1) (∞,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) 2 V2 * * (3,v1) (3,v2) (3,v2) (∞,NP) (∞,NP) (∞,NP) 3 V3 * * * (3,v2) (3,v2) (∞,NP) (6,v3) (∞,NP) 3 V4 * * * * (3,v2) (4,v4) (6,v3) (∞,NP) 3 V5 * * * * * (4,v5) (6,v3) (∞,NP) 4 V6 * * * * * * (6,v3) (8,v6) 6 V7 * * * * * * * (8,v7) 8 V8

A continuación reconstruiremos el camino desde el vértice v1 a vértice v8

comenzando por este último.

Para ir desde el vértice v8 al vértice v1 es necesario pasar por el padre

de v8. El camino construido hasta el momento es v8 v7  ...  v1.

Seguidamente miraríamos quien es el padre del último vértice que forma parte del camino parcialmente construido, en este caso es v3 y así

(57)

Borrego Ropero Rafael 57 de 248 Recio Domínguez Daniel

El camino completo es:

v8 {P(v8)}  v7 {P(v7)}  v3 {P(v3)}  v1 {P(v1)}.

Camino mínimo: v1  v3  v7  v8. La longitud del camino es 8.

Podemos observar en la columna del vértice de destino que existen dos tuplas con padres distintos e igual distancia lo cual no índica que existe más de un camino mínimo.

Reconstrucción del segundo camino:

v8 {P(v8)}  v6 {P(v6)}  v5 {P(v5)}  v2 {P(v2)}  v1 {P(v1)}.

Camino mínimo: v1  v2  v5  v6 v8. La longitud del camino es 8.

Podemos observar que en la columna correspondiente al vértice V6

existen dos tuplas con padres distintos y misma distancia por lo que existe otro camino mínimo más.

Reconstrucción del tercer camino:

v8 {P(v8)}  v6 {P(v6)}  v4 {P(v4)}  v2 {P(v2)}  v1 {P(v1)}.

Camino mínimo: v1  v2  v4  v6 v8. La longitud del camino es 8.

(58)

Ejemplo 2

Aplicamos el algoritmo de Dijkstra para encontrar el camino mínimo entre el vértice v1 y v4 obteniendo la siguiente tabla.

V1 (v2,P(v2)) (v3,P(v3)) (v4,P(v4)) (v5,P(v5)) m Vi (0,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) 0 V1 * (5,v1) (4,v1) (∞,NP) (∞,NP) 4 V3 * (5,v1) * (12,v3) (6,v3) 5 V2 * * * (7,v2) (6,v3) 6 V5 * * * (7,v5) * 7 V4

Recontracción del primer camino mínimo desde el vértice v1 a v4.

V4 {P(v4)}  v5 {P(v5)}  v3 {P(v3)}  v1 {P(v1)}.

Camino mínimo: v1  v3  v5  v4. La longitud del camino es 7.

Recontracción del segundo camino mínimo desde el vértice v1 a v4.

(59)

Borrego Ropero Rafael 59 de 248 Recio Domínguez Daniel

Ejemplo3

(60)

Aplicamos el algoritmo de Dijkstra para encontrar el camino mínimo entre el vértice v1 y v4 obteniendo la siguiente tabla.

V1 (v2,P(v2)) (v3,P(v3)) (v4,P(v4)) (v5,P(v5)) m Vi (0,NP) (∞,NP) (∞,NP) (∞,NP) (∞,NP) 0 V1 * (1,v1) (∞,NP) (∞,NP) (∞,NP) 1 V2 * * (4,v2) (∞,NP) (∞,NP) 4 V3 * * * (∞,NP) (∞,NP) * * * * *

En este caso observamos que el vértice destino no tiene padre asignado, lo cual nos indica que el grafo no es conexo, por lo que no existe ningún camino entre el vértice origen y destino.

(61)

Borrego Ropero Rafael 61 de 248 Recio Domínguez Daniel

Algoritmo de Floyd.

El algoritmo de Floyd calcula el camino mínimo entre todos los pares de vértices del grafo ponderado y no negativo mediante técnicas de programación dinámica.

Para ello calcularemos una serie de matrices Dk[i,j] que debe cumplir:

Donde Dk[i, j] = mínimo(Dk-1[i,k] + Dk-1[k,j]), D[i][j]). Longitud del camino más

corto para ir desde el vértice “i” al vértice “j” pudiendo pasar por los vértices 1,2,..., hasta k.

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.

Además para reconstruir el camino se hace uso de una matriz de trayectorias donde en cada iteración si se mejora el camino desde el vértice “i” al vértice “j” pasado por “k”, este se anota en la matriz de trayectorias.

El algoritmo de Floyd quedaría:

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 // Vértice de paso. fsi

fsi fdesde fdesde

fdesde

Dk-1[i, k]+ Dk-1[k, j] (pasando por k).

Dk-1[i, j] (no pasando por k).

Dk[i, j] =

(62)

fin

A continuación veremos un ejemplo con más detalle: Ejemplo1

Calcularemos la sucesión de matrices Dk. Sea M[i,j] la matriz de

adyacencias del grafo.

M [j, j] =

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 0 5 ∞ ∞

V2 50 0 15 5

V3 30 ∞ 0 15

(63)

Borrego Ropero Rafael 63 de 248 Recio Domínguez Daniel

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.

D2 = P[i,j] =

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.

D3 = P[i,j] =

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.

D4 = P[i,j] = V1 V2 V3 V4 V1 0 5 20 10 V2 50 0 15 5 V3 30 35 0 15 V4 15 20 5 0 V1 V2 V3 V4 V1 0 0 2 2 V2 0 0 0 0 V3 0 1 0 0 V4 0 1 0 0 V1 V2 V3 V4 V1 0 5 20 10 V2 45 0 15 5 V3 30 35 0 15 V4 15 20 5 0 V1 V2 V3 V4 V1 0 0 2 2 V2 3 0 0 0 V3 0 1 0 0 V4 0 1 0 0 V1 V2 V3 V4 V1 0 5 15 10 V2 20 0 10 5 V3 30 35 0 15 V4 15 20 5 0 V1 V2 V3 V4 V1 0 0 4 2 V2 4 0 4 0 V3 0 1 0 0 V4 0 1 0 0 www.detodoprogramacion.com

(64)

¿Cómo se reconstruye el camino?.

Para ir desde un vértice vi a un vértice vj consultamos la posición P[i,j] de la

matriz de trayectorias:

Si es “0” entonces existe camino directo para ir desde el vértice “i” al “j” y el camino se obtiene directamente.

En otro caso sea Vpaso = P[i,j]. Ahora visitamos la posición P[Vpaso,j] repitiendo el mismo proceso.

Reconstrucción del camino mínimo para ir desde el vértice v2 al vértice v3.

P[2,3] = 4 por lo que para ir de v2 a v3 es necesario pasar por el vértice 4.

P[4,3] = 0 existe camino directo.

(65)

Borrego Ropero Rafael 65 de 248 Recio Domínguez Daniel

3.2.- Algoritmos de distancias.

Excentricidad de un vértice.

La excentricidad de un vértice “v” de un grafo G es la distancia de “v” al vértice más alejado de él, es decir, se trata de la mayor longitud del camino más corto entre el vértice y cualquier otro.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calculamos Dijsktra desde el vértice “v” a resto de vértices del grafo. 2.- Finalmente de todos los caminos mínimos obtenidos tomamos la longitud mayor.

Seguidamente veremos un ejemplo.

Para el grafo de la figura calcularemos la excentricidad del vértice v1.

Distancia mínima Valor camino mínimo

distmin(v1, v2) 5

distmin(v1, v3) 4

distmin(v1, v4) 7

distmin(v1, v5) 6

(66)
(67)

Borrego Ropero Rafael 67 de 248 Recio Domínguez Daniel

Radio de un grafo.

El radio de un grafo G es la excentricidad más pequeña de cualquiera de sus vértices.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vértice obtenemos la excentricidad.

2.- Obtener la excentricidad más pequeña.

Veamos un ejemplo.

Para el grafo de la figura calcularemos el radio.

Distancia mínima Valor camino mínimo

distmin(v1, v2) 5

distmin(v1, v3) 4

distmin(v1, v4) 7

distmin(v1, v5) 6

(68)

Distancia mínima Valor camino mínimo

distmin(v2, v1) 5

distmin(v2, v3) 5

distmin(v2, v4) 2

distmin(v2, v5) 3

Distancia mínima Valor camino mínimo

distmin(v3, v1) 4

distmin(v3, v2) 5

distmin(v3, v4) 3

distmin(v3, v5) 2

Distancia mínima Valor camino mínimo

distmin(v4, v1) 7

distmin(v4, v2) 2

distmin(v4, v3) 3

distmin(v4, v5) 1

Distancia mínima Valor camino mínimo

distmin(v5, v1) 6

distmin(v5, v2) 3

distmin(v5, v3) 2

distmin(v5, v4) 1

Como sabemos la excentricidad de cada vértice es la mayor longitud del camino más corto. A partir de los cálculos realizados con anterioridad podemos obtener una tabla con la excentricidad de cada vértice.

Para obtener el radio basta con obtener el mínimo del array. v1 v2 v3 v4 v5

(69)

Borrego Ropero Rafael 69 de 248 Recio Domínguez Daniel

Diámetro de un grafo.

El diámetro de un grafo G es la mayor distancia existente entre dos vértices cualesquiera del grafo, es decir, es la excentricidad más grande de cualquiera de sus vértices.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vértice obtenemos la excentricidad.

2.- Obtener la excentricidad máxima.

Veamos un ejemplo:

Para el grafo de la figura obtendremos el diámetro, aprovechado los cálculos anteriores realizados para el radio. El diámetro del grafo es 7.

(70)

Distancia de un vértice.

La distancia de un vértice "v" en un grafo G ponderado o no, es la suma de las distancias mínimas a todos los vértices del grafo.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calcula Dijsktra para todos los vértices del grafo.

2.- Sumar todas las distancias.

Si entre un vértice “v” y otro cualquiera existiera más de un camino mínimo 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 vértice v1 y v5.

(71)

Borrego Ropero Rafael 71 de 248 Recio Domínguez Daniel

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

Antes de comentar los algoritmos de la mediana y el centro de un grafo definiremos el concepto de subgrafo inducido por el conjunto de vértices del grafo.

Sea “S” un conjunto de vértices no vació de un grafo G. El subgrafo inducido por “S” es el subgrafo maximal de G, con vértices en el conjunto “S”. Las aristas que forman parte del subgrafo inducido son todas las aristas de G que inciden o unen vértices de S.

(72)

Algoritmo de la mediana.

La mediana de un grafo G es el subgrafo inducido por los vértices que tienen mínima distancia.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Calcular la distancia de cada vértice. .

2.- Escoger el subconjunto de vértices de mínima distancia.

3.- Construir el subgrafo inducido por dicho conjunto de vértices obtenidos en el paso 2.

Veamos un ejemplo.

Calcular la mediana en el siguiente grafo.

distancia(V1) 22

distancia(v2) 15

distancia(v3) 14

(73)

Borrego Ropero Rafael 73 de 248 Recio Domínguez Daniel

En este caso la mediana del grafo esta formada por un único vértice. Dicho vértice es v5.

Algoritmo del centro.

El centro de un grafo G, es el subgrafo inducido por los vértices que tienen excentricidad mínima.

Para implementar el algoritmo pueden seguirse los siguientes pasos: 1.- Para cada vértice calculamos la excentricidad.

2.- Escoger el subconjunto de vértices de mínima excentricidad.

3.- Construir el subgrafo inducido por dicho conjunto de vértices obtenidos en el paso 2.

Veamos un ejemplo

Aprovechamos el cálculo de la excentricidad realizado anteriormente.

v1 v2 v3 v4 v5

7 5 5 7 6

(74)

El subconjunto de vértices de mínima excentricidad esta formado por los vértices v2 y v3.

(75)

Borrego Ropero Rafael 75 de 248 Recio Domínguez Daniel

3.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 vértices o, lo que es lo mismo, a partir de cualquier vértice es posible alcanzar a todos los demás.

Para la implementación se realiza mediante técnicas de programación dinámica. Se hace uso de un array en la que cada posición hace referencia a un vértice del grafo.

Aquellas posiciones que al finalizar la ejecución posean el mismo valor estarán conectadas y formaran parte de la misma componente conexa.

Inicialmente se suponen todos los vértices 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 vértice 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 vértices 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 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

(76)

v1 v2 v3 v4 v5 v6 Mayor Menor

1 2 3 4 5 6 * *

En principio todos los vértices están desconectados.

v1 v2 v3 v4 v5 v6 Mayor Menor

1 2 3 1 5 6 4 1

El vértice v1 y v4 están conectados.

Actualizada la posición del vértice v4.

v1 v2 v3 v4 v5 v6 Mayor Menor

1 2 3 1 2 6 5 2

El vértice v2 y v5 están conectados.

Actualizada la posición del vértice v5.

v1 v2 v3 v4 v5 v6 Mayor Menor

1 2 3 1 2 3 6 3

El vértice v3 y v6 están conectados.

Actualizada la posición del vértice v6.

Como puede apreciarse el grafo posee tres componentes conexas que son v1v4 , v2v5 y v3v6 .

(77)

Borrego Ropero Rafael 77 de 248 Recio Domínguez Daniel

Vértices de corte.

Sea G un grafo y “v” un vértice de G. Se dice que “v” es un vértice de corte si al eliminar el vértice del grafo este es no conexo, es decir, el número de componentes conexas es mayor que uno.

La implementación del algoritmo consta de los siguientes pasos:

1.- Calculamos las componentes conexas que posee inicialmente el grafo.

2.- Eliminamos un vértice del grafo.

3.- En estas condiciones se calculan el número de componentes conexas. Si el número de componentes actuales es distinto del número de componentes calculadas inicialmente más uno, entonces se trata de un vértice de corte.

4.- Restauramos el vértice borrado, así como sus aristas y repetimos el proceso con el resto de vértices (ir al paso 2).

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.

(78)

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 implementación 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 número de componentes conexas. Si el número de componentes actuales es distinto del número 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)

(79)

Borrego Ropero Rafael 79 de 248 Recio Domínguez 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 partición en el conjunto de las aristas.

Un grafo conexo no trivial sin vértices de corte recibe el nombre de grafo no separable.

Un subgrafo G1 de G es maximal con respecto a una propiedad si no hay

ningún otro subgrafo que también 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 partición del conjunto de las aristas. c) Cada dos bloques a lo sumo tienen un vértice en común y este es un vértice de corte.

d) Un bloque con exactamente un vértice de corte se denomina bloque final.

e) Un grafo G conexo con al menos un vértice de corte tiene como mínimo dos bloques.

f) Una arista puente es considerada un bloque.

El algoritmo para el cálculo de bloque consta de 6 pasos:

1.- Calcular los vértices de corte y aristas puente del grafo.

2.- Eliminar los vértices de corte del grafo (guardando las aristas). 3.- Calcular las componentes conexas.

4.- Restaurar los vértices de corte junto con las aristas y eliminar las aristas puente del grafo.

(80)

5.- Para cada vértice de corte y aristas de cada componente conexa. Si G existe una arista formada por el vértice de corte y el vértice origen o destino (o al contrario, es decir, el vértice origen o destino y el vértice de corte en caso de ser un grafo dirigido) de una arista de la componente conexa actualmente procesada almacenamos la arista formada por el vértice de corte en un conjunto S.

Una vez procesadas todas las aristas de la componente conexa actual, añadimos todas las aristas almacenadas en S, a la componente actual, obteniendo las aristas de uno de los bloques del grafo.

6.- Finalmente añadimos como bloques todas las aristas puente del grafo a la vez que las restauramos en el grafo G.

A continuación veremos un ejemplo para cada tipo de grafo. Ejemplo para un grafo no dirigido.

PASO 1.

(81)

Borrego Ropero Rafael 81 de 248 Recio Domínguez Daniel

PASO 2.

Eliminamos el vértice de corte y guardamos las aristas eliminadas {v5v6, v5v4, v1v5, v3v5}.

PASO 3.

Componentes conexas {{v1v2, v1v3, v3v2}, {v4}, {v6}}.

PASO 4.

Restauramos el único vértice de corte v5 junto con las aristas

eliminadas {v5v6, v5v4, v1v5, v3v5} y eliminamos las aristas puente.

(82)
(83)

Borrego Ropero Rafael 83 de 248 Recio Domínguez Daniel

PASO 5.

Comprobamos si en el grafo existe alguna arista formada por v5 y

algún vértice de las aristas de la componente conexa. Este proceso se realiza para cada una de las componentes conexas.

Componentes conexas {{v1v2, v1v3, v3v2}, {v4}, {v6}}.

Primera componente conexa {v1v2, v1v3, v3v2}.

Conjunto de aristas encontradas {v5v1, v5v3}.

Añadimos las aristas encontradas a la lista de aristas de la primera componente conexa obteniendo las aristas del primer bloque.

Bloque 1 {v1v2, v1v3, v3v2, v5v1, v5v3}.

El resto de componentes conexas nos las saltamos, pues no tienen aristas que procesar.

PASO 6

Finalmente añadimos las aristas puente como bloque del grafo.

Bloque 2 {v4v5}.

Bloque 3 {v5v6}.

Bloques del grafo:

Bloque 1 {v1v2, v1v3, v3v2, v5v1, v5v3}.

Bloque 2 {v4v5}.

Bloque 3 {v5v6}.

(84)

Ejemplo para un grafo dirigido.

PASO 1.

Vértices de corte {v2, v3}.

(85)

Borrego Ropero Rafael 85 de 248 Recio Domínguez Daniel

PASO 2.

Eliminamos el vértice de corte y guardamos las aristas eliminadas {v2v3, v2v5, v1v2, v4v2, v3v6, v3v7}.

PASO 3.

Componentes conexas {{v1v5, v5v4}, {v6v7}}.

(86)

PASO 4.

Restauramos los vértices de corte junto con las aristas eliminadas {v2v3, v2v5, v1v2, v4v2, v3v6, v3v7} y eliminamos las aristas puente.

PASO 5.

Comprobamos si en el grafo existe alguna arista formada por algún vértice de cortey algún vértice de las aristas de la componente conexa. Este proceso se realiza para cada una de las componentes conexas.

Componentes conexas {{v1v5, v5v4}, {v6v7}}.

Primera componente conexa {v1v5, v5v4}.

Conjunto de aristas encontradas {v2v5, v1v2, v4v2}

Con el vértice v3 no se encontró ninguna arista.

Añadimos las aristas encontradas a la lista de aristas de la primera componente conexa obteniendo las aristas del primer bloque.

(87)

Borrego Ropero Rafael 87 de 248 Recio Domínguez Daniel

Segunda componente conexa {v6v7}.

Conjunto de aristas encontradas {v3v6, v3v7}.

Con el vértice v2 no se encontró ninguna arista.

Añadimos las aristas encontradas a la lista de aristas de la segunda componente conexa obteniendo las aristas del segundo bloque.

Bloque 2 {v6v7, v3v6, v3v7}.

PASO 6

Finalmente añadimos las aristas puente como bloque del grafo. Bloque 3 {v2v3}.

Bloques del grafo:

Bloque 1 {v1v5, v5v4, v2v5, v1v2, v4v2}.

Bloque 2 {v6v7, v3v6, v3v7}.

Bloque 3 {v2v3}.

(88)

3.4.- Algoritmos de búsquedas.

Búsqueda en profundidad (DFS) .

El algoritmo de recorrido en profundidad, en inglés 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 búsqueda en profundidad obtiene un árbol recubridor de G. Se trata de un grafo en el que aparecen todos los vértices de G, pero no todas sus aristas.

El árbol recubridor no es único depende del vértice de partida.

El algoritmo puede implementarse mediante una pila, de tal forma que el vértice 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 vértices adyacentes al vértice activo, añadiéndose al árbol recubridor la arista que une el vértice activo con dicho adyacente.

Puede ocurrir que el vértice activo no posea adyacentes o que todos hayan sido visitados con anterioridad y aún no se han visitados todos los vértices del grafo, en tal caso el vértice es retirado de la pila y continuamos con el proceso con el nuevo vértice activo.

El algoritmo termina cuando la pila está completamente vacía, lo que es equivalente a decir que todos los vértices del grafo han sido visitados.

Seguidamente detallaremos los pasos del algoritmo en un ejemplo.

(89)

Borrego Ropero Rafael 89 de 248 Recio Domínguez Daniel

Aplicaremos el algoritmo de búsqueda en profundidad comenzando por el vértice v1

Pila Vértices Aristas Visitados

v1 v2 v1 v2 v1 v2 v1 v2 v3 v2 v3 v1 v2 v3 v1 v2 v3 v5 v3 v5 v1 v2 v3 v5 v1 v2 v3 v5 * * v1 v2 v3 v5 v1 v2 v3 v6 v3 v6 v1 v2 v3 v5 v6 v1 v2 v3 v6 v4 v6 v4 v1 v2 v3 v5 v6 v4 v1 v2 v3 v6 v4 * * v1 v2 v3 v6 * * v1 v2 v3 * * v1 v2 * * v1 * * Pila vacía * *

La columna de vértices visitados puede ser útil para no introducir en la pila vértices considerados anteriormente. Además afinando un poco mas y aprovechado el conjunto de vértices visitados podemos para la ejecución del algoritmo cuando dicho conjunto contenga todos los vértices del grafo sin necesidad de vaciar la pila.

Orden en el que se visitan los vértices: v1, v2, v3, v5, v6 y v4.

Puede observarse que el árbol recubridor construido depende del vértice de partida y del orden en el que se visiten los adyacentes al vértice activo.

Árbol recubridor obtenido:

(90)

Búsqueda en anchura (BFS) .

El algoritmo de recorrido en anchura, en inglés breadth-first search y que denotaremos BFS para abreviar, al igual que el algoritmo de búsqueda en

profundidad permite obtener un árbol recubridor donde los vértices 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 vértice de partida el orden en que se visitan los vértices adyacentes al vértice activo.

El algoritmo puede implementarse mediante una cola, de tal forma que el vértice 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 vértices adyacentes al vértice activo, añadiéndose al árbol recubridor la arista que une el vértice activo con dicho adyacente. Los vértices adyacentes son introducidos por el final de la cola de tal forma que el vértice activo no cambia, hasta que este se queda sin adyacentes, en este momento el vértice es extraído de la cola y se repite el proceso con el resto de vértices, hasta que todos los vértices del grafo han sido visitados.

Seguidamente detallaremos los pasos del algoritmo en un ejemplo. Ejemplo

(91)

Borrego Ropero Rafael 91 de 248 Recio Domínguez Daniel

Aplicaremos el algoritmo de búsqueda en anchura comenzando por el vértice v1.

Cola Vértices Aristas Visitados

v1 v2 v1 v2 v1 v2 v2v1 v4 v1 v4 v1 v2 v4 v4 v2v1 v6 v1 v6 v1 v2 v4 v6 v4 v2 * * v1 v2 v4 v6 v4 v2 v3 v2v3 v1 v2 v4 v6 v3 v3v4 v2 * * v1 v2 v4 v6 v3 v3v4 * * v1 v2 v4 v6 v3 v3 v5 v3 v5 v1 v2 v4 v6 v3 v5 v5 v3 * * v5 * * Cola vacía * *

La columna de vértices visitados puede ser útil para no introducir en la cola vértices considerados anteriormente. Además afinando un poco mas y aprovechado el conjunto de vértices visitados podemos para la ejecución del algoritmo cuando dicho conjunto contenga todos los vértices del grafo sin necesidad de vaciar la cola.

Orden en el que se visitan los vértices: v1, v2, v4, v6, v3 y v5.

Puede observarse que el árbol recubridor construido depende del vértice de partida y del orden en el que se visiten los adyacentes al vértice activo.

Árbol recubridor obtenido:

(92)

3.5.- Árboles recubridores de peso mínimo.

Se han implementado dos algoritmos que devuelven un árbol recubridor o un bosque de peso mínimo si el grafo no es conexo.

Algoritmo de Boruvka.

El algoritmo de Boruvka obtiene un árbol recubridor mínimo en un grafo G ponderado y conexo (no se admiten ponderaciones negativas).

El algoritmo de Boruvka consiste en elegir desde cada vértice la arista de menor peso que sale de él, y así formar al inicio un conjunto de componentes de vértices unidos por dichas aristas.

A partir de entonces en cada paso se busca la arista de menor peso entre los vértices de cada componente y un vértice que no lo sea, es decir, cada componente se unirá a otra distinta. El algoritmo termina cuando todos los vértices del grafo pertenecen a la misma componente.

A este algoritmo también se le denomina "el algoritmo de las burbujas". El grafo se cubre por una colección de burbujas y en cada paso cada burbuja se adhiere a su burbuja más cercana.

(93)

Borrego Ropero Rafael 93 de 248 Recio Domínguez Daniel

Paso 1

Elegimos de cada vértice la arista de menor para formar un conjunto de componentes de vértices.

(94)

Paso 2

Buscamos las aristas de menor peso entre vértices de componentes distintas.

Como el grafo ya es conexo el algoritmo termina. El peso del árbol recubridor es 16.

(95)

Borrego Ropero Rafael 95 de 248 Recio Domínguez Daniel

Veamos otro ejemplo.

Paso 1

Elegimos de cada vértice la arista de menor para formar un conjunto de componentes de vértices.

(96)

Paso 2

Buscamos las aristas de menor peso entre vértices de componentes distintas.

(97)

Borrego Ropero Rafael 97 de 248 Recio Domínguez Daniel

El grafo ya es conexo por lo que el algoritmo termina. El peso del árbol recubridor es 66.

Referencias

Documento similar

Thus, the main objectives were (i) to compare the treatment efficiencies of each system for sulfonamide removal; (ii) to investigate the effects of some operational conditions, such

Dada la siguientes gráficas de las parábolas, encontrar su ecuación y todos sus elementos (vértices, los focos, las directrices, la excentricidad y longitud del

Este documento destaca nuestra visión colectiva sobre la Transición Energética Justa, tal como debatieron las/os participantes y se expresó en los seminarios virtuales de Amigos de

~ Ibid., p. 99: “El pensamiento no se piensa a si mismo, poniendo algo como simple momento de su reflesieius, ni piensa algo ya pensado como momento de pensar abstracto, sino que,

El problema de resolver una congruencia se reduce siempre a resolver congruencias módulo p, ó módulo p k.. , p nj ; pero esto no es del todo inmediato por la presencia de

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en

P.3: Pues no se en dos años si nos hemos conocido mucho pero igual siempre hay situaciones nuevas a las que hay que enfrentarse donde uno donde uno, termina conociendo otras

La Participación Escolar constituye uno de los principios básicos de una sociedad democrática y como tal se recoge en nuestra Constitución en el Artículo 27.5, cuando dice que