Está en la página 1de 17

Matemática Discreta - IIC 2252

Clase 28
Introducción a la teorı́a de grafos

1
Definiciones básicas
Definición. Un grafo G es un triple (V (G), E(G), I(G)) donde V (G) es un
conjunto (cuyos elementos son llamados vértices), E(G) es otro conjunto,
cuyos elementos son llamados aristas, e I(G) es una relación (la relación de
incidencia), que le asocia a cada arista e ∈ E(G) dos vértices, llamados los
extremos de e.
Si u y v son extremos de una misma arista, decimos que son adyacentes.
Generalmente un grafo es dibujado en forma tal que cada vértice queda
representado por un punto en el plano, y cada arista por una curva que une los
representantes de sus extremos.

2
Casos especiales
Definición.
Un lazo, rizo o bucle (loop) es una arista en que sus dos extremos son el
mismo vértice.
Si varias aristas tienen los mismos extremos, decimos que son aristas
múltiples.
Un grafo es simple si no tiene lazos ni aristas múltiples.
Un grafo simple puede ser especificado por sus conjuntos de vértices y
aristas, donde éstas pueden ser vistas como pares (no ordenados) de
vértices.
En un grafo simple, si los extremos de una arista e son u y v, anotamos
e = uv (o e = vu).
Desde ahora, supondremos que todos los grafos son simples, a menos que
especifiquemos lo contrario.

3
Problemas relacionados con distancia
Ruta más corta Dados dos vértices u y v en un grafo, ¿cuál es la menor
cantidad de aristas que es necesario recorrer para ir de uno al otro?
¿qué ruta permite alcanzar esta cantidad mı́nima?
Ruta de costo mı́nimo En el problema anterior, si a cada arista le
asociamos un costo, ¿cuál es el costo total mı́nimo de un camino entre u y
v? ¿cuál es la ruta óptima?
El problema del vendedor viajero Dado un conjunto de ciudades, se
conocen las distancias entre cada par de ellas, y se desea realizar un
recorrido por todas ellas sin repetir ninguna y de modo que la distancia
total recorrida sea mı́nima. ¿Cómo conseguirlo?

4
El algoritmo de Dijkstra
Entrada: Un grafo (o digrafo) G con pesos no negativos, y un vértice de
partida u. El peso de una arista xy es w(xy); si xy no es una arista diremos
que w(xy) = ∞.
Idea: Mantener un conjunto S de vértices a los que conocemos la distancia
más corta desde u, junto con el predecesor de cada vértice de S en dicha ruta.
Para lograr esto, mantenemos una distancia tentativa t(z) desde u a cada
z ∈ V (G). Si z ∈
/ S, t(z) es la distancia más corta encontrada hasta ahora entre
u y z. Si z ∈ S, t(z) es la distancia más corta entre u y z. En cualquier caso,
pred[z] es el predecesor de z la ruta u − z en cuestión.

5
El algoritmo de Dijkstra (cont.)
Inicialización: S = {u} , t(u) = 0, t(z) = w(uz) y pred[z] = u para z 6= u.
Iteración: Sea v ∈ V (G) − S tal que t(z) = mı́n {t(v) : v ∈ V (G) − S}.
Agréguese v a S.
Para z ∈ V (G) − S, actualı́cese t(z) a mı́n {t(z), t(v) + w(vz)}.
Si cambia t(z), cámbiese pred[z] a v.
Terminación: Termı́nese el algoritmo cuando S = V (G) o cuando t(z) = ∞
para todo z ∈ V (G) − S.
Al terminar, la distancia más corta entre u y v está dada por

d(u, v) = t(v).

Ejercicio. Demuestre que el algoritmo de Dijkstra es correcto.


Ejercicio. Demuestre que el algoritmo de Dijkstra, bien implementado, tiene
una complejidad O(n2 log n), e incluso O(|E| log n).

6
El algoritmo de Floyd y Warshall
El algoritmo de Dijkstra no funciona con pesos negativos. El siguiente
algoritmo (Floyd y Warshall) permite hallar la ruta más corta aún en presencia
de pesos negativos, siempre y cuando no haya ciclos de costo total negativo.
Además, a diferencia del algoritmo de Dijkstra, este algoritmo no halla las
distancias más cortas desde un vértice fijo u, sino todos los pares de distancias
más cortas.

7
El algoritmo de Floyd y Warshall (cont.)
Suponemos que los vértices del grafo están numerados v1 , v2 , . . . , vn .
Entrada: Una matriz C de n × n, donde Cij es el costo de la arista que une vi
con vj ; si vi vj no es una arista entonces Cij = ∞.
Idea: Mantener una matriz D con las distancias calculadas hasta ese
momento. Originalmente, D = D(0) = C (Dij = el largo del camino más corto
que va directamente desde vi a vj (o sea, la arista vi vj si ésta existe). A
medida que progresa el algoritmo, vamos calculando nuevas versiones
(k)
D(1) , D(2) , etc., de modo que Dij es el largo del camino más corto que une vi
con vj , y que no tiene vértices intermedios vl con l > k.
(n)
Salida: Al terminar el algoritmo, Dij = Dij es el largo de la ruta más corta
que une vi con vj .

8
El algoritmo de Floyd y Warshall (cont.)
El algoritmo de Floyd y Warshall es como sigue:

Floyd-Warshall(C, n)
1: for i from 1 to n do 11: Dij ← Dik + Dkj
2: for j from 1 to n do 12: end if
3: Dij ← Cij 13: end for
4: end for 14: if Dii < 0 then
5: Dii ← ∞ 15: Error: ciclo de costo total
6: end for negativo
7: for k from 1 to n do 16: end if
8: for i from 1 to n do 17: end for
9: for j from 1 to n do 18: end for
10: if Dik + Dkj < Dij then

9
Ejercicios
Demuestre que el algoritmo de Floyd y Warshall calcula correctamente las
distancias entre cada par de vértices del grafo.
Modifique el algoritmo para que, además de calcular las distancias entre los
vértices, permita construir los caminos más cortos entre cada par de ellos.
Demuestre que la complejidad del algoritmo de Floyd y Warshall es Θ(k 3 ).

10
Cliques y conjuntos independientes
Definición. Dado un grafo G, un clique o subgrafo completo de G es un
conjunto K de vértices de G tal que todo par de vértices de K son adyacentes.
Un conjunto independiente o conjunto estable de G es un conjunto I de
vértices de G tal que ningún par de vértices de I son adyacentes.

11
Problemas sobre cliques y conjuntos
independientes
Clique de tamaño máximo Hallar el clique más grande en un grafo dado.
Conjunto independiente de tamaño máximo Hallar el conjunto
independiente más grande en un grafo dado.

12
Caminos y circuitos
Definición. Dado un grafo G, un camino Euleriano es un camino que pasa
por cada arista exactamente una vez (llamado ası́ en homenaje a Euler, quien
resolvió el problema de los puentes de Königsberg). Un circuito Euleriano es
un camino Euleriano que comienza y termina en el mismo vértice.
Definición. Dado un grafo G, un camino Hamiltoniano es un camino que
pasa por cada vértice exactamente una vez (llamado ası́ en homenaje a Sir
William Rowan Hamilton). Un circuito Hamiltoniano es un camino
Hamiltoniano que comienza y termina en el mismo vértice.
Problema: Dado un grafo G, decidir si tiene un camino/circuito Euleriano.
En caso afirmativo, encontrar dicho camino o circuito.
Problema: Dado un grafo G, decidir si tiene un camino/circuito
Hamiltoniano. En caso afirmativo, encontrar dicho camino o circuito.

13
Coloración de grafos
Definición. Sea G un grafo cualquiera. Una k-coloración de G es una
asignación f : V (G) → S, donde |S| = k (usualmente S = {1, . . . , k}).
Los valores que toma f son llamados colores, los vértices de un mismo color
forman una clase de color o clase cromática.
Una coloración es propia si vértices adyacentes tienen colores disti ntos.
Un grafo es k-coloreable si tiene una k-coloración propia. El número cromático
χ(G) es el menor k tal que G es k-coloreable.
Si χ(G) = k, decimos que G es k-cromático.

14
Problemas relativos a coloración
número cromático Dado un grafo G, calcular χ(G).
k-colorabilidad Dado un grafo G y un entero positivo k, determinar si G es
k-coloreable.
k-coloración Dado un grafo k-coloreable G (k un entero positivo), construir
una k-coloración de G.

15
Cubrimientos
Definición. Dado un grafo G, un cubrimiento por vértices de G es un conjunto
C de vértices tal que toda arista de G tiene al menos un extremo en C.
Definición. Dado un grafo G, un cubrimiento por aristas de G es un conjunto
F de aristas tal que todo vértice de G es extremo de alguna arista de F .

16
Problemas relativos a cubrimientos
cubrimiento máximo por vértices Dado un grafo G, hallar un cubrimiento
por vértices de tamaño mı́nimo.
cubrimiento máximo por aristas Dado un grafo G, hallar un cubrimiento
por aristas de tamaño mı́nimo.

17

También podría gustarte