You are on page 1of 20

Algoritmo de FloydWarshall

Informtica - Hoja de Ejercicios 7

Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5

0 1 3

0
7 4

2 4 3 4

Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5

0 1 3

0
7 4

2 4 3 4

Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5

0 1 3

14

0
7 4

2 4 3 4

Objetivo
Dado un grafo ponderado, queremos obtener el camino de distancia mnima entre dos vrtices cualesquiera.
0 1
3 5

0 1 3

0 3 7 8 14

3 0 9 5 11

7 9 0 4 8

8 5 4 0 6

14 11 8 6 0

0
7 4

2 4 3 4

Representacin de un grafo
Matriz de adyacencia, con los pesos de cada arista. Si no hay arista entre dos vrtices determinados, se considera +
0 1
3 5

0 1 3
6

0 3 7 + +

3 0 + 5 +

7 + 0 4 8

+ 5 4 0 6

+ + 8 6 0

0
7 4

2 4 3 4

Representacin de un grafo
Matriz de adyacencia, con los pesos de cada arista. Si no hay arista entre dos vrtices determinados, se considera +
0 1
3 5

0 1 3
6

0 3 7 + +

3 0 + 5 +

7 + 0 4 8

+ 5 4 0 6

+ + 8 6 0

0
7 4

2 4 3 4

Simtrica, con ceros en la diagonal

Representacin de un grafo
Slo almacenamos los elementos por debajo de la diagonal principal.
0 0 1 2 3 4 1 2 3 4

0 3 7 + +

3 0 + 5 +

7 + 0 4 8

+ 5 4 0 6

+ + 8 6 0

[[3],[7,inf],[inf,5,4],[inf,inf,8,6]]
1 2 3 4

Representacin de un grafo
class MatrizCiudades: def __init__(self, numeroCiudades): .... def elemento(self, i, j): .... def cambiaElemento(self, i, j, n): .... def numeroCiudades(self): return len(self.matriz)

Clculo del camino mnimo


Supongamos que tenemos n ciudades, numeradas desde 0 hasta n-1. Construimos una sucesin de matrices: A0 -> A1 -> A2 -> ... -> An
El significado de Ak(i,j) es el siguiente: Longitud del camino mnimo que hay desde la ciudad i hasta la ciudad j, suponiendo que slo podemos pasar por las ciudades comprendidas entre 0 y k-1.

Clculo del camino mnimo


Ejemplo: A2
A2(i, j) = Longitud del camino mnimo que hay desde la ciudad i hasta la ciudad j, suponiendo que slo podemos pasar por las ciudades 0 y 1.
1
3 5

3 0
2 4 6

4
8

A2(0, 3) = 8 A2(0, 4) = +

Clculo del camino mnimo


A0(i, j) = Longitud del camino mnimo que hay desde la ciudad i hasta la ciudad j, suponiendo no podemos pasar por ninguna ciudad intermedia.
1
3 5

0 0 3 1 2 4
8

0 3 7 + +

3 0 + 5 +

7 + 0 4 8

+ 5 4 0 6

+ + 8 6 0

0
7 4

3 4

A0 es la matriz de adyacencia del grafo

Clculo del camino mnimo


An(i, j) = Longitud del camino mnimo que hay desde la ciudad i hasta la ciudad j, suponiendo que podemos pasar por cualquier ciudad intermedia.
1
3 5

0 0 3
6

0 3 7 8 14

3 0 9 5 11

7 9 0 4 8

8 5 4 0 6

14 11 8 6 0

0
7 4

1 4 2 3 4

An es lo que buscamos !

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

k-1

Si el nuevo camino mnimo no pasa por el nodo k-1 Ak(i,j)=Ak-1(i,j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

Si el nuevo camino mnimo pasa por el nodo k-1 Ak(i,j)=Ak-1(i,k-1) + Ak-1(k-1,j)

Clculo del camino mnimo


Cmo calcular Ak a partir de Ak-1?
Ak-1(i,j)

Ak-1(i, k-1)

k-1

Ak-1(k-1, j)

La opcin que ms nos conviene: Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

Resumen
def caminosMinimos (m): MAnterior = m n = m.numeroCiudades() for k in range(n): MSiguiente = ..calcular a partir de MAnterior.. MAnterior = MSiguiente return MSiguiente

Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

Solucin
def caminosMinimos (m): MAnterior = m n = m.numeroCiudades() for k in range(n): MSiguiente = MatrizCiudades(n) for i in range(1,n): for j in range(i): x = MAnterior.elemento(i,j) y = MAnterior.elemento(i,k-1) + MAnterior.elemento(k-1,j) MSiguiente.cambiaElemento(i,j,min(x,y)) MAnterior = MSiguiente return MSiguiente

Ak(i,j) = min { Ak-1(i,j), Ak-1(i,k-1)+Ak-1(k-1,j) }

You might also like