1 Algoritmos Elementales de Grafos Agustín J. González ELO-320: Estructura de Datos Y Algoritmos 1er.Sem. 2002.

Slides:



Advertisements
Presentaciones similares
Branch-and-bound Search
Advertisements

Agente Simple y Agente de Búsqueda Integrantes: Daga RamónCarolina. Farfan Losano Luis. Hernandez Triveño Marlon. La Rosa Taboada Carlos. Luque Cuba Julio.
Diseño y análisis de algoritmos
PRACTICO N° 6 GRAFOS año: 2012.
GRAFOS Presentado por: Oscar Leonardo Ramírez John Freddy Sandoval
Árboles Grafo que no contiene ciclos, es decir es un grafo también acíclico, pero a su vez es conexo.
Teoría de Grafos UCR – ECCI CI-1204 Matemáticas Discretas
GRAFOS ESTRUCTURAS DE DATOS.
GRAFOS: ALGORITMOS FUNDAMENTALES
Grupo 4 Matías Melgar Pablo Carbonell
Ordenamiento Topológico
MATEMÁTICAS DISCRETAS.
“GRAFOS” Chacón Zamora José Christian González García Andrea
Tema 5 Grafos. Recorridos..
ESTRUCTURAS DE DATOS AVANZADAS
Método de Ford-Fulkerson


Definiciones: conjuntos, grafos, y árboles
Teoría de Grafos.
Analisis y Diseño de Algoritmos Tema: Grafos 3ra Parte
AED I. Estructuras de Datos.
Cecilia Laborde González
Ordenamiento topológico
GRAFOS HUGO ARAYA CARRASCO.
Estructuras de datos y algoritmos
Programación entera y grafos
1 Kapitel 8: Graphalgorithmen 8.1 Grundlagen 8.2 Tiefen- und Breitensuche 8.3 Prim- und Kruskal-Algorithmus 8.4 Kürzeste Wege in Graphen 8.5 Eulersche.
PROGRAMACIÓN PARALELA EN ALGORITMOS SOBRE GRAFOS
Material de apoyo Unidad 4 Estructura de datos
Ejemplos de Grafos: Red de tráfico con caminos y cruces.
Grafos. Un Grafo G es un par de conjuntos (V, E), donde V es un conjunto no vacío de elementos llamados vértices o nodos y E es un conjunto formado por.
Definiciones: conjuntos, grafos, y árboles
Trabajo presentado por: LUIS FERNANDO OBANDO ING
Ordenamiento, Heapsort y Colas de prioridad
Árbol recubridor mínimo Distancias
Single-Source Shortest Paths “Camino más corto desde/hacia una fuente”
Matemáticas Discretas
Agentes de resoluciones d problemas Parte I. Un agente puede adoptar una meta o un propósito para satisfacer.
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos

Métodos de Búsqueda Informada. Búsqueda de la mejor Ruta En esta sección no sólo nos interesa encontrar una posible ruta, sino obtener aquella ruta que.
1 Estructuras de Datos Elementales:stacks (pilas), queues (colas), linked lists (listas enlazadas), y rooted trees (árboles con raíz) Agustín J. González.

Agustín J. González ELO-320: Estructura de Datos y Algoritmos
Agustín J. González ELO320: Estructura de Datos y Algoritmos
1 Algoritmos Avaros (Greedy Algorithms) Agustín J. González ELO-320: Estructura de Datos y Algoritmos 1er. Sem
Tópicos I Árboles, montículos y grafos
Experimentación Numérica
s t a c b d Grafos.
Problema de inclusión en una Curva Digital Por Orellana Muñoz, Alfonso Paz Vicente, Rafael Pérez Medina, Gerardo Rodríguez Naranjo.
Grafos..
1 Single-Source Shortest Paths “Camino más corto desde/hacia una fuente” Agustín J. González ELO320: Estructura de Datos y Algoritmos 1.er. Sem
Minimum Spanning Tree (Árbol de Expansión Mínima)
Definiciones: conjuntos, grafos, y árboles
1 Flujo Máximo Agustín J. González ELO320: Estructura de Datos y Algoritmos.
Agustín J. González ELO-320: Estructura de Datos Y Algoritmos
Agustín J. González ELO320: Estructura de Datos y Algoritmos
Minimum Spanning Tree (Árbol de Expansión Mínima)
Análisis de algoritmos Generalidades
Flujo en redes Def: una red N es un grafo orientado conexo que tiene dos nodos distinguidos una fuente s con grado de salida positivo y un sumidero t con.
Estructura de Datos 4 Grafos Dirigidos
UNIDAD 2 Grafos Árboles abarcadores mínimos Caminos más cortos.
ARBOLES GENERALIZADOS
BUSQUEDA EN ANCHURA Y PROFUNDIDAD
BUSQUEDA POR PROFUNDIDAD INTELIGENCIA ARTIFICIAL
Matemáticas Discretas MISTI
Recorridos de grafos Segunda Parte M.C. Meliza Contreras González.
BÚSQUEDA DE SOLUCIONES Soluciones no Informadas (cont.) Dra. Myriam Hernández A.
Transcripción de la presentación:

1 Algoritmos Elementales de Grafos Agustín J. González ELO-320: Estructura de Datos Y Algoritmos 1er.Sem. 2002

2 Introducción Estudiaremos métodos para representar y explorar o recorrer grafos. Explorar un grafo significa seguir sistemáticamente los arcos de un grafo para visitar sus vértices. Las dos representaciones más comunes para representar grafos son: Lista de adyacencia y matriz de adyacencia. Representación de grafos Un Grafo G =(V, E), V : conjunto de vértices y E conjunto de arcos, se representa preferiblemente con una lista de adyacencia porque ésta permite una representación compacta cuando el grafo es disperso; i.e. cuando |E| << |V| 2 Es preferible usar una representación con Matriz de Adyacencia cuando el grafo es denso; i.e. |E| ~ |V| 2,.o cuando es preciso saber rápidamente si hay un arco conectando dos vértices.

3 Representación con Listas de Adyacencia En este caso el Grafo G=(V, E) consiste de un arreglo Adj que almacena |V| listas, una para cada vértice en V. Para cada u  V, la lista de adyacencia Adj[u  contiene (punteros a) todos los vértices v tal que hay una arco (u,v)  E. Si el grafo es dirigido, se cumple que la suma de los largos de las listas de adyacencia es |E|. Si el grafo no es dirigido, se cumple que la suma de los largos de las listas de adyacencia es 2*|E|. Dado que cada arco aparece dos veces. En cualquier caso, la memoria requerida es O(max(|V|,|E|)) = O(|V|+|E|).

4 Representación con Listas de Adyacencia: Ejemplo Caso grafo no dirigido Caso Grafo dirigido Las listas de adyacencia pueden ser fácilmente adaptadas para representar grafos con peso. En estos un peso es asociado a cada arco a través de una función de peso w: E --> R. Así el peso del arco (u,v) es puesto en el nodo v de la lista u.

5 Representación con Matriz de Adyacencia: Ejemplo Caso grafo no dirigido –Notar la simetría. Para ahorrar memoria se puede almacenar sólo la mitad. Caso Grafo dirigido Si el grafo es con peso, el peso se almacena en la matriz. Cuando un arco no existe se toma algún valor que represente su ausencia 0, -1 etc. Dependiendo de la aplicación. La matriz de adyacencia es preferible cuando el grafo es pequeño por su simplicidad.

6 Algoritmos de Exploración de un grafo. La idea es visitar todos los vértices siguiendo los arcos. “Breadth-first search” búsqueda (visitar) primero por distancia (todos de igual distancia se visitan primero) Dado un vértice fuente s, Breadth-first search sistemáticamente explora los arcos del grafo G para “descubrir” todos los vértices alcanzables desde s. También calcula la distancia (menor número de arcos) desde s a todos los vértices alcanzables. También produce un árbol con raíz en s y que contiene a todos los vértices alcanzables. El camino desde s a cada vértice en este recorrido contiene el mínimo número de arcos. Es el camino más corto medido en número de vértices. Su nombre se debe a que expande uniformemente la frontera entre lo descubierto y lo no descubierto. Llega a los nodos de distancia k, sólo luego de haber llegado a todos los nodos a distancia k-1.

7 Algoritmos “Breadth-first search” (BFS) Inicialmente el algoritmo colorea los vértices con blanco. Luego éstos pasan a plomo y luego negro. El color plomo es usado para definir la frontera entre lo ya descubierto o explorado y lo por visitar. BFS(G,s) { /* pseudo-código */ int d[N], p[N], color[N]; /* Arreglos de distancia, de padres, y de color */ QUEUE Q; /* Cola usada como estructura auxiliar */ for ( cada vértice u  V[G] -{s}) { color [u] =Blanco; d[u] =  ; /* distancia infinita si el nodo no es alcanzable */ } color[s] =Plomo; d[s] = 0; p [s]=NULL; Enqueue(Q, s); while ( !Queue_Vacía(Q) ) { u = Cabeza(Q); for ( cada v  Adj [u] ) { if (color [v] == Blanco) { color[v]=Plomo; d [v]=d [u] +1; p [v] = u; Enqueue(Q, v); } Dequeue(Q); /* se extrae u */ color [u] = Negro; } } El tiempo de ejecución es O(|V|+|E|). Notar que cada nodo es encolado una vez y su lista de adyacencia es recorrida una vez también.

8 Ejemplo de Breadth-first search “Recorrido o Búsqueda de nodos en amplitud”

9 Algoritmos “Depth-first search” (DFS) Como en BFS, inicialmente el algoritmo colorea los vértices con blanco. Luego éstos pasan a plomo y luego negro. Aquí el color plomo es usado para definir nodos cuyos descendientes están siendo visitados. int tiempo; /* global */ int d[N], f[N], p[N], color[N]; /* Arreglos de tiempo de entrada, tiempo de salida, padres, y color */ DFS(G) { /* pseudo-código */ for ( cada vértice u  V[G]) { color [u] =Blanco; p[u] = NULL; } tiempo = 0; for (cada vértice u  V[G]) if (color[u] == Blanco) DFS_visit(u); } DFS_visit (u) /* pseudo-código */ color [u]= Plomo; /* Vértice Blanco u es visitado, ingresamos a su sub-árbol */ d[u] = ++tiempo; /* el tiempo se incrementa cada vez que “entramos y salimos” de un nodo*/ for ( cada v  Adj [u] ) { /* explora arcos (u,v) */ if (color [v] == Blanco) { p [v] = u; DFS_visit(v); } } color [u] = Negro; /* ennegrezca u, salimos de su sub-árbol */ f [u] = ++tiempo; } El tiempo de ejecución de DFS es también O(|V|+|E|). Cada arco y nodo es recorrido una vez.

10 Ejemplo de DFS

11 Orden Topológico El orden topológico tiene sentido sólo en grafos acíclicos dirigidos (DAG). Orden topológico de un DAG G=(V,E) es un orden lineal de todos los vértices tal que si G contiene el arco (u,v), entonces u aparece antes que v en el orden. Cuando se tienen muchas actividades que dependen parcialmente unas de otras, este orden permite definir un orden de ejecución sin conflictos. Gráficamente se trata de poner todos los nodos en una línea de manera que sólo haya arcos hacia delante. Algoritmo: –Topological_Orden(G) Llamar a DFS(G) para calcular el tiempo de término f[v] para cada vértice. Insertar cada nodo en una lista enlazada según su orden de término. Retornar la lista enlazada

12 Ejemplo: Orden topológico ¿Es este el único orden topológico?

13 Ejemplo: Orden topológico ¿Cuál es el orden topológico?

14 Detección de componentes fuertemente Conexas Una componente fuertemente conexa de un grafo G=(V,E) es el máximo conjunto de vértices U subconjunto de V tal que para cada par de vértices u, v en U, existan caminos desde u a v y viceversa. El algoritmo descubre todas las componentes fuertemente conexas. Para ello define el grafo traspuesto de G, G T = (V,E T ), donde E T ={(u,v) tal que (v,u) pertenece a E}. En otras palabras, invierte el sentido de todas los arcos. Algoritmo: Strongly_Connected_Components(G) 1.- Llamar a DFS(G) para obtener el tiempo de término f[u], para cada vértice u; 2.- Calcular G T ; 3.- Llamar a DFS(G T ), pero en el loop principal de DFS, considerar los vértices en orden decreciente de f [u]. 4.- La salida son los vértices de cada árbol de la foresta del paso 3. Cada árbol es una componente fuertemente conexa separada.

15 Ejemplo de Detección de Componentes fuertemente conexas

16 ¿Por qué funciona? No haremos una demostración rigurosa, pero si daremos algunos elementos que ayudan a su entendimiento. Cuando se recorre un grado en DFS se tiene: si v es un descendiente de u entonces f[v]<f[u]. Si v es descendiente de u, v es alcanzable desde u. La conectividad de nodos en una componente conexa es invariante con respecto a la inversión de arcos. Si de v llegamos a u, y de u llegamos a v, al invertir los arcos esta propiedad se mantiene. Al visitar los nodos de G T usando orden de término decreciente, para cada árbol estaremos partiendo por los mismos nodos que usamos en el recorrido de G. Tendremos que llegar a todos los conectados de todas formas y éstos definirán las componentes fuertemente conexas.