Anda di halaman 1dari 8

Anlise da Complexidade do Algoritmo de

Floyd-Warshall

Csar Garcia Daudt


Caio Licks Pires de Miranda
Instituto de Informtica
Universidade Federal do Rio Grande do Sul
13/10/2010
Resumo

Este artigo se prope a fazer uma breve apresentao do algoritmo de Floyd-


Warshall, exemplicar algumas de suas aplicaes e desenvolver o clculo de sua
complexidade. Mostrar tambm um exemplo simples de execuo do algoritmo.
1 Introduo
O algoritmo de Floyd-Warshall, desenvolvido independentemente trs vezes 
por Bernard Roy, Stephen Warshall e Robert Floyd , encontra o menor caminho
entre todos os pares de vrtices de um grafo valorado[2]. Vale ressaltar que ele
apenas encontra os valores de tais caminhos, e no a seqncia de arestas a ser
percorrida.
Algumas aplicaes deste algoritmo, alm da fundamental:

Calcular o Fecho Transitivo de um grafo[2].

Vericar se um grafo no-dirigido bipartido[2].

Achar um nodo central, i.e., aquele que minimiza a distncia mxima ou


mdia entre todos os vrtices[1].

Calcular o dimetro de um grafo[2].

Em uma situao prtica, poderamos pensar, por exemplo, em como avaliar


o melhor local para instalarmos uma loja. De fato, podemos denir como mel-
hor local aquele que diminui a distncia entre a loja e locais estratgicos e
importantes para ela, e.g.:

Um bairro onde o consumo dos produtos vendidos por ela alto

Estabelicimentos que prestaro servios para a loja

Um local onde se tenha uma grande concentrao de um pblico alvo para


a loja

fcil notar que este lugar ser um ponto "central", ou seja, um lugar que
minimiza a distncia mxima ou mdia de todos os outros pontos considerados
at ele.
Algoritmos de funo semelhante incluem:

Algoritmo de Dijkstra: Dado um nodo de um grafo, encontra a menor


distncia entre ele e todos os outros nodos.

Algoritmo de Johnson: Semelhante ao Floyd-Warshall, mas otimizado


para se trabalhar com grafos esparsos.

1
2 Formalizao
2.1 Idia

O algoritmo preenche uma matriz bidimensional, caminho[][], onde caminho[a][b]


o tamanho do menor caminho entre os nodos a e b. Alm disso, assume-se que
esta matriz est inicialmente preenchida com o valor de cada aresta ou innito,
caso no haja uma aresta entre dois vrtices.
Comeamos xando um vrtice k do grafo; para cada par (i,j) de vrtices,
ento, vericamos se o menor caminho j conhecido entre (i,j) supera a soma
do tamanho do caminho de i para k com o de k para j. Caso supere, o tamanho
do menor caminho passa a ser essa soma.

2.2 Pseudocdigo

1 f u n c f l o y d _ w a r s h a l l ( caminho [ ] [ ] )
2 f o r k = 1 to n
3 f o r i = 1 to n
4 f o r j = 1 to n
5 caminho [ i ] [ j ] = min ( caminho [ i ] [ j ] ,
6 caminho [ i ] [ k]+ caminho [ k ] [ j ] )

2.3 Deduo da complexidade

Cada lao for (linhas 2 a 4) pode ser convertido em um somatrio com o mesmo
valor inicial e nal. Considerando a comparao (deciso do valor mnimo en-
tre dois nmeros) como operao elementar e as atribuies e acessos a ma-
trizes como tempo constante, temos que a complexidade do algoritmo de Floyd-
Warshall dada por:

n X
X n X
n
1 (1)
k=1 i=1 j=1

Pode-se converter o somatrio da varivel j em n, pois estamos somando n


vezes o valor 1, e isolar este termo, que no depende da varivel j, resultando
no seguinte somatrio:

n X
X n
n 1 (2)
k=1 i=1

2
Repetindo o mesmo processo de deduo usado em 1, temos como resultado
5.

n
X
n n (3)
k=1

n
X
n2 1 (4)
k=1

n3 (5)

Logo, de imediato que notamos que o algoritmo de Floyd-Warshall possui


complexidade O(n3 ), onde n o nmero de vrtices do grafo fornecido.

3 Exemplo de Execuo
No exemplo abaixo, usamos o cdigo disponvel em [4] sobre o grafo da Figura
em [3] (matriz de adjacncia em [3]), mostrando as matrizes resultantes de cada
iterao do algoritmo. As iteraes nas quais no houve modicaes foram
omitidas.

Figura 1: Grafo

3
0 1 2 3
0 2 1
1 20 1 10 5
2 3
3 4 3

Tabela 1: Matriz de adjacncia do grafo

0 1 2 3
0 2 1
1 20 1 10 5
2 3 4
3 4 3

Tabela 2: Iterao 11

0 1 2 3
0 2 1
1 13 1 10 5
2 3 4
3 4 3

Tabela 3: Iterao 37

0 1 2 3
0 2 1
1 9 1 10 5
2 3 4
3 4 3

Tabela 4: Iterao 53

0 1 2 3
0 2 1
1 9 1 8 5
2 3 4
3 4 3

Tabela 5: Iterao 55

4
4 Exemplo de implementao
1 #!/usr/bin/env python

3 def p r i n t _ m a t r i z ( m a t r i z ) :
4 for i in r a n g e ( l e n ( m a t r i z ) ) :
5 print m a t r i z [ i ]
6 print
7

8 def f l o y d _ w a r s h a l l ( caminho ) :
9 s i z e = l e n ( caminho )
10 iteracao = 1
11

12 for k in r a n g e ( s i z e ) :
13 for i in r a n g e ( s i z e ) :
14 for j in r a n g e ( s i z e ) :
15 menor = min ( caminho [ i ] [ j ] ,
16 caminho [ i ] [ k]+ caminho [ k ] [ j ] )
17

18 i f menor != caminho [ i ] [ j ] :
19 caminho [ i ] [ j ] = menor
20 print " I t e r a c a o " , i t e r a c a o
21 p r i n t _ m a t r i z ( caminho )
22

23 i t e r a c a o += 1
24

25 INFINITY = f l o a t ( " I n f i n i t y " )


26 g r a f o = [ [ 2 , INFINITY , 1 , INFINITY ] ,
27 [ 2 0 , 1 , 10 , 5 ] ,
28 [ 3 , INFINITY , INFINITY , INFINITY ] ,
29 [ 4 , INFINITY , 3 , INFINITY ] ]
30

31 print ( " Grafo : " )


32 print_matriz ( grafo )
33

34 floyd_warshall ( grafo )

5
5 Referncias

Referncias
[1] Steven S. Skiena, Miguel A. Revilla .Programming Challenges - The Pro-

gramming Contest Training Manual. Springer 1st edition, 2003.

[2] Floyd-Warshall Algorithm - Wikipedia, the free encyclopedia , disponvel em


http://en.wikipedia.org/wiki/Floyd-Warshall_algorithm.