Está en la página 1de 66

Grafos

Un grafo es una colección de puntos llamados


vértices (V) o nodos, de los cuales, un subconjunto de
ellos está conectado mediante líneas que se llaman
aristas (E, de edge) o arcos.

Análisis de Algoritmos 1
Grafos

Los grafos son estructuras matemáticas que se utilizan


mucho en el área de computación, ya que muchos
problemas se pueden modelar en forma natural usando
grafos.

Existen varias formas de representar a un grafo


Matriz de adyacencias
Lista de adyacencia

2
Análisis de Algoritmos
Matriz de adyacentas

Esta representación es muy útil para grafos densos (aquellos grafos con
muchas aristas, usualmente |E| = O(|V| 2) ).

Sea G = (V,E) un grafo no dirigido, donde ⎥V⎥ = n y ⎥E⎥ = m. La


matriz de adyacencias es una matriz de n× n, donde el elemento ai,j
=1 si y sólo si la arista
(i,j) ∈ E; de otra forma, el elemento ai,j = 0.

Análisis de Algoritmos 3
Lista de adyacencias
Esta representación es útil cuando los grafos son dispersos
(aquellos grafos con pocas aristas, normalmente |E| = O(|V| ) ).

Sea G = (V,E) un grafo no dirigido, donde ⎥V⎥ = n y ⎥E⎥ = m. La


lista de adyacencias de G consiste de un arreglo de n listas, una por
cada vértice de V. Para cada vértice u∈V, Adj[u] contiene todos los
vértices v tal que la arista (u,v) ∈ E.

Análisis de Algoritmos 4
Dos ejemplos de representaciones de grafos

5
Grafos dirigidos

6
Ejercicio
• Representar el siguiente grafo con una lista de
adyacencias y una matriz de adyacencias.
r s t u

v w x y

7
r s t u

v w x y
r s t u v w x y
r 0 1 0 0 1 0 0 0 r v s
s 1 0 0 0 0 1 0 0 s r w
t 0 0 0 1 0 1 1 0 t w x u
u 0 0 1 0 0 0 1 1 u t x y
v 1 0 0 0 0 0 0 0 v r
w 0 1 1 0 0 0 1 0 w s t x
x 0 0 1 1 0 1 0 1 x w t u y
y 0 0 0 1 0 0 1 0 y x u
8
Ejercicio

Obtener la matriz y lista de adyacencia del siguiente grafo

u v w

x y z

Análisis de Algoritmos 9
Busqueda en anchura

El algoritmo de búsqueda en anchura (breadth-


first search, BFS) es uno de los algoritmos más
simples para hacer búsquedas en un grafo y es la
base para muchos algoritmos más complejos.

Análisis de Algoritmos 10
Busqueda en anchura

Dado un vértice inicial s (llamado fuente) de un


grafo, el algoritmo BFS realiza una búsqueda
sistemática de todos los vértices a los que se
puede llegar saliendo de s. Conforme los va
descubriendo, a cada vértice le asigna la
distancia (mínima existente) entre él y s.

Análisis de Algoritmos 11
Busqueda en anchura

Simultáneamente el algoritmo genera el árbol de


anchura (BFT) que contiene al conjunto de
vértices a los que se puede llegar desde s. El
vértice s es la raíz de este árbol.

12
Análisis de Algoritmos
Busqueda en anchura

Durante la ejecución del algoritmo BFS, los vértices van cambiando


gradualmente de color:

El vértice de color blanco ( ) indica que aún está inexplorado.

Un vértice gris ( ) es aquel que ya ha sido descubierto, pero no así


todos sus vecinos.

Un vértice negro ( ) es aquel que ya ha sido descubierto así como


todos sus vecinos.

El algoritmo termina cuando todos los vértices se han coloreado de


negro.

Análisis de Algoritmos 13
Busqueda en anchura

Cuando un vértice blanco v se descubre en el proceso de revisar la lista


de adyacencias de un vértice ya descubierto u, el vértice v y la arista
(u,v) se agregan al árbol. La entrada del algoritmo es la lista de
adyacencias del grafo G.

r v s r s t u
s r w
t w x u
u t x y
v r
w s t x
x w t u y
v w x y
y x u

Análisis de Algoritmos 14
Variables

El algoritmo BFS emplea las siguientes variables:


u.color guarda el color del vértice u (blanco, gris o negro).

u. guarda el predecesor o padre del vértice u. Si éste no existe, u. =


NIL.

u.d guarda la distancia del vértice s al vértice u.

Q es una cola tipo “el primero que entra es el primero que sale” que sirve para
guardar temporalmente los vértices grises.

Análisis de Algoritmos 15
Algoritmo BFS
Lista de adyacencia
r v s
s r w
t w x u
u t x y
Inicialización de variables
v r
w s t x
x w t u y
y x u

Examina vecinos de
vértices grises

Actualiza variables

Análisis de Algoritmos 16
Busqueda en anchura (Ejemplo)
r s t u
∞ 0 ∞ ∞

∞ ∞ ∞ ∞
v w x y

Q s

Análisis de Algoritmos 17
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞ ∞

∞ 11 ∞ ∞
v w x y

Q w
s r
u=s
Análisis de Algoritmos 18
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞

∞ 11 ∞
2 ∞
v w x y

Q r t x
u=w
Análisis de Algoritmos 19
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞

∞2 11 ∞
2 ∞
v w x y

Q t x v
u=r
Análisis de Algoritmos 20
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
v w x y

Q xvu
u=t
Análisis de Algoritmos 21
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
3

v w x y

Q vu y
u=x
Análisis de Algoritmos 22
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
3

v w x y

Q u y
u=v
Análisis de Algoritmos 23
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
3

v w x y

Q y
u=u
Análisis de Algoritmos 24
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
3

v w x y

Q
u=y
Análisis de Algoritmos 25
Búsqueda en anchura (Ejemplo)
r s t u
1 0 ∞2 ∞
3

∞2 11 ∞
2 ∞
3

v w x y

Q NIL

Análisis de Algoritmos 26
Búsqueda en anchura (Ejemplo)
r s t u
s
1 0 ∞2 ∞
3
0

r 1 1
w
t ∞2 11 ∞
2 ∞
3
∞2 ∞
2 2 v w x y
v x
3 3

y u

Análisis de Algoritmos 27
Tiempo de ejecución

O(|V|+|E| )
O(|V|)

O(1)

O(1)

O(1)
O(|V|)

O(|E|)

O(1)

O(1)

Análisis de Algoritmos 28
Búsqueda en profundidad

El algoritmo de búsqueda en profundidad (depth-first


search, DFS) sigue una estrategia de
explorar, siempre que sea posible, más profundo dentro
del grafo.

Análisis de Algoritmos 29
Búsqueda en profundidad

El algoritmo DFS, al ir descubriendo vértices, va


generando un subgrafo de predecesores. Este subgrafo
puede estar compuesto por varios árboles (en el
algoritmo BFS este subgrafo es un solo árbol) y recibe el
nombre de bosque de profundidad.

Análisis de Algoritmos 30
Búsqueda en profundidad

Durante la ejecución del algoritmo DFS, se generan los


valores de dos variables:

u.d almacena el instante en el que el vértice u se


descubre (el vértice se pinta de gris).

u.f almacena el instante en el que se terminó de


procesar toda la lista de adyacencias del vértice u. (el
vértice se pinta de negro).

Análisis de Algoritmos 31
Algoritmo DFS

Inicialización de variables

Inicia el crecimiento
de un árbol

Procesa vértice
descubierto

Continúa la búsqueda en
profundidad

Termina de procesar los


descendientes de u

32
Análisis de Algoritmos
Búsqueda en profundidad (Ejemplo)
u v w

x y z

Análisis de Algoritmos 33
Búsqueda en profundidad (Ejemplo)
u v w

x y z

Análisis de Algoritmos 34
Búsqueda en profundidad (Ejemplo)
u|v x
u v w
1/

x y z

Análisis de Algoritmos 35
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

x y z
v

Análisis de Algoritmos 36
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

3/

x y y|x
z
v y

Análisis de Algoritmos 37
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

4/ 3/

x y y|x
z
v y
x

Análisis de Algoritmos 38
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

4/ 3/

x x|v
y y|x
z
v y
x

NO!

v != white

Análisis de Algoritmos 39
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

4/ 3/

x x|v
y y|x
z
v y
x

Análisis de Algoritmos 40
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

4/5 3/

x x|v
y y|x
z
v y
x

Análisis de Algoritmos 41
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/

4/5 3/6

x x|v
y y|x
z
v y

Análisis de Algoritmos 42
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/7

4/5 3/6

x x|v
y y|x
z
v

Análisis de Algoritmos 43
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/7

4/5 3/6

x x|v
y y|x
z

Análisis de Algoritmos 44
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/ 2/7
NO!

x != white

4/5 3/6

x x|v
y y|x
z

Análisis de Algoritmos 45
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/8 2/7

4/5 3/6

x x|v
y y|x
z

Análisis de Algoritmos 46
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/8 2/7

4/5 3/6

x x|v
y y|x
z

Análisis de Algoritmos 47
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w
1/8 2/7

4/5 3/6

x x|v
y y|x
z
v != white
w == white
x != white

y != white z == white

Análisis de Algoritmos 48
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/

4/5 3/6

x x|v
y y|x
z
w

Análisis de Algoritmos 49
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/

4/5 3/6 10/

x x|v
y y|x
z z|z
w z

Análisis de Algoritmos 50
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/

4/5 3/6 10/11

x x|v
y y|x
z z|z
w z

Análisis de Algoritmos 51
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/

4/5 3/6 10/11

x x|v
y y|x
z z|z
w z

Análisis de Algoritmos 52
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/12

4/5 3/6 10/11

x x|v
y y|x
z z|z
w

Análisis de Algoritmos 53
Búsqueda en profundidad (Ejemplo)
u|v x
u v v|y
w w|y z

1/8 2/7 9/12

4/5 3/6 10/11

x x|v
y y|x
z z|z

Análisis de Algoritmos 54
Tiempo de ejecución

O(|V|)
.
O(1)
O(|V|+|E| )
O(|V|)

1 vez por vértice

O(1)

O(|E|)

O(1)

Análisis de Algoritmos 55
Clasificación de aristas
Aristas del árbol. ( ) Son aquellas que pertenecen al bosque de
profundidad. La arista (u,v) es una arista del árbol si v fue
descubierta por primera vez al explorar la arista (u,v).
B
Aristas traseras( ) La arista (u,v) conecta u con un ancestro v en
un árbol de profundidad. En grafos dirigidos, los auto ciclos son
aristas traseras.
F
Aristas delanteras ( ) La arista (u,v) conecta u con un
descendiente v en un árbol de profundidad.
C
Aristas cruzadas( ) Son aristas que van entre vértices del mismo
árbol siempre y cuando no haya relación acenstro-descendiente entre
los vértices. También son aquellas aristas que tienen sus extremos en
árboles de profundidad distintos.
Análisis de Algoritmos 56
57
Propiedades

Grafos acíclicos dirigidos: Un grafo dirigido G es acíclico si y sólo si


en una búsqueda de profundidad de G no se generan aristas
traseras.

Análisis de Algoritmos 59
Propiedades

Ordenamiento topológico
Asigna a cada vértice un orden, de tal forma que si G
tiene a la arista (u,v), entonces u aparece antes que v
en el ordenamiento. Se pueden ordenar los vértices
topológicamente si y solo si el grafo acíclico es dirigido.

Análisis de Algoritmos 60
Propiedades

Análisis de Algoritmos 61
Propiedades

Después de realizar una búsqueda en profundidad en el


grafo G, se pueden examinar los tiempos de finalización
u.f.

El orden topológico es el inverso del orden que siguen los


tiempos de finalización de los vértices.

Análisis de Algoritmos 62
Ejercicio
Hacer un ordenamiento topológico empezando de socks

63
Propiedades

Análisis de Algoritmos 64
Propiedades

Teorema del paréntesis


En cualquier búsqueda en profundidad de un grafo dirigido o no dirigido G(V,E), para
cualquier par de vértices u y v, exactamente una de los siguientes tres condiciones se
mantiene:

Los intervalos [u.d, u.f] y [v.d, v.f] son disjuntos y ninguno de ellos, u o v, es un
descendiente del otro en el bosque de profundidad.

El intervalo [u.d, u.f] está contenido completamente dentro del intervalo [v.d, v.f] , y u es
un descendiente de v en un árbol de profundidad.

El intervalo [v.d, v.f] está contenido completamente dentro del intervalo [u.d, u.f] , y v es
un descendiente de u en un árbol de profundidad.

Análisis de Algoritmos 65
Propiedades

Análisis de Algoritmos 66
Ejercicio

Realizar la estructura de paréntesis de los grafos mostrados.

Análisis de Algoritmos 67

También podría gustarte