La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Estructura de Datos 4 Grafos Dirigidos

Presentaciones similares


Presentación del tema: "Estructura de Datos 4 Grafos Dirigidos"— Transcripción de la presentación:

1 Estructura de Datos 4 Grafos Dirigidos
M. en C. J. Jesús Arellano Pimentel

2 4 Grafos Dirigidos 4.1. Definiciones fundamentales
4.2. Representaciones de Grafos dirigidos. 4.3.Problema de los caminos más cortos con un solo origen. 4.4. Problema de los caminos más cortos entre todos los pares. 4.5. Recorridos en grafos dirigidos 4.6. Grafos dirigidos acíclicos 4.7. Componentes fuertes

3 4.1. Definiciones fundamentales (I)
Grafos dirigidos Los grafos representan relaciones arbitrarias entre objetos de datos. Un grafo dirigido G consiste en un conjunto de vértices V y un conjunto de arcos A. Los vértices también se denominan nodos o puntos. Un arco es un par ordenado de vértices (v, w); donde v es la cola y w la cabeza del arco. Se expresa como: v  w Se representa como: Se dice que: El arco v  w, va de v a w Y que w es adyacente a v v w

4 4.1. Definiciones fundamentales (II)
Grafos dirigidos La siguiente figura presenta un grafo dirigido con cuatro vértices y cinco arcos. Los vértices pueden usarse para representar objetos, y los arcos, relaciones entre los objetos. Por ejemplo: los vértices pueden representar ciudades, y los arcos, vuelos aéreos de una ciudad a otra. 1 2 3 4

5 4.1. Definiciones fundamentales (III)
Grafos dirigidos Un camino en un grafo dirigido es una secuencia de vértices v1, v2, …, vn, tal que v1v2, v2v3, …, vn-1vn, son arcos. Este camino va del vértice v1 al vértice vn y pasa por los vértices v2, v3, …, vn-1, y termina en el vértice vn. La longitud del camino es el número de arcos en ese camino (n-1 para el caso anterior). Un vértice sencillo v, por si mismo denota un camino de longitud 0 que va de v a v. En la figura anterior la secuencia 1,2,4, es un camino de longitud 2 que va del vértice 1 al vértice 4.

6 4.1. Definiciones fundamentales (IV)
Grafos dirigidos Un camino es simple si todos sus vértices, excepto tal vez el primero y el último, son distintos. Un ciclo simple es un camino de longitud por lo menos uno, que empieza y termina en el mismo vértice. Es útil asociar información a los vértices y arcos de un grafo dirigido. Las etiquetas pueden estar en los vértices y/o en los arcos. Un vértice puede tener a la vez un nombre y una etiqueta.

7 4.2. Representaciones de grafos dirigidos (I)
Para representar un grafo dirigido se pueden emplear varias estructuras de datos. Todo depende de las operaciones que se aplicarán a los vértices y a los arcos. Una representación común para un grafo dirigido G = (V, A) es la matriz de adyacencia. Para V = {1, 2, …, n} La matriz de adyacencia es de dimensión n x n Dicha matriz contiene elementos booleanos Un elemento i,j es verdadero si y sólo si existe un arco del vértice i al vértice j.

8 4.2. Representaciones de grafos dirigidos (II)
Matriz de adyacencia Ventajas: Tiempo de acceso independiente del tamaño de V y A. Es útil en algoritmos en los cuales es necesario saber si un arco dado está presente. Desventajas: Ocupa el espacio para alojar n2 arcos aún cuando quizá solo se tengan n arcos. Examinar completamente matrices grandes ocupa bastante tiempo. Grafo dirigido de transiciones a 1 2 a b b b b a 4 3 a Matriz de adyacencia etiquetada 1 2 3 4 a b a b a b a b

9 4.2. Representaciones de grafos dirigidos (III)
Otra representación para grafos dirigidos es mediante la lista de adyacencia. La lista de adyacencia para un vértice i es una lista, en algún orden, de todos los vértices adyacentes a i. Se puede representar el grafo G por un arreglo unidimensional donde cada elemento es un apuntador a la lista de adyacencia del vértice. La ventaja es que se utiliza un espacio proporcional al número de vértices. La desventaja es que el tiempo para determinar si existe un arco se incrementa en función de la cantidad de vértices. 1 2 3 4 Lista de adyacencia 2 3 1 2 3 4 4 2 3

10 4.3. Problema de los caminos más cortos con un solo origen (I)
Grafos dirigidos Para un grafo G=(V, A) en el cual cada arco tiene una etiqueta no negativa, y donde un vértice se especifica como origen. El problema es determinar el costo del camino más corto del origen a todos los demás vértices de V, donde la longitud de un camino es la suma de los costos de los arcos del camino.

11 4.3. Problema de los caminos más cortos con un solo origen (II)
Grafos dirigidos 1 10 100 2 30 5 50 10 60 3 4 20 Grafo dirigido con arcos etiquetados

12 4.3. Problema de los caminos más cortos con un solo origen (III)
Grafos dirigidos En la solución de este problema se maneja una técnica “ávida” conocida como algoritmo de Dijkstra. Opera a partir de un conjunto de S vértices cuya distancia más corta desde el origen ya es conocida. En principio S contiene solo el vértice de origen. En cada paso, se agrega algún vértice restante v a S, cuya distancia desde el origen es la más corta. Suponiendo que todos los arcos tienen costos no negativos, siempre es posible encontrar un camino más corto entre el origen y v que pasa sólo a través de los vértices de S, y que se llama especial. En cada paso del algoritmo se utiliza un arreglo D para registrar la longitud del camino más corto a cada vértice. Una vez que S incluye todos los vértices, todos los caminos son especiales, así que D contendrá la distancia más corta del origen a cada vértice. El algoritmo supone que existe: Un grafo dirigido G =(V, A) en el que V={1, 2, ..., n} y el vértice 1 es el origen. Un arreglo bidimensional C de costos, donde C[i][j] es el costo de ir del vértice i al vértice j por el arco ij, si no existe ij entonces el costo será . En cada paso, D[i] contiene la longitud del camino especial más corto actual para el vértice i. 1 2 5 3 4 10 50 20 30 60 100

13 4.3. Problema de los caminos más cortos con un solo origen (IV)
Grafos dirigidos Algoritmo de Dijkstra. S = {1}; para i = 2 hasta n hacer D[i ] = C[1][i ]; para i = 1 hasta n-1 hacer elige un vértice w en V-S tal que D[w] sea un mínimo; agrega w a S; para cada vértice v en V-S hacer D[v] = min(D[v], D[w] + C[w][v]); 1 2 5 3 4 10 50 20 30 60 100

14 4.3. Problema de los caminos más cortos con un solo origen (V)
Grafos dirigidos C = 1 2 3 4 5 Algoritmo de Dijkstra. S = {1}; para i = 2 hasta n hacer D[i ] = C[1][i ]; para i = 1 hasta n-1 hacer elige un vértice w en V-S tal que D[w] sea un mínimo; agrega w a S; para cada vértice v en V-S hacer D[v] = min(D[v], D[w] + C[w][v]); 1 2 5 3 4 10 50 20 30 60 100 10 30 100 50 10 20 60 i V S w V-S v D[2] D[3] D[4] D[5] D[w] + C[w][v] {1,2,3,4,5} {1} 10 30 100 1 {1,2} 2 {2, 3, 4, 5} {3, 4, 5} 3 60 = 60 4 30 10 +  =  5 100 10 +  =  2 {1,2,4} 4 {3, 5} 3 50 = 50 5 90 = 90 3 {1,2,4,3} 3 { 5} 5 60 = 60 4 {1,2,4,3,5} 5 { } {1,2,3,4,5} {1,2,4,3,5} 10 50 30 60

15 4.3. Problema de los caminos más cortos con un solo origen (VI)
Grafos dirigidos Algoritmo de Dijkstra y recuperación de caminos. S = {1}; para i = 2 hasta n hacer D[i ] = C[1][i ]; para i = 1 hasta n-1 hacer elige un vértice w en V-S tal que D[w] sea un mínimo; agrega w a S; para cada vértice v en V-S hacer D[v] = min(D[v], D[w] + C[w][v]); si D[w] + C[w][v] < D[v] entonces P[v] = w; C = 1 2 3 4 5 1 2 5 3 4 10 50 20 30 60 100 10 30 100 50 10 20 60 i V S w V-S v D[2] D[3] D[4] D[5] D[w] + C[w][v] P {1,2,3,4,5} {1} 10 30 100 P[2]=P[4]=P[5]=1 1 {1,2} 2 {2, 3, 4, 5} 3 60 = 60 P[3] = 2 {3, 4, 5} 4 30 10 +  =  5 100 10 +  =  2 {1,2,4} 4 {3, 5} 3 50 = 50 P[3] = 4 5 90 = 90 P[5] = 4 3 {1,2,4,3} 3 { 5} 5 60 = 60 P[5] = 3 4 {1,2,4,3,5} 5 { } P[2] = 1 P[3] = 4 P[4] = 1 P[5] = 3 {1,2,3,4,5} {1,2,4,3,5} 10 50 30 60

16 4.4. Problema de los caminos más cortos entre todos los pares (I)
Grafos dirigidos Para un grafo G=(V, A) en el cual cada arco tiene un costo no negativo, el problema es encontrar el camino de longitud más corta entre cada par ordenado de vértices (v , w).

17 4.4. Problema de los caminos más cortos entre todos los pares (II)
Grafos dirigidos La solución podría estar en aplicar Dijkstra, tomando cada vértice como origen. Un solución más directa es aplicar el algoritmo de R. W. Floyd. Supone que los vértices v están numerados como 1, 2, …, n. Utiliza una matriz A de n x n en la cual se calculan las longitudes de los caminos más cortos. Inicialmente A[i][j] = C[i][j] para toda i ≠ j. Si no existe un arco de i a j C[i][j] = . Cada elemento de la diagonal se hace 0. Se hacen n iteraciones sobre la matriz. Al final de la k-ésima iteración, A[i][j] tendrá la longitud más pequeña que vaya desde el vértice i hasta el vértice j y que no pase por un vértice con un número mayor que k.

18 4.4. Problema de los caminos más cortos entre todos los pares (III)
Grafos dirigidos Algoritmo de Floyd. En la k-ésima iteración aplica la fórmula: Ak-1[i][j] Ak[i][j] = min Ak-1[i,k] + Ak-1[k,j] k Ak-1[i][k] Ak-1[k][j] i j Ak-1[i][j]

19 4.4. Problema de los caminos más cortos entre todos los pares (IV)
Grafos dirigidos Algoritmo de Floyd. para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ]; A[i ][i ] = 0; para k = 1 hasta n hacer si A[ i ][k] + A[k][ j ] < A[i ][ j ] entonces A[i ][ j ] = A[i ][k] + A[k][ j ] k Ak-1[i][k] Ak-1[k][j] i j Ak-1[i][j]

20 4.4. Problema de los caminos más cortos entre todos los pares (V)
Grafos dirigidos Algoritmo de Floyd. para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ]; A[i ][i ] = 0; para k = 1 hasta n hacer si A[ i ][k] + A[k][ j ] < A[i ][ j ] entonces A[i ][ j ] = A[i ][k] + A[k][ j ] C = 1 2 3 8 2 2 8 5 1 2 3 2 3 3 2 5 Se copia C en A A = 1 2 3 La diagonal de A se hace 0’s A = 1 2 3 2 8 5 8 5 3 3 2 2 Para k = 1 A = 1 2 3 Para k = 2 A = 1 2 3 Para k = 3 A = 1 2 3 i j i j i j 1 1 1 1 1 1 8 5 8 5 7 5 2 2 2 3 3 3 2 1 3 8 2 1 3 8 2 1 3 8 2 2 2 3 3 3 2 5 2 5 2 3 1 3 1 3 1 2 2 2 3 3

21 4.4. Problema de los caminos más cortos entre todos los pares (VI)
Grafos dirigidos Algoritmo de Floyd con recuperación de caminos. para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ]; P[i ][ j ] = 0; A[i ][i ] = 0; para k = 1 hasta n hacer si A[ i ][k] + A[k][ j ] < A[i ][ j ] entonces A[i ][ j ] = A[i ][k] + A[k][ j ] P[i ][ j ] = k; Se agrega una Matriz P donde P[i ][ j ] tiene el vértice k que permitió a Floyd encontrar el valor más pequeño. Si P[i ][ j ] es 0 entonces el camino de i a j es directo

22 4.4. Problema de los caminos más cortos entre todos los pares (VII)
Grafos dirigidos Algoritmo de Floyd. para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ]; P[i ][ j ] = 0; A[i ][i ] = 0; para k = 1 hasta n hacer si A[ i ][k] + A[k][ j ] < A[i ][ j ] entonces A[i ][ j ] = A[i ][k] + A[k][ j ] P[i ][ j ] = k; 8 2 1 2 3 2 3 5 Se inicializa P con ceros P = 1 2 3 La diagonal de A se hace 0’s A = 1 2 3 3 8 5 1 3 2 2 Para k = 1 A = 1 2 3 Para k = 2 A = 1 2 3 Para k = 3 A = 1 2 3 i j i j i j 1 1 1 1 1 1 8 5 8 5 7 5 2 2 2 3 3 3 2 1 3 8 2 1 3 8 2 1 3 8 2 2 2 3 3 3 2 5 2 5 2 3 1 3 1 3 1 2 2 2 3 3

23 4.5. Recorridos en grafos dirigidos (I)
Consiste en visitar los vértices y los arcos de forma sistemática. Se utiliza la búsqueda en profundidad Es una generalización del recorrido en orden previo de un árbol. Ayuda a resolver con eficiencia muchos problemas relacionados con grafos dirigidos.

24 4.5. Recorridos en grafos dirigidos (II)
La búsqueda en profundidad trabaja de la siguiente forma: Para un grafo dirigido G en un principio se marcan todos los vértices de G como no visitados. Se selecciona un vértice v como punto de partida; v se marca como visitado. Después se recorre cada vértice adyacente a v que no se haya visitado y se marca como visitado, aplicando de forma recursiva este paso (3). Una vez que se hayan visitado todos los vértices alcanzables desde v, la búsqueda esta completa. Si algunos vértices de G quedan sin visitar, se selecciona uno de ellos como vértice de partida repitiendo el proceso desde el paso 2 hasta que todos los vértices de G se hayan visitado.

25 4.5. Recorridos en grafos dirigidos (III)
Para aplicar la búsqueda en profundidad se pueden utilizar: Un lista de adyacencia (L[v]) para representar los vértices adyacentes al vértice v, y Un arreglo marca cuyos elementos son del tipo (VISITADO, NOVISITADO), para saber si el vértice ya fue visitado o no. El procedimiento se inicia de la siguiente forma: para v = 1 hasta n hacer marca[v] = NOVISITADO; si marca[v] == NOVISITADO entonces bpf(v);

26 4.5. Recorridos en grafos dirigidos (IV)
El algoritmo para el procedimiento que realiza la búsqueda en profundidad (bpf) es el siguiente: bpf( v ){ marca[v] = VISITADO; para cada vértice w en L[v] hacer si marca[w] == NOVISITADO entonces bpf( w ); }

27 4.5. Recorridos en grafos dirigidos (V)
para v = 1 hasta n hacer F B A v bpf( v ) A bpf ( A ) A  VISITADO w en L[A] bpf ( w ) E B bpf ( B ) B  VISITADO w en L[B] bpf ( w ) G D C C bpf ( C ) C  VISITADO w en L[C] bpf ( w ) A Lista de adyacencia L[v] marca[v] D bpf ( D ) D  VISITADO B w en L[D] bpf ( w ) A A NOVISITADO VISITADO 1 A B C D B NOVISITADO VISITADO 2 C C A C NOVISITADO VISITADO 3 B D A C D NOVISITADO VISITADO 4 C E F G E NOVISITADO 5 D VISITADO E bpf ( E ) E  VISITADO F B F NOVISITADO VISITADO 6 w en L[E] bpf ( w ) G D F G NOVISITADO VISITADO 7 F bpf ( F ) F  VISITADO w en L[F] bpf ( w ) B para v = 1 hasta n hacer marca[v] = NOVISITADO; si marca[v] == NOVISITADO entonces bpf(v); bpf( v ){ marca[v] = VISITADO; para cada vértice w en L[v] hacer si marca[w] == NOVISITADO entonces bpf( w ); } G bpf ( G ) G  VISITADO w en L[G] bpf ( w ) D F F G

28 4.6. Grafos dirigidos acíclicos (I)
Un grafo dirigido acíclico, o gda, es un grafo dirigido sin ciclos. Los gda son más generales que los árboles, pero menos que los grafos dirigidos arbitrarios, si se cuantifican las relaciones que presentan. Árbol Gda Grafo dirigido A A A B C B C B C D E D E D E

29 4.6. Grafos dirigidos acíclicos (II)
Entre otras cosas los grafos dirigidos acíclicos son útiles para la representación de la estructura sintáctica de expresiones aritméticas con subexpresiones comunes. Por ejemplo la expresión: ( (a + b) * c + ((a + b) + e) * (e + f) ) * ((a + b) * c) * + * * + c + + a b e f

30 4.6. Grafos dirigidos acíclicos (III)
para v = 1 hasta n hacer v bpf( v ) F B A A bpf ( A ) A  VISITADO w en L[A] bpf ( w ) E B bpf ( B ) B  VISITADO w en L[B] bpf ( w ) C bpf ( C ) C  VISITADO G D C w en L[C] bpf ( w ) A D bpf ( D ) D  VISITADO Prueba de aciclicidad w en L[D] bpf ( w ) A C Si se encuentra un arco de retroceso durante la búsqueda de profundidad, entonces el grafo tiene un ciclo. B C D E bpf ( E ) E  VISITADO A E w en L[E] bpf ( w ) F bpf ( F ) F  VISITADO w en L[F] bpf ( w ) F G B B G bpf ( G ) G  VISITADO w en L[G] bpf ( w ) C D D F Árbol abarcador en profundidad para A Árbol abarcador en profundidad para B F G Bosque abarcador de profundidad

31 4.5. Componentes fuertes (I)
Grafos dirigidos Un componente fuertemente conexo de un grafo dirigido es un conjunto máximo de vértices en el cual existe un camino que va desde cualquier vértice del conjunto hasta cualquier otro vértice también del conjunto. La búsqueda en profundidad puede utilizarse para determinar con eficiencia los componentes fuertemente conexos de un grafo dirigido Grafo dirigido Componentes fuertes Grafo reducido A B A,B,C A B D C D D C


Descargar ppt "Estructura de Datos 4 Grafos Dirigidos"

Presentaciones similares


Anuncios Google