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

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

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

10055 - Hashmat the Brave Warrior

1 2 3 4 5 6 7 8

int main(){ long long a, b; while(cin >> a >> b){ long long diff = abs(b - a); cout << diff << endl; } return 0; }

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

100 - 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, j; while(cin >> i >> j){ cout << i << " " << j << " "; if (i > j) swap(i, j); int best = 0; for (int k = i; k <= j; k++){ int count = 1; int n = k; while (n > 1){ if (n % 2 == 0) n /= 2; else n = 3 * n + 1; count++; } best = max(count, best); } cout << best << endl; } return 0; }

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

573 - 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, U, D, F; while (cin >> H >> U >> D >> F){ if (H == 0) break; int day = 0; double height = 0.0; double climb = U; double fatigue = (1.0 * U * F) / 100; while (height >= 0){ height += climb; day++; if (height > H) break; height -= D; climb = max(0.0, climb - fatigue); } if (height >= H) printf("success on day %d\n", day); else printf("failure on day %d\n", day); } return 0; }

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

483 - Word Scramble


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

vector <string> v; int main(){ string line; while (getline(cin, line)){ stringstream ss(line); v.clear(); string s; while (ss >> s) v.push_back(s); for (int i = 0; i < v.size(); ++i){ reverse(v[i].begin(), v[i].end()); if (i > 0) cout << " "; cout << v[i]; } cout << endl; } return 0; }

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 nal y s olo se pueden extraer elementos del nal. El u ltimo elemento que se insert o es el primer elemento en salir (LIFO). Un ejemplo ser a una pila de libros.

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. Pop() elimina el u ltimo elemento del stack. Top() retorna el u ltimo elemento almacenado.

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.push(10); s.push(-1); cout << s.top() << endl; s.pop(); cout << s.top() << endl; cout << s.size() << endl; return 0; }

// Incluir stack

// // // // // // //

Crear un stack de enteros Insertar 10 Insertar -1 Imprimir -1 Eliminar -1 Imprimir 10 El tamano del stack es 1

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 nal 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.

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. Pop() elimina el primer elemento de la cola. Front() retorna el primer elemento de la cola. Back() retorna el u ltimo elemento de la cola

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; int main(){ queue <int> q; q.push(10); q.push(-1); cout << q.front() << endl; q.pop(); cout << q.front() << endl; cout << q.size() << endl; return 0; }

// Incluir queue

// // // // // // //

Crear una cola de enteros Insertar 10 Insertar -1 Imprimir 10 Eliminar 10 Imprimir -1 El tamano de la cola es 1

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

BFS

Algoritmo para recorrer o buscar elementos en un grafo. Se comienza desde uno nodo y se exploran todos los vecinos de este nodo. Luego, 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.

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?

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]; int d[MAXN];

// La lista de adyacencia // Aristas usadas desde la fuente

void bfs(int s, int n){ // s = fuente, n = numero de nodos // Marcar todos los nodos como no visitados for (int i = 0; i < n; ++i) d[i] = -1; queue <int> q; q.push(s); // Agregar la fuente a la cola d[s] = 0; // La distancia de la fuente es 0 while (q.size() > 0){ int cur = q.front(); q.pop(); for (int i = 0; i < g[cur].size(); ++i){ int next = g[cur][i]; if (d[next] == -1){ // Si todava no lo he visitado d[next] = d[cur] + 1; // La distancia que llevo + 1 q.push(next); // Agregarlo a la cola } } } }

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

Aplicaciones

Buscar o recorrer elementos en un grafo. Hallar m nimo n umero de aristas para llegar de la fuente a cualquier nodo. Hallar los nodos alcanzables desde la fuente (Ver si existe un camino de la fuente a cualquier nodo). Si se guarda el nodo del que vine (padre), se pueden hallar las aristas pertenecientes al camino m as corto desde la fuente hasta cada nodo. Con algunas modicaciones sirve para ver si existe un ciclo en alg un camino que sale desde la fuente.

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 ). 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

DFS

Algoritmo para recorrer o buscar elementos en un grafo. Se comienza desde uno nodo y se marca como gris (parcialmente visitado). Se explora cada uno de los vecinos de ese nodo. Cuando termino de visitar todos los vecinos, marco el nodo como negro (visitado). En otras palabras, no visito un nodo hasta haber visitado todos sus vecinos.

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?

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]; // La lista de adyacencia int color[MAXN]; // El arreglo de visitados enum {WHITE, GRAY, BLACK}; // WHITE = 1, GRAY = 2, BLACK = 3 void dfs(int u){ color[u] = GRAY; // Marcar el nodo como semi-visitado for (int i = 0; i < g[u].size(); ++i){ int v = g[u][i]; if (color[v] == WHITE) dfs(v); // Visitar mis vecinos } color[u] = BLACK; // Marcar el nodo como visitado } void call_dfs(int n){ // Marcar los nodos como no visitados for (int u = 0; u < n; ++u) color[u] = WHITE; // Llamar la funcion DFS con los nodos no visitados for (int u = 0; u < n; ++u) if (color[u] == WHITE) dfs(u); }

Tarea Semana Anterior

Pila

Cola

BFS: Breadth-First Search

DFS: Depth-First Search

Tarea

Aplicaciones

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

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 ). 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

Tarea

Tarea Resolver los problemas de http://contests.factorcomun.org/contests/50 Para cada problema pensar: C omo se construir a el grafo? Es dirigido o no dirigido? Debo usar BFS, DFS o cualquiera de las dos?

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). Cuando se vaya a visitar un nodo, vericar que no est e en la lista de los prohibidos. B Si uno de mis vecinos ya est a visitado, vericar que su color sea el contrario al m o si no es as retorne falso. C Pensar Cu ales son las chas que seguro tengo que derribar a mano?. Empujar esas chas y las que ellas derriben (marcarlas como visitadas). Si luego de esto me quedan chas sin tumbar Qu e caracter stica especial cumplen esas chas? C omo las debo derribar?

You might also like