88
Electivo I Unidad I Grafos Semana 4 Estructuras y Compresión de datos

S04 - 1 Grafos I

Embed Size (px)

Citation preview

Page 1: S04 - 1 Grafos I

Electivo I

Unidad I

Grafos

Semana 4

Estructuras y Compresión de datos

Page 2: S04 - 1 Grafos I

Competencia General

Implementa algoritmos y estructuras de

datos avanzados, haciendo énfasis en los

algoritmos de internet, seguridad y redes.

Page 3: S04 - 1 Grafos I

Capacidades Específicas

• Comprende la naturaleza de los

algoritmos asociados a estructuras de

datos avanzados.

• Implementa algoritmos utilizando

estructura de datos avanzadas

Page 4: S04 - 1 Grafos I

Procedimientos

Implementar algoritmos fundamentales

para la solución de problemas basados

en la teoría de grafos.

Page 5: S04 - 1 Grafos I

Co

nte

nid

os

Algoritmos sobre grafos elementales

Conectividad

Grafos ponderados

Árbol de expansión mínimo

Camino mas corto

Page 6: S04 - 1 Grafos I

Glosario Grafo: Un grafo es una colección

de vértices y aristas.

– Los vértices son objetos simples que

pueden tener un nombre y otras

propiedades;

– Una arista es una conexión entre

dos vértices.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

A

B C G

D E

F

A

B G

E

F

Camino: Un camino entre los

vértices x e y de un grafo es una

lista de vértices en la que dos

elementos sucesivos están

conectados por aristas del grafo.

Page 7: S04 - 1 Grafos I

Glosario Grafo conexo: Un grafo es conexo

si hay un camino desde cada

nodo hacia otro nodo del grafo.

Grafo no conexo: Esta constituido

por componentes conexos.

Camino simple: Es un camino en el

que no se repite ningún vértice.

Ciclo: es un camino simple con la

característica de que el primero y

el ultimo vértices son el mismo.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

A

B C G

D E

F

A

B

G

D E

F

A

B G

E

F

A G

E

F

Page 8: S04 - 1 Grafos I

Glosario Grafo completo: Son los grafos con

todas las aristas posibles.

Grafo disperso: Tienen

relativamente pocas aristas.

Grafo denso: Les falta muy pocas

aristas de todas las posibles.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

A

G

E F

A

G

E F

A

G

E F

Page 9: S04 - 1 Grafos I

Representación de un grafo

Matriz de adyacencia:

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

A

B C G

D E

F

A B C D E F G

A 1 1 1 0 0 1 1

B 1 1 0 0 0 0 0

C 1 0 1 0 0 0 0

D 0 0 0 1 1 1 0

E 0 0 0 1 1 1 1

F 1 0 0 1 1 1 0

G 1 0 0 0 1 0 1

Se construye un array de V*V

valores booleanos en el que a[x][y]

es igual a 1 si existe una arista

desde el vértice x al y, caso

contrario es igual a 0.

Es de destacar que en realidad cada arista se representa con dos bits:

una arista que enlace x e y se representa con valores verdaderos tanto

en a[x][y] como en a[y][x].

La matriz de

adyacencia

solo es

satisfactoria si

los grafos a

procesar son

densos.

Page 10: S04 - 1 Grafos I

Lista de adyacencia:

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

A

B C G

D E

F

La lista de adyacencia se adapta mejor a lo casos en los que

los grafos a procesar no son densos.

A B C D E F G

F A A A A

B

C

G

E

F

D

D F

G E

E

Representación de un grafo

Page 11: S04 - 1 Grafos I

Recorridos en un grafo

En una gran cantidad de problemas

con grafos, es necesario visitar

sistemáticamente los vértices y aristas

del grafo.

La búsqueda en PROFUNDIDAD y en

AMPLITUD, son dos técnicas importantes de recorrido del grafo.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

Page 12: S04 - 1 Grafos I

Búsqueda en Profundidad (BEP)

• Se comienza en el vértice inicial (vértice con

índice 1) que se marca como vértice activo.

• Hasta que todos los vértices hayan sido visitados,

en cada paso se avanza al vecino con el menor

índice siempre que se pueda, pasando este a ser

el vértice activo.

• Cuando todos los vecinos al vértice activo hayan

sido visitados, se retrocede al vértice X desde el

que se alcanzó el vértice activo y se prosigue

siendo ahora X el vértice activo.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

Page 13: S04 - 1 Grafos I

Búsqueda en Profundidad

a b

d e

c

a b

d e

c

a b

d e

c

a b

d e

c

a b

d e

c

a b

d e

c

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

La estructura utilizada para guardar los nodos a visitar en este

tipo de búsqueda es una pila o stack (de procedimiento

recursivo).

Page 14: S04 - 1 Grafos I

Búsqueda en Amplitud (BEA)

• Se comienza en el vértice inicial (vértice con índice

1) y se marca como vértice activo, a diferencia

con la BEP ahora se visitan en orden creciente de

índice todos los vecinos del vértice activo antes de

pasar al siguiente.

• Hasta que todos los vértices hayan sido visitados,

en cada paso se van visitando en orden creciente

de índice todos los vecinos del vértice activo.

• Cuando se han visitado todos los vecinos del

vértice activo, se toma como nuevo vértice activo

el primer vértice X visitado después del actual

vértice activo. Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

Page 15: S04 - 1 Grafos I

Búsqueda en Amplitud

a b

d e

c

0 a b

d e

c

0 1

1

1

a b

d e

c

0 1

1

1 2

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

En la búsqueda en

amplitud se utiliza una

cola para guardar tales

nodos a visitar.

Page 16: S04 - 1 Grafos I

Uso de los Recorridos

Ambos recorridos se pueden usar para resolver los

siguientes problemas:

– Probar que G es conectado.

– Obtener un árbol de expansión de G.

– Obtener los componentes conectados de G.

– Obtener un camino entre dos vértices dados de G, o

indicar que no existe tal camino.

El recorrido BEP se usa para:

– Obtener un ciclo en G, o indicar que G no tiene ciclos.

El recorrido BEA se usa para:

– Obtener para cada vértice V de G, el número mínimo de

aristas de cualquier camino entre S y V. Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

Page 17: S04 - 1 Grafos I

Laberintos

La búsqueda en profundidad fue expuesta

formalmente como un método para

recorrer laberintos.

Alg

oritm

os

sob

re g

rafo

s e

lem

en

tale

s

El grafo se construye colocando un

vértice en cada punto en el que existe

mas de un camino a tomar y a

continuación se conectan los vértices de

acuerdo con esos caminos.

• La búsqueda en profundidad es apropiada para la búsqueda de un

elemento en el laberinto por una sola persona, dado que el “siguiente

lugar a visitar” esta siempre próximo;

• La búsqueda en amplitud es mas apropiada para un grupo de

personas que buscan el mismo elemento desplazándose en todas las

direcciones a la vez

Page 18: S04 - 1 Grafos I

Problemática Se examinará una generalización de la conectividad denominada biconectividad, cuyo interés reside en conocer si hay mas de un medio de pasar de un vértice de un grafo a otro.

Co

ne

ctiv

ida

d

Grafo biconexo: Un grafo es

biconexo, si solo si, existen al menos

dos caminos diferentes que conecten

cada par de vértices. De esta forma

si se suprime un vértice y todas las

aristas que inciden en el, el grafo

permanece conexo.

A

G

E F

“Si para algunas aplicaciones es importante que un grafo sea

conexo, es también importante que permanezca conexo”

Page 19: S04 - 1 Grafos I

Problemática Una versión particular del problema de la conectividad, se da con frecuencia en lo que concierne a la situación dinámica en las que las aristas se añaden al grafo una a una, intercalando preguntas sobre si dos vértices determinados pertenecen o no a la misma componente conexa.

El problema se denomina a veces como “unión-pertenencia”.

Co

ne

ctiv

ida

d

Page 20: S04 - 1 Grafos I

Componentes conexas

• De un grafo no dirigido

– Se puede saber si es conexo, si no

lo, es se pueden conocer sus

componentes Conexas

• Conjunto W, de vértices del grafo

• En el cual hay camino desde

cualquier V1 a cualquier V2

• Donde V1 y V2 pertenecen a W

A

C

B

D

E A

C

B

D

E

CONEXO

No CONEXO

Componentes conexas: entre ellas son conexas

Co

ne

ctiv

ida

d

Page 21: S04 - 1 Grafos I

Biconectividad A veces es útil diseñar mas de una ruta entre puntos de un grafo, aunque solo sea para identificar posibles fallos en los puntos de conexión (vértices). Esto nos permitiría tener recorridos alternativos por ejemplo para llegar de una ciudad a otra.

Co

ne

ctiv

ida

d

A

G

E F

Page 22: S04 - 1 Grafos I

Puntos de articulación

En un grafo no dirigido conexo:

• Existen vértices que si se eliminan

– “Desconectan” al Grafo y lo dividen en componentes conexas

• Estos vértices “clave” son puntos de articulación

• Si un grafo no tiene Punto de Articulación

– Es biconexo

• La conectividad de un grafo

– Es el numero de nodos que se necesitan eliminar para dejar a

un grafo “desconectado”

Un punto de articulación en un grafo conexo es un

vértice que si se suprime romperá el grafo en dos o

mas piezas.

Co

ne

ctiv

ida

d

Page 23: S04 - 1 Grafos I

Ejemplo

A

D

C

B

E

F

Puntos de Articulación

Puntos de articulación C

on

ec

tiv

ida

d

Page 24: S04 - 1 Grafos I

Árbol de expansión

Definición: Un árbol T es un árbol de expansión de un grafo G si T es un

subgrafo que contiene a todos los vértices de G.

Co

ne

ctiv

ida

d

Page 25: S04 - 1 Grafos I

Árbol de expansión

• Para poder calcular los Puntos de Articulación de un grafo

– Hay que obtener el árbol de expansión

• Este se obtiene

– A partir del Recorrido en Profundidad

Ejemplo:

A

D

C

B

E

F

A

C

F

E

B

D

Arco en Retroceso: Cuando se quiere visitar un nodo que ya ha sido visitado y no es el padre

Co

ne

ctiv

ida

d

Page 26: S04 - 1 Grafos I

Como representar el árbol de

expansión • Un árbol en expansión

– No es un árbol binario

– Cada Vértice puede tener 0, 1 o n hijos

• Si no tomamos en cuenta los arcos en

retroceso, la representación depende del Grafo

– Matriz de Adyacencia -> Usar un arreglo

– Lista de Adyacencia -> Una lista

• La representación mostrará quien es el padre de

cada nodo

Co

ne

ctiv

ida

d

Page 27: S04 - 1 Grafos I

Árbol de expansión con Matriz

de Adyacencia

• Los vértices del grafo

– Se encuentran en un arreglo

– Cada índice del arreglo

• Representa un vértice

• Ej: A – 0, B – 1, etc.

• Al representar el árbol de expansión

– El padre(índice) de cada nodo

puede almacenarse en un arreglo

• Que también represente a los vértices

A

D

C

B

E

F

0 4 0 0 5 2 0

A

1

B

2

C

3

D

4

E

5

F

Co

ne

ctiv

ida

d

0 1

2

3

4

5

Page 28: S04 - 1 Grafos I

Árbol de expansión con Lista de

Adyacencia

• Los vértices del grafo

– Se encuentran en una lista

– Cada nodo representa un vértice

• Al representar el árbol de expansión

– De cada nodo de esta lista solo nos interesa

conocer al padre

– Se puede añadir un dato al nodo vértice

• Un enlace con el padre

A

D

C

B

E

F

A

B

C

D

E

F

Co

ne

ctiv

ida

d

Page 29: S04 - 1 Grafos I

Unión - Pertenencia C

on

ec

tiv

ida

d

En algunas aplicaciones se desea simplemente conocer si un vértice x esta o no conectado a un vértice y de un grafo, sin que sea importante el camino que los conecta.

Los grafos se corresponden de forma natural con los conjuntos (colecciones de objetos): los vértices representan a los objetos y las aristas significan “esta en el mismo conjunto que”.

A B

C

G

D E

F

{A F D E}

{B C G} Conjuntos

ó clases de

equivalencia

Cada componente conexa

corresponde a una clase de

equivalencia diferente

Page 30: S04 - 1 Grafos I

Unión - Pertenencia C

on

ec

tiv

ida

d

El añadir una arista se corresponde con la combinación de las clases de equivalencia representadas por los vértices a conectar.

El interés se centra en la pregunta fundamental “x es equivalente a y” ó “¿está x en el mismo conjunto que y?”. Esto se corresponde claramente con la pregunta fundamental de los grafos “¿está el vértice x conectado al vértice y?”

“Dado un conjunto de aristas, se puede construir una

representación por lista de adyacencia que corresponda al

grafo y utilizar la búsqueda en profundidad para asignar a

cada vértice el índice de su correspondiente conexa y

responder a las preguntas antes planteada con tal solo dos

accesos a arrays y una comparación”

Page 31: S04 - 1 Grafos I

Unión - Pertenencia C

on

ec

tiv

ida

d

Por correspondencia con el problema de los conjuntos, la adición de una nueva arista se denomina una operación de unión, y las preguntas se denominan operaciones de pertenencia.

El objetivo es escribir una función que pueda verificar si dos vértices x e y pertenecen al mismo conjunto (o,

en representación de grafos, a la misma componente conexa) y, en caso de que sea así, que pueda unirlos en el mismo

conjunto (colocando una arista entre ellos y el grafo).

En lugar de construir una lista de adyacencia directa o cualquier otra representación de los grafos, es mas eficaz utilizar una estructura interna orientada específicamente a la realización de las operaciones unión y pertenencia.

Page 32: S04 - 1 Grafos I

Unión - Pertenencia C

on

ec

tiv

ida

d

En resumen:

• Esta estructura interna es un bosque de arboles, uno por cada componente conexa.

• Se necesita poder encontrar si dos vértices pertenecen al mismo árbol y combinar dos arboles en uno.

Page 33: S04 - 1 Grafos I

Problemática Con frecuencia se desea modelar problemas prácticos utilizando grafos en los que se asocia a las aristas unos pesos o costes.

En un mapa de líneas aéreas, en el que las aristas representan rutas de vuelo, los pesos pueden representar distancias o tarifas. Estas situaciones hacen aparecer de forma natural cuestiones como el minimizar costes.

Gra

fos

po

nd

era

do

s

Page 34: S04 - 1 Grafos I

Problemática Se examinara los algoritmos de dos de estos problemas:

1. Encontrar la forma de conectar todos los puntos al menor coste (problema del árbol de expansión mínima).

2. Encontrar el camino de menor coste entre dos puntos dados (problema del camino mas corto).

G

rafo

s p

on

de

rad

os

La forma de representar a los grafos ponderados es obvia.

• En la representación por matriz de adyacencia, la matriz puede

contener pesos de aristas en lugar de valores booleanos y

• En la representación por listas de adyacencia se puede añadir un

campo a cada elemento de la lista, a manera de peso.

Page 35: S04 - 1 Grafos I

Árbol de Expansión Mínimo

(AEM) Un árbol de expansión mínimo de un grafo ponderado es una colección de aristas que conectan todos los vértices y en el que la suma de los pesos de las aristas es al menos inferior a la suma de los pesos de cualquier otra colección de aristas que conecten todos los vértices.

Gra

fos

po

nd

era

do

s -

AEM

Page 36: S04 - 1 Grafos I

Algoritmo genérico

• Se puede construir el árbol de expansión mínimo comenzando en cualquier vértice y tomando siempre el vértice mas próximo de todos los que se hayan elegido.

• En otras palabras; se busca la arista de menor peso entre todas las que conectan vértices que ya están en el árbol, con vértices que no lo están todavía, y después se añade al árbol la arista y el vértice a los que conduce la anterior. G

rafo

s p

on

de

rad

os

- A

EM

Page 37: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Tengamos el siguiente grafo no dirigido.

Gra

fos

po

nd

era

do

s -

AEM

Page 38: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso En primer lugar usaremos el método MakeSet de unión-find para inicializar cada componente, obteniendo las siguientes componentes conexas iniciales:

Gra

fos

po

nd

era

do

s -

AEM

Page 39: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Ahora el siguiente paso es ordenar las aristas del grafo en orden ascendente:

Gra

fos

po

nd

era

do

s -

AEM

Page 40: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Lo siguiente será recorrer todas las aristas ya ordenadas y verificar si sus vértices están o no en la misma componente.

La primera arista a verificar es la que une a los vértices 8 y 7, verificamos si están en la misma componente, para ello hacemos Find(8) , Find(7):

Gra

fos

po

nd

era

do

s -

AEM

Page 41: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Como podemos observar en la tabla y en la misma imagen no están en la misma componente conexa, por tanto esta arista es valida para el árbol de expansión mínima (AEM) así que unimos los vértices por el método de Union( 8 , 7 ).

Gra

fos

po

nd

era

do

s -

AEM

Page 42: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 43: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Observamos la tabla de Union-Find y vemos que Find(3) != Find(9). Entonces es posible realizar la unión de ambas componentes:

Gra

fos

po

nd

era

do

s -

AEM

Page 44: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 45: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso En la imagen podemos observar que ambos vértices no están en la misma componente, por tanto realizamos la Union( 6 , 7 ):

Gra

fos

po

nd

era

do

s -

AEM

Page 46: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista, los vértices 1 y 2 no están en la misma componente conexa:

Gra

fos

po

nd

era

do

s -

AEM

Page 47: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Realizamos la Union(1,2):

Gra

fos

po

nd

era

do

s -

AEM

Page 48: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 49: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Al observar la imagen los vértices 3 y 6 están en distinta componentes conexas. Entonces realizamos la Union(3,6) y actualizamos la tabla de Union-Find.

Gra

fos

po

nd

era

do

s -

AEM

Page 50: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

En este caso si

observamos la imagen los

vértices 7 y 9 están en la

misma componente

conexa; asimismo en la

tabla de Union-Find el

elemento raíz del vértice

7 es el mismo que el del

vértice 9 por ello

afirmamos que están el a

misma componente

conexa, por lo tanto no

habrá que realizar la

unión de ambos vértices.

Con esto evitamos tener

ciclos en el árbol de

expansión mínima.

Gra

fos

po

nd

era

do

s -

AEM

Page 51: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 52: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Al observar la imagen los vértices 3 y 4 no están en la misma componente conexa por lo tanto realizamos la Union(3,4) en el grafo:

Gra

fos

po

nd

era

do

s -

AEM

Page 53: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 54: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Los vértices 8 y 9 están en la misma componente conexa por lo tanto no realizamos Unión de vértices. Continuemos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 55: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Los vértices 1 y 8 están diferentes componentes. Realizamos la Union(1,8) en el grafo:

Gra

fos

po

nd

era

do

s -

AEM

Page 56: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 57: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Los vértices 2 y 3 están en la misma componente conexa por lo tanto no realizamos Union de componentes. Continuamos con la siguiente arista:

Gra

fos

po

nd

era

do

s -

AEM

Page 58: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Los vértices 4 y 7 no están en la misma componente conexa, realizamos Union(4,5) en el grafo:

Gra

fos

po

nd

era

do

s -

AEM

Page 59: S04 - 1 Grafos I

Algoritmo de Kruskal – paso

a paso Como podemos observar ya están todos los vértices del grafo conectados así que al momento de continuar viendo las demás aristas ordenadas siempre tendremos e l caso de que ya están en la misma componente conexa por lo tanto el Árbol de Expansión Mínima para el grafo es el siguiente:

El peso total del árbol de expansión mínima para el grafo mostrado

es 39.

Gra

fos

po

nd

era

do

s -

AEM

Page 60: S04 - 1 Grafos I

Verificación del Arbol de

Expansión Mínima (AEM) Para que sea un AEM válido, el número de aristas debe ser igual al número de vértices – 1. Esto se cumple debido a que el AEM debe poseer todos los vértices del grafo ingresado y además no deben existir ciclos. Si vemos el ejemplo antes explicado tenemos en el AEM:

Número de Aristas = 8

Número de Vértices = 9

Cumple con lo dicho -> 9 – 1 = 8

por tanto tenemos un AEM válido

Gra

fos

po

nd

era

do

s -

AEM

Page 61: S04 - 1 Grafos I

Camino mas corto (CMC)

• El problema del camino mas corto consiste en encontrar entre todos los caminos que conectan a dos vértices x e y dados de un grafo ponderado el que cumple con la propiedad de que la suma de las ponderaciones de todas las aristas sea mínima.

• Si las ponderaciones son todas iguales a 1, entonces el problema sigue siendo interesante: ahora consiste en encontrar el camino que contenga al mínimo de aristas que conecten a x e y.

Gra

fos

po

nd

era

do

s -

CM

C

Page 62: S04 - 1 Grafos I

Algoritmo de Dijkstra

El algoritmo de Dijkstra determina la ruta más corta desde un nodo origen hacia los demás nodos para ello es requerido como entrada un grafo cuyas aristas posean pesos.

Gra

fos

po

nd

era

do

s -

CM

C

Page 63: S04 - 1 Grafos I

Algoritmo de Dijkstra

Como trabaja:

Gra

fos

po

nd

era

do

s -

CM

C

Primero marcamos todos los vértices como no utilizados. El algoritmo parte de un vértice origen que será ingresado, a partir de ese vértices evaluaremos sus adyacentes, como dijkstra usa una técnica greedy -La técnica greedy utiliza el principio de que para que un camino sea óptimo, todos los caminos que contiene también deben ser óptimos- entre todos los vértices adyacentes, buscamos el que esté más cerca de nuestro punto origen, lo tomamos como punto intermedio y vemos si podemos llegar más rápido a través de este vértice a los demás. Después escogemos al siguiente más cercano (con las distancias ya actualizadas) y repetimos el proceso. Esto lo hacemos hasta que el vértice no utilizado más cercano sea nuestro destino. Al proceso de actualizar las distancias tomando como punto intermedio al nuevo vértice se le conoce como relajación.

Page 64: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Tengamos el siguiente grafo, cuyos ID están en color negro encima de

cada vértice, los pesos están en color azul y la distancia inicial en cada

vértice es infinito.

Hallaremos la distancia mínima partiendo del vértice 1 hacia los otros

vértices.

Page 65: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Inicializamos los valores de nuestros arreglos.

Donde: • Vértices: ID de los vértices. • Distancia[ u ]: Distancia mas corta desde vértice inicial a vértice con ID = u. • Visitado[ u ]: 0 si el vértice con ID = u no fue visitado y 1 si ya fue visitado. • Previo[ u ]: Almacenara el ID del vértice anterior al vértice con ID = u, servirá

para impresión del camino mas corto.

Page 66: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

De acuerdo al vértice inicial que elijamos cambiara la distancia inicial,

por ejemplo la ruta más corta partiendo del vértice 1 a todos los demás

vértices:

El vértice 1 es visitado, la distancia de vértice 1 al vértice 1 es 0

por estar en el mismo lugar.

Page 67: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Hasta este momento la tabla quedaría de la siguiente manera.

Ahora vemos sus

adyacentes que no

hayan sido visitados.

Tendríamos 2 y 4.

Page 68: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Evaluamos primero para el vértice 2

Vemos que la distancia actual desde el vértice inicial a 2 es ∞,

verifiquemos el paso de relajación:

(distancia[ 1 ] + 7) < distancia[ 2 ] -> 0 + 7 < ∞ -> 7 < ∞

Page 69: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

El paso de relajación es posible realizarlo entonces actualizamos la

distancia en el vértice 2 y agregando el vértice en la cola de prioridad

con nueva distancia quedando:

Page 70: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Ahora evaluamos al siguiente adyacente que es el vértice 4:

De manera similar al anterior vemos que la distancia actual desde el

vértice inicial a 4 es ∞, verifiquemos el paso de relajación:

(distancia[ 1 ] + 2) < distancia[ 4 ] -> 0 + 2 < ∞ -> 2 < ∞

Page 71: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

El paso de relajación es posible realizarlo entonces actualizamos la

distancia en el vértice 4 quedando:

En cuanto a la cola de prioridad como tenemos un vértice con

menor peso, este nuevo vértice ira en el tope de la cola:

Page 72: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Revisamos sus adyacentes no visitados que serian los vértices 2, 3 y 5.

Page 73: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Evaluamos primero para el vértice 2

Ahora vemos que la distancia actual del vértice inicial al vértice 2 es

7, verifiquemos el paso de relajación:

(distancia[ 4 ] + 3) < distancia[ 2 ] -> 2 + 3 < 7 -> 5 < 7

Page 74: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

En esta oportunidad hemos encontrado una ruta mas corta partiendo

desde el vértice inicial al vértice 2, actualizamos la distancia en el

vértice 2 y actualizamos el vértice previo al actual quedando:

En cuanto a la cola de

prioridad como tenemos un

vértice con menor peso este

nuevo vértice ira en el tope de

la cola, podemos ver que

tenemos 2 veces el mismo

vértice pero como usamos una

técnica greedy siempre

usaremos el valor óptimo:

Page 75: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Continuamos con los Vértices 3 y 5, como tienen valor si será posible

relajarlos, por lo que sería similar a los pasos iniciales solo que en los

pasos iniciales distancia[ 1 ] era 0 en este caso distancia[ 4 ] es 2,

quedando:

Page 76: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Hemos terminado de evaluar al vértice 4, continuamos con el tope de

la cola que es vértice 2, el cual marcamos como visitado.

Page 77: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Los adyacentes no visitados del vértice 2 es el vértice 3.

Ahora vemos que la distancia actual del vértice inicial al vértice 3 es

10, verifiquemos el paso de relajación:

(distancia[ 2 ] + 1) < distancia[ 3 ] -> 5 + 1 < 10 -> 6 < 10

Page 78: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

En esta oportunidad hemos encontrado una ruta mas corta partiendo

desde el vértice inicial al vértice 3, dicha ruta sería 1 -> 4 -> 2 -> 3 cuyo

peso es 6 que es mucho menor que la ruta 1 – > 4 -> 3 cuyo peso es 10,

actualizamos la distancia en el vértice 3 quedando:

Page 79: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

El siguiente vértice de la cola de prioridad es el vértice 3 y su único

adyacente no visitado es el vértice 5.

Vemos que la distancia actual del vértice inicial al vértice 5 es 7,

verifiquemos el paso de relajación:

(distancia[ 3 ] + 5) < distancia[ 5 ] -> 6 + 5 < 7 -> 11 < 7

Page 80: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

En esta oportunidad no se cumple por lo que no relajamos el vértice 5.

La tabla en cuanto a distancias no sufre modificaciones y no

agregamos vértices a la cola:

Page 81: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Ahora tocaría el vértice 2 pero como ya fue visitado seguimos

extrayendo elementos de la cola, el siguiente vértice será el 5.

Page 82: S04 - 1 Grafos I

Algoritmo de Dijkstra – paso

a paso

Gra

fos

po

nd

era

do

s -

CM

C

Al ser el ultimo vértice a evaluar no posee adyacentes sin visitar por lo

tanto hemos terminado el algoritmo. En el grafico anterior observamos

que 2 aristas no fueron usadas para la relajación, las demás si fueron

usadas. La tabla final quedaría de la siguiente manera:

De la tabla si deseo saber la distancia mas corta del

vértice 1 al vértice 5, solo tengo que acceder al valor

del arreglo en su índice respectivo (distancia[ 5 ]).

Page 83: S04 - 1 Grafos I

Algoritmo de Dijkstra – Impresión camino encontrado

Gra

fos

po

nd

era

do

s -

CM

C

En el proceso anterior usábamos el arreglo previo[ u ] para almacenar

el ID del vértice previo al vértice con ID = u, ello me sirve para formar el

árbol de la ruta mas corta y además me sirve para imprimir caminos de

la ruta mas corta.

Page 84: S04 - 1 Grafos I

Algoritmo de Dijkstra – Impresión camino encontrado

Gra

fos

po

nd

era

do

s -

CM

C

Para imprimir el camino mas corto deseado usamos el arreglo previo[ u ],

donde u tendrá el ID del vértice destino, o sea si quiero imprimir el

camino mas corto desde vértice 1 -> vértice 3 partiré desde previo[ 3 ]

hasta el previo[ 1 ].

Veamos gráficamente el funcionamiento, desde el grafo comenzamos

en 3

Page 85: S04 - 1 Grafos I

Algoritmo de Dijkstra – Impresión camino encontrado

Gra

fos

po

nd

era

do

s -

CM

C

El previo de 3 es el vértice 2, por lo tanto ahora evaluó 2:

Page 86: S04 - 1 Grafos I

Algoritmo de Dijkstra – Impresión camino encontrado

Gra

fos

po

nd

era

do

s -

CM

C

Ahora el previo de 2 es el vértice 4:

Page 87: S04 - 1 Grafos I

Algoritmo de Dijkstra – Impresión camino encontrado

Gra

fos

po

nd

era

do

s -

CM

C

El previo de 4 es el vértice inicial 1

Como el previo de 1 es -1 terminamos el recorrido, ahora en el

retorno de las llamadas recursivas imprimo el camino: 1 4 2 3

Page 88: S04 - 1 Grafos I

Electivo I

Unidad I

Grafos

Semana 4

Estructuras y Compresión de datos