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