Algoritmos Elementales de Grafos Breadth-first search Depth-first search Orden topol - PowerPoint PPT Presentation

About This Presentation
Title:

Algoritmos Elementales de Grafos Breadth-first search Depth-first search Orden topol

Description:

Muchas situaciones se pueden modelar a trav s de grafos. ... chaqueta. zapatos. reloj. 17/18. 11/16. 12/15. 13/14. 9/10. 1/8. 6/7. 2/5. 3/4. 14 ... – PowerPoint PPT presentation

Number of Views:121
Avg rating:3.0/5.0
Slides: 20
Provided by: agusting
Category:

less

Transcript and Presenter's Notes

Title: Algoritmos Elementales de Grafos Breadth-first search Depth-first search Orden topol


1
Algoritmos Elementales de Grafos Breadth-first
search Depth-first searchOrden
topológicoComponentes fuertemente conexas
  • Agustín J. González
  • ELO-320 Estructura de Datos y Algoritmos

2
Introducción
  • Muchas situaciones se pueden modelar a través de
    grafos. Por ejemplo una lista de actividades las
    cuales tiene dependencia unas de otras. No puedo
    ponerme la correa antes que el pantalón. Para
    detectar si hay vías de un solo sentido que
    conducen a caminos sin salida.
  • En la solución de estos problemas los mecanismos
    de recorrido de los nodos del árbol son
    importantes.
  • Existen dos formas básicas Recorrido por
    cercanía a un nodo dado (avanzar parejo en todas
    las líneas) o Breadth-first search y recorrido en
    profundidad (recorre todo un camino y luego
    explora otros) o Depth-first search.
  • (Breadth ancho, anchura amplitud. En un árbol
    la idea es recorrerlo hacia lo ancho primero.)
  • (Depth Profundidad)

3
Introducción (cont)
  • 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 ltlt V2
  • Es preferible usar una representación con Matriz
    de Adyacencia cuando el grafo es denso i.e. E
    V2,.o cuando es preciso saber rápidamente si
    hay un arco conectando dos vértices.

4
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 Adju?
    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
    2E. Dado que cada arco aparece dos veces.
  • En cualquier caso, la memoria requerida es
    O(max(V,E)) O(VE).

5
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
éstos un peso es asociado a cada arco a través de
una función de peso w E --gt R.Así el peso del
arco (u,v) es puesto en el nodo v de la lista u.
6
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.
7
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.

8
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 dN, pN,
    colorN / Arreglos de distancia, de padres, y
    de color / QUEUE Q / Cola usada como
    estructura auxiliar / for ( cada vértice u ?
    VG -s) color u Blanco du ? /
    distancia infinita si el nodo no es alcanzable
    / colors Plomo ds 0 p
    sNULL Enqueue(Q, s) while (
    !Queue_Vacía(Q) ) u Cabeza(Q) / u es el
    primer nodo de la cola / for ( cada v ? Adj
    u ) if (color v Blanco)
    colorvPlomo / Plomo al entrar a la
    cola / d vd u 1 p v
    u Enqueue(Q, v) Dequeue(Q) / se
    extrae u / color u Negro / negro luego
    de salir de la cola /
  • El tiempo de ejecución es O(VE). Notar que
    cada nodo es encolado una vez y su lista de
    adyacencia es recorrida una vez también.

9
Ejemplo de Breadth-first searchRecorrido o
Búsqueda de nodos en amplitud
10
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. En DFS el color plomo es
    usado para definir nodos cuyos descendientes
    están siendo visitados.
  • int tiempo / global /int dN, fN, pN,
    colorN / Arreglos de tiempo de entrada,
    tiempo de salida, padres, y color /
  • DFS(G) / pseudo-código / for ( cada
    vértice u ? VG) color u Blanco pu
    NULL tiempo 0 for (cada vértice u ?
    VG) if (coloru Blanco) DFS_visit(u)
  • DFS_visit (u) / pseudo-código / color u
    Plomo / Vértice Blanco u es visitado,
    ingresamos a su sub-árbol / du tiempo
    / el tiempo avanza cada vez que entramos o
    salimos de un nodo/ for ( cada v ? Adj u )
    / explora arcos (u,v) / if (color v
    Blanco) / v no ha sido visitado / p v
    u / u es el padre de v, se llegó a v vía 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(VE). Cada arco y nodo es recorrido una vez.

11
Ejemplo de DFS
u
v
w
(j)
2/7
1/8

4/5
3/6

y
z
x
12
Orden Topológico
  • 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.
  • El orden topológico tiene sentido sólo en grafos
    acíclicos dirigidos (DAG).
  • 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 fv para cada
    vértice. Listar los nodos en orden decreciente
    de tiempo de término.

13
Ejemplo Orden topológico
calcetines
calzoncillo
11/16
17/18
zapatos
13/14
pantalón
12/15
reloj
9/10
correa
camisa
1/8
6/7
corbata
2/5
chaqueta
3/4
calzoncillo
pantalón
correa
camisa
corbata
calcetines
chaqueta
zapatos
reloj
17/18
11/16
12/15
13/14
9/10
1/8
6/7
2/5
3/4
  • Es éste el único orden topológico?

14
Ejemplo Orden topológico
  • Cuál es el orden topológico?

15
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, GT (V,ET), donde ET(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 fu,
    para cada vértice u2.- Calcular GT3.- Llamar
    a DFS(GT), 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.

16
Ejemplo de Detección de Componentes fuertemente
conexas
c
a
b
d
e
f
g
h
17
Por qué funciona?
  • No haremos una demostración rigurosa, pero si
    daremos algunos elementos que ayudan a su
    entendimiento.
  • Cuando se recorre un grafo en DFS se tiene si v
    es un descendiente de u entonces fvltfu. (i.e.
    Los descendientes terminan primero.) Lo contrario
    no necesariamente es válido.
  • 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 iniciar nuestro recorrido usando orden de
    término decreciente, estaremos partiendo por
    nodos en distintas componentes (dado que otra
    manera serían descendientes). Al hacer el
    recorrido en orden inverso (GT) llegaremos a
    todos los de la componente conexa, pero no a
    aquellos de otras.

18
Por qué funciona? Continuación...
  • Si tenemos que C y C son dos componentes
    fuertemente conexas, y además hay un arco de C
    a C, entonces no puede haber un arco de C a C.
  • Si existiera el arco de vuelta C y Cserían sólo
    una componente fuertemente conexa.

19
Por qué funciona? Continuación...
  • Si tenemos que C y C son dos componentes
    fuertemente y un arco (u,v) que va de una a otra,
    entonces fu gt fv.
  • Si partimos el recorrido en algún nodo de C,
    naturalmente v será alcanzado después que u y por
    ello su fv será menor.
  • Si partimos el recorrido en algún nodo de C,
    fv será menor que todos los f de los nodos
    visitados luego en C.
  • Entonces al cambiar las flechas, y partir por
    mayores fu, podremos distinguir las componentes
    fuertemente conexas.
Write a Comment
User Comments (0)
About PowerShow.com