Taller de BFS - Universidad de Buenos Aires

Anuncio
Menú del dı́a
1
Definiciones y estructuras
Grafos
Árboles
2
Breadth-first search (BFS)
Algoritmo
Extensiones
3
Taller
Problemas en grafos implı́citos
Problemas
Taller de BFS
Laboratorio de Algoritmos y Estructuras de Datos III
Departamento de Computación
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
24 de Septiembre de 2010
Labo de Algo III (Sabi)
Taller de BFS
Definiciones y estructuras
24 de Septiembre de 2010
1 / 25
Labo de Algo III (Sabi)
Grafos
Taller de BFS
Definiciones y estructuras
Grafos
24 de Septiembre de 2010
2 / 25
Grafos
Grafos - tipos
Hay muchas variantes de grafos:
Un grafo se define como la pareja (V , E ), de vértices (o nodos, o
puntitos) y ejes (o aristas, o rayitas, o flechitas), donde E ⊆ V × V .
Se describen de alguna(s) de estas formas:
Dirigidos: (u, v ) y (v , u) son aristas distintas.
No dirigidos: (u, v ) y (v , u) son la misma arista.
Multi-grafos: Puede haber varias aristas entre la misma pareja
ordenada.
Por las adyacencias de cada vértice
Por la definición: el conjunto de vértices y el conjunto de ejes.
Hay muchas propiedades sobre grafos:
Implı́citamente, por otra estructura.
Con o sin ciclos (dirigidos o no dirigidos)
En adelante,
n es la cantidad de vértices (|V |)
Conexos o no conexos.
m es la cantidad de aristas (|E |).
Completos, vacı́os, triviales.
Hamiltonianos, euclideanos, cactus, etc.
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
3 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
4 / 25
Definiciones y estructuras
Grafos
Definiciones y estructuras
Grafos - definiciones
Grafos - por adyacencia
El vecindario de un vértice u, N(u), es el conjunto de vértices x tales
que (u, x) es una arista del grafo.
El grado de un vértice u, d(u), es el cardinal de su vecindario. En un
digrafo esto es el grado de salida de u.
Un camino en un grafo es una secuencia de aristas donde el extremo
final de una arista es el inicial de la siguiente arista.
Un ciclo en un grafo es un camino que empieza y termina en el
mismo vértice.
Labo de Algo III (Sabi)
Grafos
Taller de BFS
Definiciones y estructuras
24 de Septiembre de 2010
De cada vértice se describe su conjunto de vecinos:
Como una lista de vecinos (lista de adyacencia).
Como un conjunto, arreglo u otro contenedor.
Como un conjunto sobre bits (matriz de adyacencia).
Recorrer los vecinos de un vértice es recorrer los elementos del
contenedor.
Recorrer todas las aristas es recorrer todos los vecinos de todos los vértices.
5 / 25
Labo de Algo III (Sabi)
Grafos
Taller de BFS
Definiciones y estructuras
Grafos - por adyacencia
24 de Septiembre de 2010
6 / 25
Grafos
Grafos - por adyacencia
Por lista de adyacencia se puede almacenar de la siguiente forma:
vvint lady(n, vint());
void agregar(int u, int v) {
lady[u].push_back(v); lady[v].push_back(u);
}
Costo de las operaciones según la representación:
Operación
¿(u, v ) ∈ E ?
Recorrer N(u)
Recorrer E
Memoria
Lista de adyacencia
O(min(d(u), d(v )))
O(d(u))
O(n + m)
n + 2m
Labo de Algo III (Sabi)
Matriz de adyacencia
O(1)
O(n)
O(n2 )
n2
Taller de BFS
24 de Septiembre de 2010
Por matriz de adyacencia se puede almacenar de la siguiente forma:
vvint mady(n, vint(n, 0));
void agregar(int u, int v) {
mady[u][v]++; mady[v][u]++;
}
7 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
8 / 25
Definiciones y estructuras
Grafos
Definiciones y estructuras
Grafos - por definición
Árboles
Árboles
Se describe el conjunto de aristas (E ) involucradas en el grafo.
Árbol
Un árbol es un grafo conexo y sin ciclos.
Se describe el conjunto de vértices (V ). A veces alcanza con un
número (n).
Ejemplo:
La definición sólo sirve para demostrar propiedades teóricas.
struct eje { int a, b; };
vector<eje> g;
int n;
void agregar(int u, int v) {
g.push_back( (eje){ a: u, b: v } );
}
Un árbol se puede representar igual que un grafo (caso particular).
Un vértice con sólo un vecino se llama hoja.
Algunas propiedades:
Hay un único camino entre todo par de vértices.
m =n−1
Algunas representaciones son más apropiadas para ciertos algoritmos.
Labo de Algo III (Sabi)
Taller de BFS
Definiciones y estructuras
24 de Septiembre de 2010
9 / 25
Labo de Algo III (Sabi)
Árboles
Taller de BFS
Breadth-first search (BFS)
24 de Septiembre de 2010
10 / 25
Algoritmo
Árboles con raı́z (rooted trees)
Algoritmo
Árbol con raı́z
Un árbol con raı́z es un árbol con un vértice distinguido, llamado raı́z.
BFS
Breadth-first search (BFS) o búsqueda en ancho es un algoritmo para
recorrer los nodos de un grafo en un orden especı́fico.
Comienza por un vértice distinguido
También se puede representar como un grafo (y un vértice
distinguido).
Tienen la noción de padre e hijo, de acuerdo a la cercanı́a a la raı́z.
Admiten una representación recursiva: Un árbol es
Por cada vértice visitado, marca en una cola todos sus vecinos no
marcados.
Visita los vértices en el orden determinado por la cola.
En total, recorre a lo sumo una vez cada vértice.
una raı́z
un conjunto de sub-árboles, hijos de esa raı́z
En total, recorre a lo sumo dos veces cada arista.
Complejidad: O(n + m).
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
11 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
12 / 25
Breadth-first search (BFS)
Algoritmo
Breadth-first search (BFS)
Algoritmo
Árbol de BFS
Algorithm 2.1: bfs(Grafo g , Nodo v )
marcadosp ← FALSE ∀p ∈ V (g )
cola ← nueva cola
marcar (v )
while 
¬cola.empty ()
p ← cola.pop()


for each
q ∈ g .vecinos(p)
do
if ¬marcadosq


 do
then marcar (q)
El recorrido BFS determina un árbol con raı́z.
Cada vez que se marca un vecino se usa esa arista para el árbol.
1
Algorithm 2.2: marcar(Nodo v )
2
3
4
5
6
7
marcadosv ← TRUE
cola.push(v )
Labo de Algo III (Sabi)
8
Taller de BFS
Breadth-first search (BFS)
24 de Septiembre de 2010
13 / 25
Labo de Algo III (Sabi)
Algoritmo
Taller de BFS
Breadth-first search (BFS)
Problema - Is it a tree
24 de Septiembre de 2010
14 / 25
Extensiones
Extendiendo BFS
BFS guarda un bit de información por cada vértice.
Se puede extender y guardar más información.
Problema SPOJ: 1436 - Is it a tree http://www.spoj.pl/problems/PT07Y/.
Distancia desde la raı́z (en el árbol de BFS)
Cualquier dato asociado al recorrido (ej: “vengo de”)
Dado un grafo, determinar si es además un árbol.
d=1
d=2
d=3
d=0
Por definición, un árbol es un grafo:
Conexo
Sin ciclos
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
15 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
16 / 25
Breadth-first search (BFS)
Extensiones
Breadth-first search (BFS)
Algorithm 2.3: bfs-dist(Grafo g , Nodo v )
Extensiones
BFS - Camino mı́nimo
distp ← ∞ ∀p ∈ V (g )
cola ← nueva cola
marcar (v , 0)
while 
¬cola.empty ()
p ← cola.pop()




d ← distp
do for each
q ∈ g .vecinos(p)


if distq = ∞


 do
then marcar (q, d + 1)
Hecho: Distancia entre adyacentes
Sea distv la distancia calculada por BFS en un grafo G desde el vértice
inicial v0 hasta el vértice v . Si (u, v ) ∈ E (G ) entonces |distu − distv | 6 1.
Teorema: Camino mı́nimo
En un grafo conexo el árbol de BFS es un árbol de caminos mı́nimos
desde el vértice inicial del BFS.
Algorithm 2.4: marcar(Nodo v , Dist d)
distv ← d
cola.push(v )
Labo de Algo III (Sabi)
Taller de BFS
Breadth-first search (BFS)
24 de Septiembre de 2010
17 / 25
Labo de Algo III (Sabi)
Extensiones
Taller de BFS
Breadth-first search (BFS)
BFS - Invariante
24 de Septiembre de 2010
18 / 25
Extensiones
BFS - Grafos no conexos
Invariantes y propiedades del algoritmo:
Hay tres estados disjuntos para los vértices:
No marcado
Marcado, pero no visitado
Marcado y visitado
BFS recorre todos los vértices alcanzables desde el vértice incial
(componente conexa).
Sólo los vértices marcados pero no visitados están en la cola
Recorrer todas las componentes conexas requiere correr un BFS en
cada componente.
Todos los vecinos de los vértices visitados están marcados
Hay O(n) componentes y BFS tarda O(n + m).
De todos los vértices marcados ya se conoce con certeza la distancia
mı́nima al inicio.
¿Recorrer todas las componentes podrı́a tardar O(n · (n + m))?
La distancia para los vértices en la cola es d o d + 1 (delante están
todos los de d y luego los de d + 1), para algún valor d.
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
19 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
20 / 25
Breadth-first search (BFS)
Extensiones
Taller
Algorithm 2.5: bfs-all(Grafo g )
Problemas en grafos implı́citos
Problema - Laberinto
marcadosp ← FALSE ∀p ∈ V (g )
cola ← nueva cola
for each v ∈ g .nodos
do if ¬marcados
v

marcar
(v
)




while
¬cola.empty
()




p
←
cola.pop()


then

for each


q ∈ g .vecinos(p)
do



if ¬marcadosq




 do
then marcar (q)
Sabi se encuentra atrapado en un laberinto (como el
de la Figura 1). Se pide calcular la menor cantidad
de movimientos (Norte, Sur, Este u Oeste)
necesarios para que Sabi alcance la salida (marcada
con “o”) dado que inicialmente se encuentra en el
punto marcado con “*”.
#######
#....o#
#.#####
#.#...#
#...#*#
#######
(Figura 1)
Descripción: “#” es una pared, “.” es un espacio libre, “o” es la salida y
“*” es el punto donde estamos parados.
Algorithm 2.6: marcar(Nodo v )
marcadosv ← TRUE
cola.push(v )
Labo de Algo III (Sabi)
Taller de BFS
Taller
24 de Septiembre de 2010
21 / 25
Labo de Algo III (Sabi)
Problemas en grafos implı́citos
Taller de BFS
Taller
Problema - Laberinto
24 de Septiembre de 2010
22 / 25
Problemas en grafos implı́citos
Problema - Laberinto
Representación del grafo, en un tablero de r × c.
Sabi puede estar en cualquiera de las casillas (estado).
V (G ) = [0, r ) × [0, c)
Estando en algunas casillas es posible alcanzar otras con un
movimiento (transición de estados).
(u, v ) ∈ E (G ) ⇔ libre(u) ∧ libre(v ) ∧ dist(u, v ) == 1
Un nodo v se representa con dos enteros “i, j”.
Estos dos conceptos definen un grafo.
El grafo se representa con dos enteros (r y c) y un mapa de casillas libres.
La cantidad mı́nima de movimientos para escapar se traduce a un
camino mı́nimo en el grafo.
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
int r, c;
char mapa[MAX_R][MAX_C];
23 / 25
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
24 / 25
Taller
Problemas
Problemas de hoy
SPOJ - 1436 - Is it a tree - http://www.spoj.pl/problems/PT07Y/
http://icpcres.ecs.baylor.edu/onlinejudge/external/111/
11160.html - Going Together
Labo de Algo III (Sabi)
Taller de BFS
24 de Septiembre de 2010
25 / 25
Descargar