You are on page 1of 28

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

Semillero de Programaci´ on
Pila, Cola, DFS y BFS

Ana Echavarr´ ıa

Juan Francisco Cardona

Universidad EAFIT

22 de febrero de 2013

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

Contenido

1

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea

2

3

4

5

6

while(cin >> a >> b){ long long diff = abs(b . } . b.Hashmat the Brave Warrior 1 2 3 4 5 6 7 8 int main(){ long long a. cout << diff << endl.a).Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea 10055 . } return 0.

} cout << best << endl. k++){ int count = 1. } . j. while (n > 1){ if (n % 2 == 0) n /= 2. k <= j. else n = 3 * n + 1. int best = 0. if (i > j) swap(i. best). } return 0. j). int n = k. count++. } best = max(count.The 3n + 1 problem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int main(){ int i. while(cin >> i >> j){ cout << i << " " << j << " ". for (int k = i.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea 100 .

double height = 0. if (height > H) break.0. else printf("failure on day %d\n". F. } . int day = 0.The Snail 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 int main(){ int H. height -= D.0. while (cin >> H >> U >> D >> F){ if (H == 0) break.fatigue). } if (height >= H) printf("success on day %d\n". D.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea 573 . double fatigue = (1. while (height >= 0){ height += climb. climb = max(0. } return 0. climb . day).0 * U * F) / 100. day++. double climb = U. day). U.

for (int i = 0.size().Word Scramble 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 vector <string> v. } cout << endl.push_back(s). int main(){ string line. line)){ stringstream ss(line). v. } .clear(). } return 0.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea 483 .end()). cout << v[i].begin(). v[i]. if (i > 0) cout << " ". string s. ++i){ reverse(v[i]. i < v. while (ss >> s) v. while (getline(cin.

. Un ejemplo ser´ ıa una pila de libros.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Pila o Stack Pila o Stack Es una contenedor din´ amico en el cual s´ olo se pueden insertar elementos al final y s´ olo se pueden extraer elementos del final. El u ´ ltimo elemento que se insert´ o es el primer elemento en salir (LIFO).

Top() retorna el u ´ltimo elemento almacenado. Pop() elimina el u ´ltimo elemento del stack.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Operaciones Sobre una pila se pueden realizar las siguientes operaciones Push(x) inserta el elemento x al stack. .

push(-1). s.push(10). cout << s.pop(). } // Incluir stack // // // // // // // Crear un stack de enteros Insertar 10 Insertar -1 Imprimir -1 Eliminar -1 Imprimir 10 El tamano del stack es 1 .top() << endl. return 0.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Implementaci´ on usando la librer´ ıa de C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> #include <stack> using namespace std. int main(){ stack <int> s. s. s.top() << endl. cout << s.size() << endl. cout << s.

.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Cola o Queue Cola o Queue Es una contenedor din´ amico en el cual s´ olo se pueden insertar elementos al final y s´ olo se pueden extraer elementos del principio. El primer elemento que se insert´ o es el primer elemento en salir (FIFO). Un ejemplo ser´ ıa una cola en un banco.

Back() retorna el u ´ltimo elemento de la cola . Front() retorna el primer elemento de la cola. Pop() elimina el primer elemento de la cola.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Operaciones Sobre una cola se pueden hacer las siguientes operaciones Push(x) inserta el elemento x a la cola.

cout << q.pop(). q. cout << q. q.size() << endl. return 0. cout << q.push(10). int main(){ queue <int> q.front() << endl. } // Incluir queue // // // // // // // Crear una cola de enteros Insertar 10 Insertar -1 Imprimir 10 Eliminar 10 Imprimir -1 El tamano de la cola es 1 .push(-1).Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Implementaci´ on usando la librer´ ıa de C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <iostream> #include <queue> using namespace std.front() << endl. q.

. Se comienza desde uno nodo y se exploran todos los vecinos de este nodo. para cada uno de los vecinos. se exploran sus respectivos vecinos (que no se hayan visto antes). Se contin´ ua de esta manera hasta que se haya recorrido todo el grafo. Luego.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea BFS Algoritmo para recorrer o buscar elementos en un grafo.

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Ejemplos .

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Pregunta Complejidad ¿Cu´ antas veces visto cada nodo? ¿Cu´ antas veces visito cada arista? De acuerdo a lo anterior ¿Cu´ al ser´ ıa una aproximaci´ on a la complejidad del algoritmo? Estructura de datos De las estructuras de datos mostradas anteriormente ¿Cu´ al ser´ ıa la apropiada para almacenar los nodos que tengo pendientes por visitar? .

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Pregunta Complejidad ¿Cu´ antas veces visto cada nodo? ¿Cu´ antas veces visito cada arista? De acuerdo a lo anterior ¿Cu´ al ser´ ıa una aproximaci´ on a la complejidad del algoritmo? Estructura de datos De las estructuras de datos mostradas anteriormente ¿Cu´ al ser´ ıa la apropiada para almacenar los nodos que tengo pendientes por visitar? .

push(s). for (int i = 0. // Agregarlo a la cola } } } } .size() > 0){ int cur = q. // La distancia que llevo + 1 q.push(next). // Agregar la fuente a la cola d[s] = 0. int d[MAXN]. ++i) d[i] = -1.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Algoritmo BFS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vector <int> g[MAXN]. i < g[cur]. // La distancia de la fuente es 0 while (q. if (d[next] == -1){ // Si todava no lo he visitado d[next] = d[cur] + 1. queue <int> q. ++i){ int next = g[cur][i].front(). q. n = numero de nodos // Marcar todos los nodos como no visitados for (int i = 0. i < n. int n){ // s = fuente.pop(). q.size(). // La lista de adyacencia // Aristas usadas desde la fuente void bfs(int s.

. Hallar m´ ınimo n´ umero de aristas para llegar de la fuente a cualquier nodo. Si se guarda el nodo del que vine (padre). Hallar los nodos alcanzables desde la fuente (Ver si existe un camino de la fuente a cualquier nodo).Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Aplicaciones Buscar o recorrer elementos en un grafo. se pueden hallar las aristas pertenecientes al camino “m´ as corto” desde la fuente hasta cada nodo. Con algunas modificaciones sirve para ver si existe un ciclo en alg´ un camino que sale desde la fuente.

Si se representa usando la matriz de adyacencia la complejidad del BFS es O(V 2 ). .Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Complejidad Complejidad de BFS Si se representa usando la lista de adyacencia la complejidad del BFS es O(V + E ).

no visito un nodo hasta haber visitado todos sus vecinos. marco el nodo como negro (visitado).Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea DFS Algoritmo para recorrer o buscar elementos en un grafo. Se comienza desde uno nodo y se marca como gris (parcialmente visitado). Cuando termino de visitar todos los vecinos. En otras palabras. Se explora cada uno de los vecinos de ese nodo. .

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Ejemplos .

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Pregunta Complejidad ¿Cu´ antas veces visto cada nodo? ¿Cu´ antas veces visito cada arista? De acuerdo a lo anterior ¿Cu´ al ser´ ıa una aproximaci´ on a la complejidad del algoritmo? Estructura de datos De las estructuras de datos mostradas anteriormente ¿Cu´ al ser´ ıa la apropiada para almacenar los nodos que tengo pendientes por visitar? .

Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Pregunta Complejidad ¿Cu´ antas veces visto cada nodo? ¿Cu´ antas veces visito cada arista? De acuerdo a lo anterior ¿Cu´ al ser´ ıa una aproximaci´ on a la complejidad del algoritmo? Estructura de datos De las estructuras de datos mostradas anteriormente ¿Cu´ al ser´ ıa la apropiada para almacenar los nodos que tengo pendientes por visitar? .

BLACK = 3 void dfs(int u){ color[u] = GRAY. GRAY.size(). // La lista de adyacencia int color[MAXN]. ++i){ int v = g[u][i]. // El arreglo de visitados enum {WHITE. ++u) if (color[u] == WHITE) dfs(u). // Visitar mis vecinos } color[u] = BLACK. u < n. if (color[v] == WHITE) dfs(v). // Marcar el nodo como visitado } void call_dfs(int n){ // Marcar los nodos como no visitados for (int u = 0. // WHITE = 1. i < g[u]. // Marcar el nodo como semi-visitado for (int i = 0. } . u < n.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Algoritmo DFS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 vector <int> g[MAXN]. GRAY = 2. BLACK}. ++u) color[u] = WHITE. // Llamar la funcion DFS con los nodos no visitados for (int u = 0.

se pueden hallar un camino desde la fuente hasta cada nodo.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Aplicaciones Buscar o recorrer elementos en un grafo. puedo hallar todos los nodos alcanzables desde este nodo inicial. . Se puede hacer que el DFS retorne alg´ un valor y verificar con ´ el condiciones en el grafo. Ver si existe un ciclo en el grafo (si uno de mis vecinos es gris cuando lo voy a visitar). Si en lugar de poner el color pongo el n´ umero del nodo con el que hice la llamada inicial desde call dfs. Si se guarda el nodo del que vine (padre).

Si se representa usando la matriz de adyacencia la complejidad del DFS es O(V 2 ).Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Complejidad Complejidad de DFS Si se representa usando la lista de adyacencia la complejidad del DFS es O(V + E ). .

factorcomun.org/contests/50 Para cada problema pensar: ¿C´ omo se construir´ ıa el grafo? ¿Es dirigido o no dirigido? ¿Debo usar BFS.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Tarea Tarea Resolver los problemas de http://contests. DFS o cualquiera de las dos? .

Si luego de esto me quedan fichas sin tumbar ¿Qu´ e caracter´ ıstica especial cumplen esas fichas? ¿C´ omo las debo derribar? . Empujar esas fichas y las que ellas derriben (marcarlas como visitadas). Cuando se vaya a visitar un nodo. C Pensar ¿Cu´ ales son las fichas que seguro tengo que derribar a mano?. verificar que no est´ e en la lista de los prohibidos. verificar que su color sea el contrario al m´ ıo si no es as´ ı retorne falso. B Si uno de mis vecinos ya est´ a visitado.Tarea Semana Anterior Pila Cola BFS: Breadth-First Search DFS: Depth-First Search Tarea Ayuda para la tarea Ayuda para cada problema A El grafo es general para todos los casos de prueba (no cambia).