TEORÍA DE GRAFOS Contenido • Qué es la Teoría de Grafos. Historia y aplicaciones • Nociones básicas de grafos • Grafos Eulerianos • Grafos Hamiltonianos • Matriz de Adyacencia •Grafos Planos • El camino más corto. Algoritmo de Dijkstra • Árboles • Árbol de Expansión Mínima. Algoritmos de Prim y Kruskal Qué es la Teoría de Grafos Con la teoría de grafos se busca representar de forma visual conjuntos de datos abstractos en formas de nodos o vértices y la unión o relaciones que estas pueden tener con otros nodos a través de aristas. Gracias a esta teoría se han podido lograr grandes avances en el análisis de amplios volúmenes de data. En la actualidad los grafos integran parte central de un número increíble de soluciones a problemas complejos. El origen de la palabra grafo es griego y significa "trazar". Un grafo es con frecuencia la respuesta a problemas de la vida cotidiana. Qué es la Teoría de Grafos Algunos ejemplos podrían ser: un gráfico de una serie de tareas a realizar indicando su secuenciación (un organigrama), grafos matemáticos representando las relaciones binarias, una red de carreteras o de tránsito, la red de enlaces ferroviarios o aéreos, la red eléctrica de una ciudad, sistemas de telecomunicaciones, circuitos impresos o redes de computadores. En muchos casos un problema es conveniente representarlo gráficamente como un conjunto de puntos (nodos o vértices) conectados por líneas (arcos) según los requerimientos. Hoy en día es rara la disciplina científica o humanística que no utilice la teoría de grafos. se puede citar la sicología en dinámica de grupos, la sociología en los sociogramas, la física teórica que emplea los diagramas de Feynmann, donde se presenta mediante líneas las partículas elementales, en programación lineal e investigación operativa el estudio de flujo en redes, los cambios de variables enel cálculo diferencial,... Los grafos son estructuras de datos dinámicas no-lineales, utilizadas comúnmente en el análisis de redes, en diseño de circuitos eléctricos, en estrategias de mercados, cartografía, mapas conceptuales, matemática, planificación de procesos y muchas áreas del conocimiento. Nociones básicas de grafos Un grafo G = (V; E) es un par formado por dos conjuntos V y E. El conjunto V es un conjunto finito de vértices, mientras que E es un conjunto de aristas que unen dos vértices de V . Si u y v son vértices unidos por una arista, podemos representar esta arista por (u; v). Dos vértices pueden estar unidos por más de una arista, por lo que habría que especificar qué arista estamos tomando en cada caso. Los grafos sirven para representar esquemáticamente un determinado problema, como el de los puentes de Königsberg. Este problema trataba de averiguar si era posible recorrer todos los puentes de la ciudad pasando una única vez por cada puente de forma que se llegara al punto de partida. El problema fue resuelto por Euler haciendo uso, al parecer por primera vez, del concepto de grafo • El orden del grafo G es el número de elementos del conjunto de vértices V . • Para cada vértice, v Є V , se llama grado de v, denotado deg v, al número de aristas que salen o llegan a v. • El grafo se dirá grafo simple si dos vértices de V están unidos por a lo sumo una artista. • Utilizaremos el término multigrafo para denotar grafos no simples. • El término pseudografo se reserva a grafos que admiten aristas empezando y terminando en el mismo vértice. • Si las aristas de un grafo indican una dirección, el grafo se dirá dirigido, y no dirigido en caso contrario. Salvo que se indique lo contrario, supondremos que todos los grafos son no dirigidos. • Dos vértices son adyacentes si existe una arista que los une. Grafo simple Multigrafo Pseudografo Grafo completo: A un grafo de n vértices todos unidos entre sí se le llama grafo completo y se nota por Kn. Por ejemplo K1 es un grafo con un solo vértice, K2 es un grafo con dos vértices y una arista que los une. Dos representaciones de K4 Subgrafo: Dado un grafo G = (V; E), un subgrafo de G es otro grafo G* = (V* ; E*) de forma que V* ⊆ V y E* ⊆ E. Teorema Sea G = (V; E) un grafo. Entonces 2 Al contar las aristas, éstas se cuentan dos veces ya que unen dos vértices distintos . Camino Un camino en un grafo G = (V; E) es una secuencia alternada de vértices y aristas de la forma V1 ; e1 ; v2 ; e2 ; ….. Vn-1 ; en-1 ; vn donde cada arista ei conecta los vértices vi y vi+1, i = 1; 2; …. ; n-1 • La longitud del camino es el número de aristas del mismo. Cuando se trata de un grafo simple, el camino puede representarse simplemente por sus vértices v1; v2; …. ; vn-1; vn. • Un camino se dice cerrado si v1 = vn. • Un camino se dice simple si todos los vértices del mismo son distintos. • Un ciclo es un camino cerrado de forma que vi ≠ vj para todo i; j Є {2; 3; … ; n-1} e i ≠ j. • Un recorrido es un camino de forma que ei ≠ ej , i; j Є {1; 2; …; n-1} e i ≠ j Un grafo es conexo si cualesquiera dos de sus vértices se pueden unir por un trayectoria. Un grafo que no es conexo se dice que es disconexo, este está formado por varios pedazos, a los pedazos se les dice componentes conexas. El primer grafo de la siguiente figura es conexo, mientras que el segundo y el tercero no lo son. El segundo grafo tiene dos componentes conexas y el tercero tres componentes. GRAFOS EULERIANOS Y HAMILTONIANOS 1. Grafos Eulerianos Un grafo conexo G = (V; E) es Euleriano si existe un recorrido cerrado de longitud |E| (cardinal del conjunto E = número de aristas del conjunto) que incluya todos los vértices. 2. Grafos Hamiltonianos Un grafo conexo G = (V; E) es Hamiltoniano si existe un ciclo de longitud |V| (cardinal del conjunto V = número de vértices del conjuntos), o equivalentemente, si se pasa por cada vértice una única vez, salvo el primero y último vértice Euleriano y Hamiltoniano Hamiltoniano y no Euleriano Euleriano y no Hamiltoniano Ni Euleriano Ni Hamiltoniano Teorema 2 (Existencia de circuitos de Euler). 1. Si en un grafo algún vértice tiene grado impar, entonces no puede tener un circuito de Euler. 2. Si todos los vértices de un grafo conexo tienen grado par, entonces hay por lo menos un circuito de Euler. Teorema de Ore Sea G = (V; E) un grafo simple conexo de orden n = |V |≥ 3. Si para cada par de vértices no adyacentes u; v se cumple que: deg u + deg v ≥ n; entonces G es Hamiltoniano. Conclusiones Luego de entender la teoría presentada en las secciones anteriores es posible argumentar una respuesta al problema de los puentes de Königsberg. El grafo asociado a este problema tiene en total cuatro vértices, todos de grado impar, por tanto se puede concluir que no existe ni una trayectoria de Euler y mucho menos un circuito de Euler, por lo que es imposible entonces visitar las cuatro ciudades cruzando cada puente una sola vez. Matriz de Adyacencia La matriz de adyacencia es ˙til para trabajar con grafos de forma computacional. Dado un grafo simple G = (V; E), supongamos una ordenación de sus vértices de la forma V = {v1; v2; …; vn} Se define la matriz de adyacencia del grafo A = (aij ) de forma que aij = 1 si existe una arista uniendo vi y vj , y aij = 0 en caso contrario. Por ejemplo, el grafo completo K4 tiene matriz de adyacencia Grafo Plano Un grafo o multigrafo es plano si todas sus aristas se intersecan sólo en los vértices, es decir, no se cruzan. La representación del grafo de forma que sus aristas no se cortan se llama mapa. Dado un mapa de un grafo conexo, puede observarse que de forma natural, las aristas del grafo dividen a éste en un número finito de regiones, que están delimitadas por caminos cerrados, de forma que no contiene aristas en su interior. Éste es un grafo 3-regular, pues todos los vértices tienen grado 3, y es plano ya que sus aristas no se cortan. El segundo grafo, K4, parece no plano pues sus aristas (x,z) y (w,y) se intersecan. Sin embargo el grafo puede dibujarse como está hecho a la derecha. En esta nueva representación las aristas solo se intersecan en los vértices, por lo tanto, K4 es plano Teorema Sea G = (V; E) un grafo plano conexo. Entonces Cada arista se recorre dos veces, bien porque las regiones sean adyacentes y compartan la arista en el camino que los delimita, bien porque tenga que recorrerse dos veces para cerrar el camino que delimita la región. Teorema Consideremos un mapa de un grafo plano conexo G = (V; E). Entonces El camino más corto Comenzaremos definiendo un grafo ponderado. Dado un grafo G = (V, E) conexo y sin lazos, se llamará ponderado si cada arista tiene asignado un peso (positivo) Este peso puede representar la distancia entre dos vértices, el costo para ir de un vértice a otro o el tiempo que se tarda en trasladarse entre dos vértices. En muchas situaciones nos interesa hallar el camino más corto entre dos vértices o, si los pesos representan costos, el camino más económico para trasladarse de un vértice a otro. Según la complejidad del grafo esto puede resolverse por prueba y error, buscando los distintos camino, o puede requerir de un trabajo más sistemático. En estos casos, aplicaremos el Teorema de Dijkstra que en este apunte aprenderemos a través de un ejemplo. Teorema de Dijkstra Sea el Grafo G = (V, E) , conexo, sin lazos y ponderado. Vamos a buscar el camino de peso mínimo que una el vértice a con el vértice f Primer paso: calculo los pesos de las aristas que unen a con el resto de los vértices. Si no hay aristas la distancia es infinita. De todos los vértices elijo el de menor peso, para que sea el nuevo vértice desde el que calcularé los pesos a los restantes vértices Si a a - b 3(a) c 6(a) d ∞ e ∞ f ∞ Camino a,b Si es el subconjunto de V en el que iremos colocando los vértices que elegiremos en cada paso como el de menor peso y desde el cual calcularemos los pesos a los restantes vértices Segundo paso: calculo los pesos de las aristas desde b, considerando que b ya tenía un peso de 3 (que se suma a los otros) Ahora el vértice con menor peso es c Si a a,b a - b 3(a) - c 6(a) 4(b) d ∞ 8(b) e ∞ 6(b) f ∞ ∞ Camino a,b a,b,c Tercer paso: calculo los pesos de las aristas desde c. Como en el caso de el vértice e, ir desde c no lo mejora ya que sería un peso de 8 (mayor que 6 que es el que ya teníamos) mantengo el de 6 (b). Elijo como nuevo vértice d Si a a,b a,b,c a - b 3(a) - c 6(a) 4(b) - d ∞ 8(b) 5( c) e ∞ 6(b) 6(b) f ∞ ∞ ∞ Camino a,b a,b,c a,b,c,d Cuarto paso: calculo los pesos de las aristas desde d. Como en el caso de el vértice e, ir desde d no lo mejora ya que sería un peso de 7 (mayor que 6 que es el que ya teníamos) mantengo el de 6 (b). Elijo como nuevo vértice e. Ahora el camino es a, b, e. Si a a,b a,b,c a,b,c,d a - b 3(a) - c 6(a) 4(b) - d ∞ 8(b) 5( c) - e ∞ 6(b) 6(b) 6(b) f ∞ ∞ ∞ 11(d) Camino a,b a,b,c a,b,c,d a,b,e Quinto paso: calculo el peso de la arista (d,e), considerando que ya tiene un peso de 6 acumulado por el camino de a a b y de b a e. Si a a,b a,b,c a,b,c,d a,b,c,d,e a - b 3(a) - c 6(a) 4(b) - d ∞ 8(b) 5( c) - e ∞ 6(b) 6(b) 6(b) - f ∞ ∞ ∞ 11(d) 9 ( e) Camino a,b a,b,c a,b,c,d a,b,e a, b, e, f CONCLUSIÓN: el camino de peso mínimo es a, b, e, f con un peso total de 9. Árboles Un árbol G = (V ; E) es un grafo conexo sin ciclos. Dos ejemplos de árboles Es fácil darse cuenta de que eliminar una arista del árbol elimina la propiedad de conexión, dejando dos componentes conexas. Añadir una arista entre dos vértices del árbol crea un ciclo, por lo que rompe la propiedad de árbol. Finalmente, en un árbol existe un único camino entre dos vértices que los une sin repetir vértices. Recíprocamente, si esa propiedad ocurre, entonces el grafo no tiene ciclos, por lo que se trata de un árbol. En un árbol, se puede elegir cualquier vértice como raíz o nivel cero del mismo. Los vértices adyacentes a la raíz estarán en el nivel uno. Seguimos este proceso hasta llegar a los vértices que no tienen nuevos vértices adyacentes, que se denominan hojas del árbol. Las aristas del árbol se llaman ramas. Árbol de Expansión Dado un grafo conexo, no dirigido G. Un árbol de expansión es un árbol compuesto por todos los vértices y algunas (posiblemente todas) de las aristas de G. Al ser creado un árbol no existirán ciclos, además debe existir una ruta entre cada par de vértices. Un grafo puede tener muchos arboles de expansión Árbol de Expansión Mínima Dado un grafo conexo, no dirigido y con pesos en las aristas, un árbol de expansión mínima es un árbol compuesto por todos los vértices y cuya suma de sus aristas es la de menor peso. Algoritmo de Prim El objetivo del algoritmo de Prim es construir, a partir de un grafo G = (V,E) no dirigido, pesado y conexo, un árbol abarcador de costo mínimo o árbol de expansión mínima, es decir, encontrar un conjunto T de n-1 aristas pertenecientes al conjunto E que conecten todos los vértices del grafo; donde el costo total de todas las aristas del árbol sea el menor posible. Ejemplo: como el ejercicio no lo indica elijo como vértice raíz el vértice incidente en la ariste de menos peso Algoritmo de Kruskal Tiene como objetivo también crear el árbol de expansión mínima de un grafo G = (V,E) conexo, ponderado y no dirigido. La aplicación típica de este problema es el diseño de redes telefónicas. Una empresa con diferentes oficinas, trata de trazar líneas de teléfono para conectarlas unas con otras. La compañía telefónica le ofrece está interconexión, pero ofrece tarifas diferentes o costos por conectar cada par de oficinas. ¿Cómo conectar entonces las oficinas al mínimo costo total? Procedimiento del algoritmo de Kruskal 1. 2. 3. 4. 5. Ordenar en forma ascendente según el peso de cada arista. Se marca la arista con menor peso como la arista inicial de la ruta mínima. De las aristas restantes, se selecciona la que tenga menor peso, si hay más de una, se elige cualquiera de ellas. Repetir el paso 3 siempre que la arista elegida no forme un ciclo con las ya seleccionadas. El proceso termina cuando tenemos todos los nodos del grafo en alguna de las aristas marcadas, es decir, cuando tenemos seleccionadas n-1 aristas, siendo n el número de nodos o vértices del grafo Ejemplo: 1. Este es el grafo inicial. Los números indican el peso de las aristas. Se ordenan las aristas de menor a mayor y se incia por la menor. En este caso hay dos aristas con el mínimo peso. 3. Se selecciona entre todas las aristas restantes, la de menor peso siempre que no forme un ciclo. En este caso la menor arista siguiente es CE. 2. Se selecciona, en este caso de manera aleatoria la arista AD, como arista de inicio. 4. Seleccionamos DF, con peso 6, que es la siguiente arista de menor peso que no forma ciclos. 5. De las aristas restantes, las de menor peso son las aristas AB y BE, de peso 7. AB se elige aleatoriamente, y se añade al conjunto de las aristas seleccionadas. De este modo, la arista DB no puede ser seleccionada ya que formaría el ciclo ADB. Por tanto la marcamos en rojo. 7. Por último, se selecciona la arista EG de peso 9. Como han sido seleccionadas un número de aristas igual al número de vértices menos uno, el proceso ha terminado. Se ha obtenido el árbol de expansión mínima con un peso de 39. 6. Siguiendo el proceso seleccionamos la arista BE con peso 7. Además marcamos en rojo las aristas BC, DE y FE ya que formarían los ciclos BCE, DEBA, FEBAD respectivamente. A fin de comprobar que el resultado es correcto hacemos la operación Vértices = 7 Aristas = lVl-1 = 7-1 =6 Aristas = 6 Peso del árbol = (5+7+6+5+9+7) = 39