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

Post on 24-Jan-2016

236 views 0 download

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

Estructura de Datos

4 Grafos Dirigidos

M. en C. J. Jesús Arellano Pimentel

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

4.1. Definiciones fundamentales (I)

• 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

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

4.1. Definiciones fundamentales (II)

1

3 4

2

• Un camino en un grafo dirigido es una secuencia de vértices v1, v2, …, vn, tal que v1v2, v2v3, …, vn-1vn, 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.

4.1. Definiciones fundamentales (III)

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

4.1. Definiciones fundamentales (IV)

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.

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.

1

4 3

2

Grafo dirigido de transiciones

a

a

a

a

b b b b

Matriz de adyacencia etiquetada

1 2 3 4

1

2

3

4

b

b

b

b

a

a

a

a

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.

Lista de adyacencia

1

2

3

4

2

4

2

3

3

1

3 4

2

4.3. Problema de los caminos más cortos con un solo origen (I)

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

4.3. Problema de los caminos más cortos con un solo origen (II)

1

2 5

3 4

10

50

20

10

30

60

100

Grafo dirigido con arcos etiquetados

4.3. Problema de los caminos más cortos con un solo origen (III)

• 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 ij, si no existe ij 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

10

30

60

100

4.3. Problema de los caminos más cortos con un solo origen (IV)

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

10

30

60

100

4.3. Problema de los caminos más cortos con un solo origen (V)

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

10

30

60

100

C =1 2 3 4 5

1

2

3

4

5

0 10 30 100

0 50

0 10

20 0 60

0

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 {2, 3, 4, 5}2{1,2}{3, 4, 5} 3 10 + 50 = 6060

4 10 + = 30

5 10 + = 100

2 4{1,2,4} {3, 5} 3 30 + 20 = 50505 30 + 60 = 9090

3 3{1,2,4,3} { 5} 5 50 + 10 = 6060

4 5{1,2,4,3,5} { }

{1,2,3,4,5} {1,2,4,3,5} 10 50 30 60

4.3. Problema de los caminos más cortos con un solo origen (VI)

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;

1

2 5

3 4

10

50

20

10

30

60

100

C =1 2 3 4 5

1

2

3

4

5

i V S w V-S v D[2] D[3] D[4] D[5] D[w] + C[w][v] P

0 10 30 100

0 50

0 10

20 0 60

0

{1,2,3,4,5} {1} 10 30 100

1 {2, 3, 4, 5}2{1,2} 3 10 + 50 = 6060

30

100

P[3] = 2

{3, 4, 5} 4 10 + =

P[2]=P[4]=P[5]=1

5 10 + = 2 4{1,2,4} {3, 5} 3 30 + 20 = 5050

5 30 + 60 = 90903 3{1,2,4,3} { 5} 5 50 + 10 = 6060

4 5{1,2,4,3,5} { }

{1,2,3,4,5} {1,2,4,3,5} 10 50 30 60

P[3] = 4

P[5] = 4

P[5] = 3

P[2] = 1 P[3] = 4 P[4] = 1 P[5] = 3

4.4. Problema de los caminos más cortos entre todos los pares (I)

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

4.4. Problema de los caminos más cortos entre todos los pares (II)

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

4.4. Problema de los caminos más cortos entre todos los pares (III)

• 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

i jAk-1[i][j]

Ak-1[k][j]Ak-1[i][k]

4.4. Problema de los caminos más cortos entre todos los pares (IV)

Algoritmo de Floyd.

para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ];para i = 1 hasta n hacer A[i ][i ] = 0;para k = 1 hasta n hacer para i = 1 hasta n hacer para j = 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

i jAk-1[i][j]

Ak-1[k][j]Ak-1[i][k]

4.4. Problema de los caminos más cortos entre todos los pares (V)

Algoritmo de Floyd.

para i = 1 hasta n hacer para j = 1 hasta n hacer A[i ][ j ] = C[i ][ j ];para i = 1 hasta n hacer A[i ][i ] = 0;para k = 1 hasta n hacer para i = 1 hasta n hacer para j = 1 hasta n hacer si A[ i ][k] + A[k][ j ] < A[i ][ j ] entonces A[i ][ j ] = A[i ][k] + A[k][ j ]

1 2 3

5

3

8

22

C = 1 2 3

1

2

3

2 8 5

3 0

2 0

Se copia C en A

A = 1 2 3

1

2

3

2 8 5

3 0

2 0

La diagonal de A se hace 0’s

A = 1 2 3

1

2

3

0 8 5

3 0

2 0

Para k = 1

A = 1 2 3

1

2

3

Para k = 2

A = 1 2 3

1

2

3

Para k = 3

A = 1 2 3

1

2

3

i j i j i j

1 1 02

8

3

5

2 1 32

0

3

8

3 1 2

2

3

0

1 1 02

8

3

5

2 1 32

0

3

8

3 1 5

2

2

3

0

1 1 02

7

3

5

2 1 32

0

3

8

3 1 5

2

2 0

4.4. Problema de los caminos más cortos entre todos los pares (VI)

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;para i = 1 hasta n hacer A[i ][i ] = 0;para k = 1 hasta n hacer para i = 1 hasta n hacer para j = 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

4.4. Problema de los caminos más cortos entre todos los pares (VII)

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;para i = 1 hasta n hacer A[i ][i ] = 0;para k = 1 hasta n hacer para i = 1 hasta n hacer para j = 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;

1 2 3

5

3

8

22

Se inicializa P con ceros

P = 1 2 3

1

2

3

0 0 0

0 0 0

0 0 0

La diagonal de A se hace 0’s

A = 1 2 3

1

2

3

0 8 5

3 0

2 0

Para k = 1

A = 1 2 3

1

2

3

Para k = 2

A = 1 2 3

1

2

3

Para k = 3

A = 1 2 3

1

2

3

i j i j i j

1 1 02

8

3

5

2 1 32

0

3

8

3 1 2

2

3

0

1 1 02

8

3

5

2 1 32

0

3

8

3 1 5

2

2

3

0

1 1 02

7

3

5

2 1 32

0

3

8

3 1 5

2

2 0

1

2

3

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.

4.5. Recorridos en grafos dirigidos (II)

• La búsqueda en profundidad trabaja de la siguiente forma:

1. Para un grafo dirigido G en un principio se marcan todos los vértices de G como no visitados.

2. Se selecciona un vértice v como punto de partida; v se marca como visitado.

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

4. Una vez que se hayan visitado todos los vértices alcanzables desde v, la búsqueda esta completa.

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

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;para v = 1 hasta n hacer

si marca[v] == NOVISITADO entoncesbpf(v);

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

}

4.5. Recorridos en grafos dirigidos (V)

v bpf( v )para v = 1 hasta n hacer

A bpf ( A ) A VISITADOw en L[A] bpf ( w )

B bpf ( B ) B VISITADOw en L[B] bpf ( w )

C bpf ( C ) C VISITADOw en L[C] bpf ( w )

A

D bpf ( D ) D VISITADOw en L[D] bpf ( w )

A

C

E bpf ( E ) E VISITADOw en L[E] bpf ( w )

F bpf ( F ) F VISITADOw en L[F] bpf ( w )

B

G bpf ( G ) G VISITADOw en L[G] bpf ( w )

D

F

B

C

D

F

G

E

F

G

B

D

A

C

A

B

C

E

D

F

G

marca[v]

NOVISITADO

NOVISITADO

NOVISITADO

NOVISITADO

NOVISITADO

NOVISITADO

NOVISITADO

1

2

3

5

4

6

7

Lista de adyacencia L[v]

A

B

C

E

D

F

G

B

C D

A

A C

F G

B

D F

para v = 1 hasta n hacer marca[v] = NOVISITADO;para v = 1 hasta n hacer 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 );}

VISITADO

VISITADO

VISITADO

VISITADO

VISITADO

VISITADO

VISITADO

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.

A

B C

D E

Árbol

A

B C

D E

Gda Grafo dirigido

A

B C

D E

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)

a b

+

*

c

+

*

+

e

+

f

*

4.6. Grafos dirigidos acíclicos (III)

v bpf( v )para v = 1 hasta n hacer

A bpf ( A ) A VISITADOw en L[A] bpf ( w )

B bpf ( B ) B VISITADOw en L[B] bpf ( w )

C bpf ( C ) C VISITADOw en L[C] bpf ( w )

A

D bpf ( D ) D VISITADOw en L[D] bpf ( w )

A

C

E bpf ( E ) E VISITADOw en L[E] bpf ( w )

F bpf ( F ) F VISITADOw en L[F] bpf ( w )

B

G bpf ( G ) G VISITADOw en L[G] bpf ( w )

D

F

B

C

D

F

G

E

F

G

B

D

A

C

Prueba de aciclicidad

Si se encuentra un arco de retroceso durante la búsqueda de profundidad, entonces el grafo tiene un ciclo.

A

B

C DÁrbol abarcador en profundidad para A

E

F G

Árbol abarcador en profundidad para B

Bosque abarcador de profundidad

4.5. Componentes fuertes (I)

• 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

A B

D C

Grafo dirigido

A B

D C

Componentes fuertes

A,B,C

D

Grafo reducido