You are on page 1of 50

Teoria de Grafos: Caminho timo,

rvore Geradora tima, Fluxo Mximo


e Problemas de Caminho Bi-Critrio.

Leizer de Lima Pinto e Cludio Thoms Bornstein

Rio de Janeiro
Dezembro de 2007

Contedo
1. Conceitos bsicos
2. Definio dos Problemas
2.1. Caminho Mais Curto
2.2. Caminho de Mnimo Gargalo
2.3. Caminho de Mxima Capacidade
2.4. Caminho de Confiabilidade Mxima
2.5. rvore Geradora Mnima
2.6. rvore Geradora MinMax
2.7. Fluxo Mximo
2.8. Caminho Bi-Critrio
3. Aplicaes para os Problemas
3.1. Caminho Mais Curto com e sem Restries
3.2. Caminho Bi-Objetivo
3.3. rvore Geradora Mnima
3.4. Caminho de Mnimo Gargalo
3.5. Caminho de Confiabilidade Mxima
3.6. Fluxo Mximo
4. Resoluo do Problema de Caminho Mais Curto (e demais problemas de caminho)
4.1. Via Programao Linear
4.2. Via Programao Dinmica
4.3. Algoritmo de Dantzig
4.4. Algoritmo de Dijkstra
4.4.1. Original
4.4.2. Heap
4.5. Algoritmo de Atualizao de Distncias
4.5.1. Genrico
4.5.2. Genrico Modificado
5. Resoluo do Problema de rvore Geradora Mnima
5.1. Algoritmo de Prim
5.2. Algoritmo de Kruskal
6. Resoluo do Problema de rvore Geradora MinMax (ainda no tem)
6.1. Algoritmo de Gabow e Tarjan

7. Fluxo Mximo (ainda no tem)


7.1. Algoritmo de Ford e Fulkerson
8. Resolvendo o Problema de Caminho Bi-Critrio (ainda no tem)
8.1. Problema MinSum com restrio de gargalo (algoritmo de Berman et al)
8.2. Problema MaxMin com restrio de soma (algoritmo de Berman et al)
8.3. Algoritmos polinomiais para problemas Bi-Objetivo
8.3.1. Definio de Pareto-timo
8.3.2. Definio de Conjunto Mnimo (e Mximo) Completo
8.3.3. Algoritmo de Berman et al para o problema MinSum-MaxMin

Conceitos Bsicos
Iniciamos apresentando conceitos bsicos de Teoria de Grafos que estaremos utilizando
no decorrer deste curso.
Definies:
1. Um grafo G(N,M) uma estrutura de dados definida por:

N Conjunto enumervel de elementos; e,

M Conjunto de pares de elementos de N.

2. i N dito um n (vrtice) de G.
3. (i, j ) M dito um arco (aresta) de G.
4. Se (i,j) um par ordenado, ento (i,j) dito um arco orientado e, neste caso, i e j
so ditos, respectivamente, extremidade inicial e extremidade final do arco (i,j).
Caso (i,j) no seja um par ordenado dizemos que (i,j) um arco no orientado.
5. G um grafo orientado quando (i,j) orientado (i, j ) M .
6. G um grafo no orientado quando (i,j) no orientado (i, j ) M .
7. Dizemos que (i, j ), (i, j ) M so arcos paralelos.
8. O arco (i, i ) M dito um lao.
9. Quando N e M so conjuntos finitos dizemos que G um grafo finito.
10. Um grafo orientado, finito, sem laos nem arcos paralelos dito um digrafo.
11. Um grafo dito valorado quando aos arcos e/ou ns esto associados nmeros reis
ou inteiros.

Ateno: Na maior parte deste curso estaremos considerando um digrafo valorado.


Exemplos:
2

4
4

1
3

nem orientado nem no orientado

-3

21

0
4

4.5

Digrafo valorado

12. Um grafo no orientado completo quando existe um arco ligando cada par de ns.
Logo neste caso o nmero de arcos (n 2 n) 2 , onde n o nmero de ns.
Observe que no se considera laos nem arcos paralelos.
13. Um grafo orientado completo quando existe ao menos um arco ligando cada par
de ns. Logo neste caso o nmero de arcos est entre (n 2 n) 2 e (n 2 n) .

Sucessores, Antecessores e Adjacentes:


14. Dizemos que o n j N sucessor do n i N e i antecessor de j quando
(i, j ) M .
15. + (i ) = { j | (i, j ) M } denominado o conjunto de ns sucessores do n i N .
16. (i ) = { j | ( j , i ) M } denominado o conjunto de ns antecessores do n i N .
17. (i ) = { j | (i, j ) ou ( j , i ) M } = + (i ) (i ) denominado o conjunto de ns
adjacentes do n i N .
18. O grau de entrada no n i denominado por (i ) .

19. O grau de sada do n i denominado por + (i ) .


20. O grau do n i (i ) = (i ) + + (i ) .
21. Dizemos que i e j so os ns adjacentes do arco (i, j ) M . Denominamos
((i, j )) = (i, j ) = {i, j} o conjunto de adjacentes de (i, j ) M .
22. Os arcos (i, j ) e (k , l ) M so ditos adjacentes quando temos (i, j ) (k , l ) .

Exemplos:
2

+ (1) = {2,3}
4

(1) = {4}
(4) = {1,2,3}

Representao algbrica de um grafo:


23. Considere o grafo G com N = n e M = m . A matriz A {0,1}nn onde o elemento
de sua i-sima linha e j-sima coluna definido por:

1, se (i, j ) M
aij =
0, se (i, j ) M

denominada Matriz de Adjacncia de G.

Exemplo: Considere o grafo do exemplo anterior. Sua matriz de adjacncia :

De \ Para

Problema: considere n=100.000 e m = 5n, ento n2=10.000.000.000. Logo


temos um desperdcio de 9.999.500.000 espaos na memria.

Qual a complexidade para acessar antecessores e sucessores? O(n).

24. Seja G um grafo valorado onde c(i, j ) o custo do arco (i,j). Um variante da
matriz de adjacncia a Matriz de Pesos (custos) C nn tal que:

c(i, j ), se (i, j ) M
cij =
, se (i, j ) M
Exemplo: A matriz de pesos do digrafo valorado do primeiro exemplo :
De \ Para

21

-3

4.5

25. Suponha que M esteja ordenado e seja a j = (k , h) o j-simo arco de M. A matriz


B {1,0,1}nm tal que:

1, se i = k

bij = 1, se i = h
0, caso contrrio

denominada Matriz de Incidncia de G.

Exemplo: A matriz de incidncia do ltimo grafo apresentado :


n \ arco

(1,2)

(1,3)

(2,3)

(2,4)

(3,2)

(3,4)

(4,1)

-1

-1

-1

-1

-1

-1

-1

Qual a complexidade para acessar antecessores e sucessores? O(m).

Representao computacional de um grafo:


Apenas para ilustrar o armazenamento de um grafo atravs das estruturas de dados que
vamos apresentar abaixo, considere o digrafo valorado que se segue.
35

18

43

19

43

16

85

n=5
m=9

11
4

77

a) Matriz de Pesos:

De \ Para

35

43

19

85

18

43

11

16

77

Memria: n2 = 25.
Busca de antecessores/sucessores: O(n).
b) Lista de arcos: Um grafo valorado armazenado em trs vetores de dimenso m.

O armazena a extremidade inicial do arco;

D armazena a extremidade final do arco; e

V armazena o peso do arco.


O = [1,1,2,2,3,3,3,5,5]
D = [3,5,1,4,1,2,4,2,4]
V = [35,43,19,85,18,43,11,16,77]

Memria: 3m = 27.
Busca de antecessores/sucessores: O(m).
c) Lista Encadeada de Arcos Adjacentes: Utiliza-se n listas encadeadas, uma para cada
n. A cabea da i-sima aponta para o primeiro registro, que armazena as
informaes de um arco que diverge (ou converge) de i e um ponteiro para o
prximo registro. A seguir apresentamos a Lista Encadeada de Arcos Divergentes
do grafo acima.

35

43

19

85

18

43

16

77

11

Memria: 3m+n = 32.

Busca de antecessores/sucessores: O + (i ) ou O (i ) .

Cadeia, Caminho, Ciclo e Circuito:


Considere um digrafo G(N,M).
1. Uma seqncia de p arcos (a1,a2,...,ap) de M uma cadeia se existe uma seqncia
de (p+1) ns (n1,n2,...,np+1) de N tal que (ai ) = {ni , ni +1} . Ou seja, ou ai = (ni, ni+1)
ou ai = (ni+1, ni).
n1

a1

n2

a2

n3

np+1

(ai ) = {ni , ni +1}

ni +1 em comum
(ai +1 ) = {ni +1 , ni + 2 }
2. Uma seqncia de p arcos (a1,a2,...,ap) de M um caminho se existe uma seqncia
de (p+1) ns (n1,n2,...,np+1) de N tal que ai = (ni, ni+1). Ou seja, a extremidade final
de um arco a extremidade inicial do arco que o sucede.
n1

a1

n2

a2

n3

np+1

Concluso: Todo caminho uma cadeia, mas nem toda cadeia um caminho.

3. Uma cadeia onde np+1 = n1 um ciclo.


2

( (1,2), (2,3), (3,4), (4,1) ) um ciclo!


(1,2,3,4,1)
3

( (1,2), (3,4), (2,3), (4,1) ) um ciclo?

4. Um caminho onde np+1 = n1 um circuito.


1

Quais so os circuitos?

Existe alguma cadeia com trs arcos no grafo abaixo?


3
1

2
4

Observe que n1, n2, n3 e n4 necessariamente so distintos, pois os trs arcos envolvem
os quatro ns. Alm disso, veja que para quaisquer que sejam a1, a2 e a3 o n 2
adjacente a todos. Portanto impossvel termos:
(a1 ) = {n1 , n2 }
(a2 ) = {n2 , n3 }
(a3 ) = {n3 , n4 }

Grafo Parcial, Sub-grafo, Conexidade e rvore:


Considere um grafo G(N,M).
1. Dizemos que G(N,M), onde M ' M um grafo parcial de G.
2. Dizemos que G(N,M), onde N " N e M " M um sub-grafo de G.
3. G dito um grafo conexo se para qualquer par de ns de N, existe uma cadeia
ligando-os.
4. Um grafo conexo sem ciclos denominado uma rvore.
5. Uma rvore que um grafo parcial de G denominada rvore geradora de G.
6. Um n i de um grafo orientado dito uma raiz do grafo, quando existe algum
caminho de i at j, j N {i} .

Resultado 1: Uma rvore com n ns tem sempre (n-1) arcos.


Demonstrao (por induo):
Passo inicial: para n = 1 e n = 2 temos necessariamente m = 0 e m = 1,
respectivamente. Observe que um lao um ciclo.
rvore com 2 ns
Assumimos a tese verdadeira para n k e provaremos para k+1. Seja uma
rvore com k+1 ns e seja i um n desta rvore com grau p. Eliminando o n i e
os p arcos a ele ligados temos:

p=4

p rvores
Ou seja, temos p sub-grafos que so rvores. Observe que se tivssemos mais de
p sub-grafos ento o grafo original no seria conexo, e menos de p implicaria na
existncia de pelo menos um ciclo. Veja tambm que se algum destes sub-grafos
no fosse rvore ento o grafo original teria algum ciclo. Portanto temos de fato
p rvores. Obviamente que cada uma tem no mximo k ns. Sejam k1, k2, ..., kp o
nmero de ns destas p rvores. Usando a hiptese de induo, temos que o
nmero total de arcos destas p rvores :
p

i =1

i =1

(ki 1) = ki p = k p.
Somando os p arcos que foram retirados, temos para a rvore original de k+1
ns, k p + p = k arcos.

Resultado 2: Em uma rvore, qualquer par de ns ligado por uma nica cadeia.

10

Ciclo e Dependncia Linear:


Considere uma parte de um grafo orientado que representa um ciclo, juntamente com a
parte da sua matriz de incidncia correspondente. Veja abaixo.
2
1
3

1
2
3
M

(1,2)
1
-1
0
M
0

(1,3)
1
0
-1
M
0

(3,2)
0
-1
1
M
0

K
K
K
K

Observe que as colunas da matriz de incidncia correspondentes aos trs arcos so


Linearmente Dependentes.
Dados n ns, o posto mximo da matriz de incidncia (n 1), o que significa que a
ausncia de ciclos implica em no mximo (n 1) arcos.

Concluso: uma rvore geradora uma base do grafo.

11

Definio de Problemas de Caminho, rvore


Geradora e Fluxo em Grafos
Considere o digrafo valorado G(N,M), onde para cada (i, j ) M associamos o peso
cij . Por exemplo, este peso pode ser:

Comprimento do arco (i, j ) ;

Custo (ou tempo) para percorrer o arco (i, j ) ;

Capacidade do arco (i, j ) ;

Probabilidade de ocorrer falha na transmisso de dados no arco (i, j ) .

Notaes:

P M : Caminho de 1 N a n N em G.

T M : rvore Geradora de G cujo a raiz o n 1.

1. Problema do caminho mais curto (MinSum): cij o custo do arco (i, j ) .


Objetivo: Encontrar um caminho P * de 1 a n em G cujo a soma dos pesos dos
arcos seja mnima, ou seja:

ij

( i , j )P*

ij

( i , j )P

Exemplo:
2

5
-10

12

Caminho
1-4
1-2-4
1-3-4
1-2-3-4
1-3-2-4
1-2-3-2-4
M
1-3-2-3-4
M

Custo
2
8
9
18
1
10
M
11
M

O que ocorre se o circuito for negativo?

2. Problema do caminho de mnimo gargalo (MinMax): cij o congestionamento


do arco (i, j ) , quanto maior mais congestionado.

Objetivo: Encontrar um caminho P * de 1 a n em G cujo o mximo peso dos


arcos seja mnimo, ou seja:

12

max cij max cij

( i , j )P *

( i , j )P

Exemplo:

5
0

12

Gargalo
5
5
8
12
8
12
M
12
M

Caminho
1-4
1-2-4
1-3-4
1-2-3-4
1-3-2-4
1-2-3-2-4
M
1-3-2-3-4
M

Qual a implicao de um circuito qualquer para este problema?

3. Problema do caminho de mxima capacidade (MaxMin): cij indica a capacidade


do arco (i, j ) .

Objetivo: Encontrar um caminho P * de 1 a n em G cujo o mnimo peso dos


arcos seja mximo, ou seja:
min cij min cij

( i , j )P *

( i , j )P

Exemplo:

5
10

4.

Caminho
1-2-4
1-3-4
1-2-3-4

Capacidade
4
4
5

Problema do caminho de confiabilidade mxima (MaxProd):

cij indica a

probabilidade de haver sucesso na transmisso de dados pelo arco (i, j ) .

Objetivo: Encontrar um caminho P * de 1 a n em G cujo o produto dos pesos


dos arcos seja mximo, ou seja:

ij

( i , j )P *

ij

( i , j )P

13

Exemplo:
2

0,9

0,9

Confiabilidade
0,72
0,81
0,729

Caminho
1-2-4
1-3-4
1-2-3-4

0,8

0,9

0,9

O que ocorre quando temos um circuito (o qual possvel ser atingido a partir da
origem) com produto estritamente maior do que 1?

5. Problema da rvore geradora mnima: cij o custo do arco (i, j ) .


Objetivo: Encontrar uma rvore geradora T * do grafo G, com raiz no n 1, cujo
a soma dos pesos dos arcos seja mnima, ou seja:

ij

( i , j )T *

ij

( i , j )T

Exemplo:

rvore Geradora
2

20

12

12
8

Custo

5
1

12
2

18
14

6. Problema de mximo fluxo: cij indica a capacidade do arco (i, j ) .


Objetivo: Encontrar um sub-grafo de G que possibilita fluir o mximo de fluxo
do n 1 para o n n.
Considere a existncia do arco (n, 1) em G com capacidade infinita, ou seja, cn1 = .
Segue-se o modelo matemtico deste problema:

maximizar
sujeito a :

f n1

f
j + ( i )

ij

ki

= 0, i = 1,2, K , n

k ( i )

0 f ij cij

(i, j ) M ,

onde as variveis de deciso, fij, ser o fluxo no arco (i, j). Observe que este um
modelo de Programao Linear (PL).
14

Exemplo:
Sub-Grafo
2

12

1
4

10

8
2

Fluxo

8
5

10

10

Exerccio: Fornea o modelo matemtico para este exemplo.

Algumas Aplicaes
1. Um operrio mora no Jardim Primavera (JP) e trabalha na Glria (GL). A tabela
abaixo mostra as opes que tem para ir trabalhar.

Origem

Destino

Custo

Tempo (minutos)

JP
JP
JP
Caxias
Caxias
Caxias
E.F.
E.F.
Castelo
Caxias

Castelo (van)
Caxias (carona)
E.F. (parador)
E.F. (parador)
E.F. (expresso)
Castelo (parador)
Castelo (nibus)
GL (nibus)
GL (p)
GL (nibus)

60
20
40
10
15
50
20
50
10
60

60
20
90
90
60
60
10
30
30
60

a. Determinar a forma mais econmica de ir de casa para o trabalho.


b. Determinar a forma mais econmica de ir de casa para o trabalho sabendo que o
operrio tem 120 minutos para realizar o percurso.

c. Que problemas so estes?


3 EF

50/30
40/90
10/90
1 JP

20/20
60/60

15/60

2 CX

50/60

60/60
20/10

5 GL

10/30

4 Cas

15

um digrafo? Por qu?


Como resolver este impasse? ... vamos colocar um n 6: 2-6-3, 2-6(15/60) e 6-3(0/0).

c. No item a um problema de caminho mnimo. Em b temos adicionalmente uma


restrio de soma.

a. Caminho mnimo: 1-2-3-4-5

custo: 60

tempo: 150.

b. Listar os melhores caminhos:


1-2-6-3-4-5

Custo: 65

Tempo: 120

1-4-5

Custo: 70

Tempo: 90

1-3-4-5

Custo: 70

Tempo: 130

2. Um parque nacional tem uma srie de pontos tursticos que podem ser atingidos por
estradas de terra a partir de uma entrada 1.
7
2

a. O ponto 7 a atrao principal. A direo do parque deseja colocar um trem de 1 a 7.


Determinar o trajeto mais curto de 1 a 7. Que tipo de problema esse?

b. O parque deseja exibir aos visitantes, na entrada, a mnima distncia para atingir cada
uma das atraes partindo de 1. Qual esse problema?

c. Pretende-se instalar uma rede telefnica (cabo) interligando todos os pontos.


Minimizar o comprimento total da rede. Que tipo de problema esse?

a. Caminho mnimo de 1 a 7: 1-2-3-5-7

Custo: 13

b. Caminho mnimo de 1 para todos os outros ns. Usando o item a, s falta encontrar
um caminho mnimo de 1 a 4 e outro de 1 a 6:

Caminho
Custo

1-2

1-2-3

1-4

1-2-3-5

1-2-3-6

1-2-3-5-7

13

A unio destes caminhos mnimos uma rvore geradora:

16

5
7

Custo: 20

Custo: 14

Esta rvore geradora mnima?

c. rvore Geradora Mnima:


5

3. O grafo abaixo representa uma rede de comunicao, onde cij indica a carga atual do
arco (i, j ) .
20

10

30

30

50

44
35

55

50

20
10

15
50

47

20

11

10

20
9

30

Uma carga adicional de valor 8 deve ser enviada do n 1 para o n 10 de modo a


minimizar o arco de maior carga do grafo.
Que problema esse?

4. Suponha que no grafo abaixo cij seja a probabilidade de haver sucesso na


transmisso de dados do n i para o n j.

17

0,88

0,95

0,93

0,9

0,93

0,95

0,87

0,96

0,94

0,93
0,94

0,89
5

0,88
0,96
7

0,92

0,98

0,91

10

0,95
0,94

Deseja-se transmitir dados do n 1 para o n 10 de modo que a probabilidade de haver


sucesso na transmisso seja mxima.
Que problema esse?

5. Uma companhia possui uma fbrica em uma cidade C1 e um depsito em outra


cidade C6. Toda a produo de um determinado perodo, que embalada em caixas de
mesmo tamanho, deve ser transportada de C1 para C6. Para fazer esse transporte
contratada a empresa TR Ltda. As caixas so enviadas em caminhes, e a TR possui
limitaes superiores de caixas que podem ser transportadas diretamente entre pares de
cidades em que atua. Esses limites so apresentados na tabela a abaixo:

De \ Para

C2

C3

C4

C5

C6

C1

16

13

C2

10

12

C3

14

C4

20

C5

A companhia deseja saber a quantidade mxima de caixas que a TR pode transportar em


um determinado dia, pois este ser o total produzido.
Que problema esse?
O problema em questo pode ser representado pelo digrafo abaixo:

18

C2

16
C1

10
13

12

4
C3

C4

C6

7
C5

14

20

Soluo tima encontrada pela TR (Fluxo mximo):


C2

11/16

12/12

1/4

C1

0/9

0/10
12/13

C3

11/14

C4

19/20
C6

7/7
C5

4/4

onde q/c indica a quantidade de caixas que sero transportadas (q) e a capacidade
mxima (c) do arco.

Valor timo: 23. Ou seja, a companhia poder produzir um total de 23 caixas.

Resoluo de Problemas de Caminho timo


Nosso principal objetivo agora estudar mtodos para a resoluo do Problema de
Caminho Mnimo, que j definimos anteriormente como o problema MinSum. Os
outros problemas de caminho timo, que tambm j foram definidos anteriormente,
podem ser resolvidos por variantes dos algoritmos que iremos apresentar aqui para o
problema MinSum.

Programao Linear
O problema de caminho mnimo tambm pode ser formulado como um Problema de
Programao Linear (PPL). Para encontrar um caminho mais curto do n 1 N ao n
n N em G(N,M), basta encontrar uma soluo tima para o problema abaixo:

19

( MS ) minimizar

ij

xij

( i , j )M

1, para i = 1

sujeito a : xij x ki = 0, para i = 2,3, K , n 1


j + ( i )
k ( i )
1, para i = n

xij 0 e inteira (i, j ) M .


Pelo fato de que todos os coeficientes da matriz dos coeficientes de MS so 1, 0 ou -1,
podemos demonstrar (veja Bazara) que ao invs das restries xij 0 e inteira, pode-se
considerar apenas xij 0 . Observe que se ao invs das restries xij 0 e inteira
tivssemos xij {0,1} , ento o modelo do exerccio abaixo teria soluo tima, o que
no verdade.

Exerccio: d o modelo matemtico do problema de encontrar um caminho mnimo de


1 a 4 no grafo a seguir:
2

5
-10

Modelo:
minimizar 5 x12 + 4 x13 + 4 x24 + 5 x34 10 x41
sujeito a : x12 + x13
x12

x41 = 1
=0

+ x24
x13

+ x34

=0

x24 x34 + x41 = 1


x12 , x13 , x24 , x34 , x41 0.
Agora vamos resolver o problema pelo algoritmo simplex, utilizando o software
SPLINT no site: www.cos.ufrj.br/splint.

Repita o exerccio para outros grafos. Faa isso para a letra a do problema do
operrio, desconsiderando o arco (2,3) que tem pesos 15/60. Imprima a pgina
Relatrio final da resoluo e entregue junto com o grafo e o modelo matemtico.
Faa o mesmo para algum problema invivel e, tambm, resolva o exemplo que demos
quando definimos o problema de fluxo mximo.

20

Observao: outros problemas de caminho timo como MaxProd e MaxMin, por


exemplo, no podem ser resolvidos via PL devido a funo objetivo de seus modelos.

PPL para rvore Geradora Mnima


Considere o grafo G(N,M). O problema da rvore geradora mnima tambm pode ser
modelado como um problema de PL. Segue-se o modelo:

c x

minimizar

ij ij

( i , j )M

sujeito a :

ij

= n 1

( i , j )M

ij
( i , j )M ( S )

S 1 S N , S

xij 0 e inteira (i, j ) M ,


onde (S , M ( S ) ) um sub-grafo de G com M ( S ) = {(i, j ) M ; i, j S }.

Exemplo:
4
3

1
2

Quais so as solues viveis? possvel este problema ser ilimitado? Por qu?
Olhando para a primeira restrio e para as restries de no negatividade, diga um
limite inferior para a funo objetivo. Quais so as solues timas considerando os
pesos:
c12 = 3,

c13 = 7,

c14 = 8,

c23 = 10,

c34 = 1, c41 = 4

e c43 = -5.

Observaes sobre o modelo matemtico:


O nmero de restries do problema exponencial (devido a S).
No possvel modelar este problema com um nmero de restries polinomial.
Com custos reduzidos e condies de folgas complementares podemos avaliar se
solues viveis para este PPL (geradas por qualquer algoritmo) so TIMAS.

Exerccio: dado o grafo,


1

3
2

1
3

fornea o modelo matemtico do problema de rvore geradora mnima e resolva-o


utilizando o SPLINT.
21

Programao Dinmica
Os problemas de caminho timo que definimos at aqui podem ser resolvidos usando
tcnicas de Programao Dinmica (PD).
Considere os dois problemas abaixo:
1. Encontrar um caminho mnimo de 1 N a n N em G(N,M).
2. Encontrar um caminho mnimo de 1 N a n N em G(N,M) passando por no
mximo (n-2) ns intermedirios.

a. Esses dois problemas so equivalentes? NO


Exemplo:
4

5
3

-1
8

1. Problema ilimitado

10

-2

2. Admite soluo tima: 1-2-3-2-5, custo 4.

b. E se no existir circuito negativo? SIM


Observe que qualquer caminho de 1 a n com mais de n-2 ns intermedirios contm
circuito, ou seja, as nicas solues viveis do problema 1 que no so viveis para o
problema 2 so caminhos com circuito.

Concluso: 1 e 2 so equivalentes supondo que no existe circuito negativo.


Usaremos esse resultado para resolver o problema de caminho mnimo por PD.
Utilizaremos, tambm, o definio a seguir.

Definio: Dizemos que G(N,M) um grafo em camadas quando podemos escrever


N = N1 N 2 K N k com N i N j = , i, j {1,2, K , k}, i j de modo que:
(i, j ) M i N h e j N h +1 , para algum h {1,2, K , k 1} .

Exemplo 1:
1

N1 = {1} , N 2 = {2} e N 3 = {3}


(1,2) M , 1 N1 e 2 N 2 ok
(2,3) M , 2 N 2 e 3 N 3 ok
22

Exemplo 2:
2
1

1 N h 2 N h +1 , pois (1,2) M
2 N h +1 3 N h + 2 , pois (2,3) M
Portanto 1 N h e 3 N h + 2 .
Como (1,3) M ento este no um grafo em camadas.
O que impede um grafo de ser um grafo em camadas?
possvel transformar G(N,M) em um grafo em camadas?
Considere o ciclo (i, j ), (i, k ), ( j , k ) M (situao idntica ao exemplo 2). Para este
caso, basta criar k em N, (k,k) em M e trocar (j,k) por (j,k) em M. Alm disso, se o
grafo for valorado, o peso de (k,k) deve ser nulo.
j

1
i

4
k

Exerccio: colocar os grafos abaixo em camadas:

1.

3.

2.

Em camadas:
1.

3.

2.

2
1

23

Vejamos a seguir uma utilizao do grafo em camadas.

Problema: Uma pessoa deseja fazer uma viagem de A at E. Por uma questo de tempo
disponvel, ela pode fazer no mximo duas escalas em duas das cidades B, C e D. A
matriz abaixo fornece as distncias entre as cidades:

De \ Para

10

15

35

10

10

13

15

15

13

35

10

15

10
3

15
35

10

3
13

15

O objetivo e determinar o trajeto mais curto.


Soluo: A-C-B-D-E, distncia: 13. Veja que esta soluo no respeita o nmero de
escalas. Ou seja, esta soluo NO serve (invivel).
Listando as melhores solues, temos que a segunda melhor: A-C-B-E com custo 16,
atende a restrio. Portanto esta uma soluo tima para o problema.

Resolvendo o problema com PD


Considere o grafo G(N,M) com |N| = n. Queremos colocar G em camadas de modo que
todos os caminhos de 1 a n com at (n-2) arcos possam ser obtidos no grafo em
camadas G(N,M) de G. Deste modo, pelo que j vimos (supondo que no existe
caminho de 1 a n com circuito negativo), o problema de encontrar um caminho mnimo
de 1 a n em G equivalente a encontrar um caminho mnimo de 1 a n em G.
Quantas camadas so necessrias para G? n-2.
Segue-se o grafo em camadas do ltimo problema.

24

C
E

A
D

Camada 3
n-2

Camada 2

Camada 1

Observe que se eliminarmos uma camada teremos, no grafo resultante, todos os


caminhos de A at E com no mximo dois ns intermedirios.
B

C
E

A
D

Temos que a PD trabalha de trs pra frente. Alm disso, podemos observar que
encontrar um caminho mnimo de A at E com no mximo duas escalas em B, C e D
equivalente a:

min

i{ B ,C , D , E }

{dAi + caminho mnimo de i at E com no mximo uma escala em B, C e D}.

Encontrar um caminho mnimo de i at E com no mximo uma escala em B, C e D


equivalente a:

min

j{ B ,C , D , E }

{dij + caminho mnimo de j at E com no mximo zero escala}.

Ento usando a PD para resolver o problema de caminho mnimo, encontramos os


caminhos mnimos dos ns at o destino, comeando com os mais prximos (menos
arcos at o destino). Ou seja, executamos n-1 iteraes onde a ltima contm apenas o
n origem. Na iterao k encontramos os caminhos mnimos com at k arcos de todos os
ns da camada associada iterao k at o destino.

25

Segue-se a resoluo do exemplo que estamos considerando:


7
B

13
16

10
15
E

A
D

4
E

4
0

Complexidade:
Para cada estado (n) em um determinado estgio (camada): (n-2) operaes.
Quantos estados existem em um determinado estgio: (n-2).
Logo, temos por estgio: (n-2)(n-2) operaes.
Quantos estgios temos: (n-2).
Portanto a complexidade para resolver o problema de caminho mnimo por PD O(n3).

26

Algoritmos de Determinao de Distncias


A seguir vejamos idias para a resoluo do problema de caminho mnimo de um n
origem at um n destino.

Mtodos Gulosos:
1. Guloso Radical escolhe inicialmente o arco de menor peso do grafo.

Exemplo:
2

1
3

Objetivo: encontrar um caminho


mnimo de 1 a 3.
O guloso radical escolheria o arco
(3,2) que no tem nada a ver com a
soluo.

2. Guloso Atenuado escolhe inicialmente o arco de menor peso saindo da origem.


Para o exemplo acima, escolheria o arco (1,3), que a soluo do problema.

Observao: Os algoritmos de determinao de distncias que iremos estudar aqui so


mtodos gulosos atenuados.

Generalizando a idia do guloso atenuado:


Escolher o arco de menor peso saindo de 1 no digrafo valorado G(N,M), onde cij
o peso do arco (i,j). Seja (1,j) este arco. O caminho {(1,j)} que vamos chamar de 1 j,
um caminho mnimo de 1 at j? Vejamos a seguir que se cij for no negativo para
todo (i,j), ento a resposta SIM.
k1

Temos que: c1 j c1ki , i = 1, K , l .


Qualquer outro caminho de 1 a j
do tipo: 1 ki ... j. E tem custo:
c(1 ki ... j) = c1ki + c(ki ... j)
c1ki c1 j .
*

k2

* cij 0, (i, j ) c(ki ... j) 0

Portanto para estes algoritmos gulosos necessrio supor que: cij 0, (i, j ) M .
Como acabamos de ver, com esta hiptese temos que a escolha feita acima nos leva na
determinao de um caminho mnimo de 1 at j. Dizemos que fechamos o n j com
esta escolha. A pergunta que fazemos agora a seguinte:

27

Como continuar este procedimento, ou seja, como fechar outros ns?

Definies:
1. Dizemos que um n est fechado quando conhecemos um caminho mnimo da
origem at ele.
2. Quando um n no est fechado, dizemos que ele est aberto.
Veja que qualquer caminho de 1 para um n aberto qualquer q do tipo:
j

cij

c(i)

fechado

aberto

RESTO 0

onde i o ltimo n fechado do caminho. Este caminho tem custo:


c(q ) = c(i ) + cij + RESTO c(i ) + cij min {c(l ) + clh } = c(k ) + ckr .
l fechado
h aberto

Observe que devido a arbitrariedade de q qualquer caminho de 1 a r tem custo maior ou


igual a c(k) + ckr. Logo com a escolha acima encontramos um caminho mnimo de 1 a r,
ou seja, fechamos o n r.

Exemplo:
1

Considerando os ns 1 e 3 fechados, qual seria a prxima escolha?


min{c(1) + c12 , c(1) + c14 , c(3) + c32 , c(3) + c34 } = min{3, ,3,7} = 3 .
Portanto fechamos o n 2. Observe que temos duas opes, ou seja, dois caminhos
mnimos.

Algoritmo de Dantzig
Considere o problema de encontrar um caminho mnimo de um n origem 1 a um n
destino n no digrafo valorado G(N,M), com |N| = n, |M| = m e cij , (i, j ) M .
Alm disso, considere cij = , (i, j ) M , onde i, j N . A seguir apresentaremos um
algoritmo de determinao de distncias desenvolvido por Dantzig. Este algoritmo
trabalha com a hiptese que se segue.

28

Hiptese: cij 0, (i, j ) M .


Notaes:
Fk: conjunto de ns fechados na iterao k do algoritmo.
Ak: conjunto de ns abertos na iterao k do algoritmo.
c(i): custo de um caminho mnimo de 1 at o n fechado i Fk .
ANT(i): n antecessor de i associado ao custo c(i).
Considere tambm que existe algum caminho de 1 a n em G. Segue-se o algoritmo.

Passo 1 Inicializao:
c(1) := 0

ANT(1) := 0

k := 1

Fk := {1} Ak := N {1}

Passo 2 Regra de Parada:


Se n Fk ento PARE

Passo 3 Fechamento de um novo n:


Escolha q Ak e p Fk tal que c( p ) + c pq = min{c(i ) + cij | i Fk e j Ak }
ANT(q) := p
c(q) := c(p) + cpq
k := k + 1
Fk := Fk 1 {q}
Ak := Ak 1 {q}
Retorne ao Passo 2.

Exemplo: Aplicar o algoritmo de Dantzig para encontrar um caminho mnimo do n 1


ao n 6 no grafo abaixo.
2

2
5

29

Fk

c(i) + cij

i Fk e j Ak

c(i)

ANT(i)

10

10

Observe que se os arcos ligando o n 6 tivessem sentido contrrio, ento no existiria


caminho de 1 a 6. Neste caso, na iterao k = 5 teramos:
min{c(i ) + cij | i Fk e j Ak } = .
Para o caso geral, se tivermos a igualdade acima em alguma iterao qualquer k, ento
significa que no grafo no existe caminho da origem at qualquer n aberto na iterao
k. Ou seja, no existe caminho de 1 at j, j Ak .
Portanto, para retirarmos a hiptese de existncia de caminho da origem ao destino,
devemos colocar no algoritmo outra regra de parada. Considerando f o ltimo n
fechado, o Passo 2 ficaria da seguinte forma:
Se ( n Fk ou c(f) = ) ento PARE

Teorema: Dado um digrafo G(N,M) com cij 0, (i, j ) M , numa certa iterao k,
para todo i Fk {1} , c(i) representa o custo de um caminho mnimo de 1 at i.

Demonstrao (induo no contador de iteraes k):


k = 2:
Temos que F2 = {1,j}, onde j foi o n escolhido no final da iterao k = 1. Ento
pelo passo 3 da iterao k = 1, c(1) + c1j = c1j c1h, h N . Seja (1 t ... j)
um caminho qualquer de 1 a j. Temos: c(1 t ... j) = c1t + c(t ... j) c1t,
pois cij 0, (i, j ) M . Como c1j c1h, h N , ento c(j) = c1j c1t. Portanto
(1 j) um caminho mnimo de 1 a j em G, com custo c(j) = c1j.
k = l (hiptese da induo):
Suponha que c(i) seja o custo de um caminho mnimo de 1 a i, i Fl {1} .
30

k = l + 1:
Seja Fl+1 = Fl {q}. Sem perda de generalidade, seja (1 ... r s ... q) um
caminho qualquer de 1 a q, onde r Fl e s Al. Temos que:
c(1 ... r s ... q)

c(1 ... r) + crs + c(s ... q)

(todos os pesos so no negativos)

c(1 ... r) + crs

(hiptese de induo)

c(r) + crs

(escolha no Passo 3)

c(p) + cpq

(atribuio feita no Passo 3)

c(q)
Portanto c(q) , de fato, o custo de um caminho mnimo de 1 a q.

Vimos no algoritmo de Dantzig que para fechar um n em cada iterao realizada uma
escolha na matriz:

A
6447k 448
j

Fk i

c (i ) + cij

Para todo i Fk e j Ak . Note que de uma iterao para a iterao seguinte


eliminamos uma coluna e acrescentamos uma linha.
A dimenso desta matriz |Fk|.|Ak| = k (n k). Veja ento que para k = n 2 procuramos
o mnimo entre n 2 4 elementos. A complexidade por iterao do algoritmo de Dantzig
O(n2). Como o nmero de iteraes no mximo n 1, ento a complexidade do
algoritmo de Dantzig O(n3).

Algoritmo de Dijkstra
Ser que possvel diminuir a complexidade da escolha do n a ser fechado no
algoritmo de Dantzig?
Uma forma mais eficiente de proceder seria calcular o valor mnimo de cada coluna,
guardando-o em um vetor, por exemplo, dist(j). Em cada iterao dist(j) seria

31

atualizado, comparando-o com o valor encontrado para a nova linha. A seguir


tomaramos o menor valor dist(j), j Ak . Tal procedimento resulta no algoritmo de
Dijkstra que ser apresentado a seguir.
Ak
j
Possibilidades para chegar em j.
(mximo k)

Fk

Se j for o n fechado no algoritmo de Dantzig, qual a linha associada?

j Ak
dist(j) = [

Custo do melhor caminho de 1


at j conhecido at o momento.

Ou seja, fazemos dist(j) = min{c(i ) + cij }, j Ak . Depois disso escolhemos um n


iFk

aberto associado com:

min{dist ( j )}.
jAk

Hiptese: cij 0, (i, j ) M .


Notaes:
Fk: conjunto de ns fechados na iterao k do algoritmo.
Ak: conjunto de ns abertos na iterao k do algoritmo.
f: ltimo n fechado.

, se ainda no foi encontrado nenhum caminho de 1 a j.

dist ( j ) = custo do caminho mnimo definitivo se j Fk .


custo do caminho mnimo temporrio se j A .
k

0, se ainda no foi encontrado nenhum caminho de 1 a j.


ant ( j ) =
i, n antecessor imediato de j no caminho mnimo definitivo ou temporrio.

32

Algoritmo de Dijkstra
Faa: F1 := {1}, A1 := N {1}, f := 1, ant(1) := 0, dist(1) := 0,
ant(j) := 0 e dist(j) := , j A1 e k := 1
REPITA
Se ( f = n )
Ento PARE: um caminho mnimo com custo dist(n) foi encontrado
Seno
Para todo j + ( f ) Ak faa
Se ( dist(j) > dist(f) + cfj )
Ento
dist(j) := dist(f) + cfj
ant(j) := f
Escolha h Ak tal que dist (h) dist ( j ), j Ak
Se ( dist(h) = )
Ento PARE: no existe caminho do n 1 at o n n
Seno
Faa: Fk+1 = Fk {h}, Ak+1 = Ak {h}, f := h e k := k + 1
AT QUE (f = n) ou (dist(h) = ).

Exemplo: Aplicar o algoritmo de Dijkstra para encontrar um caminho mnimo do n 1


ao n 6 no grafo abaixo.
2

5
9
4

16

15

21

35

dist(j) / ant(j)

Iteraes
k

Inic.

0/0

/ 0

/ 0

/ 0

/ 0

/ 0

15 / 1

/ 0

/ 0

9/1

/ 0

13 / 5

/ 0

11 / 5

/ 0

13 / 5

/ 0

18 / 4

48 / 2

18 / 4

A complexidade do algoritmo de Dijkstra O(n2).

33

Algoritmo de Dijkstra utilizando uma d-Heap


A seguir estaremos interessados em utilizar uma estrutura de dados capaz de
proporcionar, em alguns casos, uma melhor complexidade para o algoritmo de Dijkstra.
Esta estrutura (heap) ser utilizada pela parte principal do algoritmo, que a
determinao dos caminhos mnimos.

Heap
Definio: uma heap uma estrutura de dados sob a forma de rvore com uma raiz
onde para cada elemento (n) existe uma marca (nmero) associada.

Exemplo 1:
Raiz
n1

n3

n2

n5

n6

n4

n7

Observao: Em uma heap o armazenamento e a manuteno de elementos so feitos


eficientemente.
Estaremos interessados nas seguintes operaes com a heap:e
CRIAR(H): cria uma heap vazia H.
INSERIR(i,H): insere i em H.
ENCONTRA_MIN(i,H): Encontra um elemento i de menor marca.
DELETAR(i,H): exclui i de H.
DECREMENA_MARCA(i,VALOR,H): troca a marca de i por VALOR.

Definio: a profundidade de um n na heap o nmero de arcos no caminho nico da


raiz at o n. No exemplo 1, a profundidade de n5 2 e a de n1 0.

Definies: Quando existe o arco (ni , nj) onde a profundidade de ni menor do que a de
nj, ento dizemos que ni pai de nj e nj filho de ni. No exemplo 1, n5 filho de n2 e n1
pai de n2, n3 e n4.

Observao: o n raiz no tem pai.


Definio: um n que no contm filhos dito folha. No exemplo 1, n5, n6 e n7 so os
ns folhas.

34

Definio: dizemos que uma heap onde cada n tem no mximo d filhos e tem a forma
de uma rvore completa uma d-heap.

Observao: Aqui vamos considerar sempre d 2 .


Exemplo 2: (2-heap)
Raiz
7

15

10

11

11, 15, 8 e 10 so folhas, 7 a raiz, filhos(9) = {3, 15} e pai(8) = 5

Armazenando a d-heap

Os elementos da d-heap so armazenados em um vetor H.

A varivel ULTIMO informa o nmero de elementos da d-heap.

POS(i) a posio do n i da d-heap no vetor H.


A ordem que os ns da d-heap aparecem em H crescente com a profundidade

e da esquerda para a direita em cada profundidade.

Exemplo: Armazenando o 2-heap do exemplo anterior temos: H = [7,9,5,3,15,8,10,11].


POS(9) = 2, ULTIMO = 8 = POS(11).

Propriedades da d-heap
Considere a d-heap dH armazenada no vetor H e seja dist(j) a marca associada a
j dH . Temos que:
P1. As marcas dos pais so menores ou iguais do que as dos seus filhos. Ou seja,
para qualquer j dH ,
dist(j) dist(i), i filhos ( j ) .
P2. O nmero de ns com profundidade k no mximo dk.
P3. A profundidade de dH no mximo log d n , onde n = |dH|.

Exemplo: considere uma 3-heap onde ULTIMO = 25, ou seja, com 25 ns.
Temos que log d 25 = 3. Observe que uma 3-heap com profundidade 3 pode
armazenar 30 + 31 + 32 + 33 = 40 ns.
35

P4. Os filhos do n na posio i de H esto nas posies id d + 2, K , id + 1 .

Exemplo: considere o 3-heap abaixo. Seja a marca do n igual a ele mesmo, ou


seja, dist(j) = j.
Raiz
5

21

28

36

12

32

14

13

18

16

20

38

17

41

52

42

29

15

10

31

22

27

48

Pela forma que a d-heap foi armazenada POS(18) = 8, POS(52) = 23 = 8*33+2,


POS(42) = 24 = 8*33+3 e

POS(48) = 25 = 8*3+1. Observe que temos

filhos(18) = {52, 42, 48}.

Demonstrao de P4: Sem perda de generalidade, seja k a profundidade do n


H[i]. Temos,
k 1

j =0

j =0

p = d j i d j = p .
Observe que os somatrios acima indicam a quantidade de ns que podemos ter
com profundidade at k 1 e at k, respectivamente. Assim p+1 a posio do
primeiro n com profundidade k e, no caso de existncia, p ser a posio do
ltimo n com profundidade k.
Veja tambm que a posio do primeiro filho de H[i] imediatamente posterior
a quantidade de ns com profundidade at k:
k

j =0

mais a quantidade de ns que so filhos dos ns com posio menor do


que i e com profundidade igual a k:
k 1
k 1

(i 1) d j d = id d d j +1 .

j =0
j =0
14424
43
quantidade de ns com profundi dade k e posio menor do que i

Portanto,
36

j =0

j =1

d j + id d d j = id d + 1
a posio imediatamente anterior a posio do primeiro filho de i.
Logo id d + 2, K , id + 1 so, de fato, as posies dos filhos de H[i].
P5. O pai de um n que ocupa a posio j de H est na posio ( j 1) d .

Exemplo:
Raiz
7

15

10

11

Temos que H=[7, 9, 5, 3, 15, 8, 10, 11]


Suponha que conhecemos a posio de 15 (ou seja, POS(15) = 5) e que dist(15)
diminua de modo que tenhamos dist(15) < dist(9). Para resgatar a propriedade
P1 devemos, primeiramente, trocar as posies de 9 e 15. Pela propriedade P5:
POS(PAI(15)) = (5 1) 2 = 2 .

Demonstrao de P5: Sem perda de generalidade, seja H[i] o pai de H[j], ou


seja, i a posio do pai do n na posio j. Por P4 temos que as posies dos
filhos de H[i] so:
id d + 2 + l, l =0, 1, ..., d 1.
Logo, j = id d + 2 + l, para algum l {0, 1, ..., d 1}. Temos que:
(id d + 2 + l ) 1 d (i 1) 1 + l
1 + l
=
+
= (i 1) +
=i.

d
d

d
d

( j 1) d =

A penltima igualdade se deve a (i 1) ser inteiro e a ltima a 0 l d 1.

Observao: Como veremos as propriedades P4 e P5 so fundamentais para as


variantes do algoritmo de Dijkstra que utilizam uma d-heap.

37

Resgatando as propriedades da d-heap


As rotinas a seguir so fundamentais para resgatar as propriedades de uma d-heap.
TROCAR(i, j): i e j so ns da d-heap.
H[POS(i)] := j
H[POS(j)] := i
AUX := POS(i)
POS(i) := POS(j)
POS(j) := AUX
Obviamente que esta rotina tem a complexidade de O(1). Esta rotina TROCAR(i, j) ser
utilizada pelas duas rotinas descritas a seguir.
SUBIR(i): i um n da d-heap.
ENQUANTO i no raiz E dist(i) < dist(PAI(i))
TROCAR(i, PAI(i))
Veja que o lao desta rotina ser executado no mximo k vezes, onde k a profundidade
da d-heap. Por P3 vimos que esta profundidade log d n , onde n o nmero de ns da
d-heap, ento esta rotina tem complexidade de O( log d n ), pois TROCAR(i, j) O(1).
DESCER(i): i um n da d-heap.
ENQUANTO i no folha E dist(i) > dist(minF(i))
TROCAR(i, minF(i))
onde minF(i) = k filhos(i) tal que dist(k) dist(j), j filhos (i ) . O nmero de
iteraes para esta rotina tambm no mximo log d n , mas como minF(i) O(d),
ento DESCER(i) O(d log d n ).

Algoritmo de Dijkstra utilizando uma d-heap


As rotinas DESCER(i) e SUBIR(i) sero chamadas pelas seguintes rotinas do algoritmo
que iremos apresentar a seguir.
ADICIONAR(i, H): coloca i na ltima posio de H, aplica a rotina SUBIR(i) e
faz ULTIMO := ULTIMO +1.
MINDIST(i, H): encontra e retorna i da d-heap dH tal que dist(i) dist(j),
j dH (por P1, POS(i) = 1). Faz H[1] := H[ULTIMO] (coloca o ltimo n da
heap na raiz), ULTIMO := ULTIMO 1 e aplica DESCER(i).

38

Algoritmo de Dijkstra com d-heap


Faa: A1 := N {1}, ant(j) := 0 e dist(j) := , j N , dist(1) := 0,
ULTIMO := 0, ADICIONAR(1, H), f := 1 e k := 1
REPITA
Se ( f = n ou H = )
Ento PARE
Seno
MINDIST(f, H)
Para todo j + ( f ) Ak faa
Se ( dist(j) > dist(f) + cfj )
Ento
dist(j) := dist(f) + cfj
ant(j) := f
Se ( j H )
Ento
ADICIONAR(j, H)
Seno
SUBIR(j)
Faa: Ak+1 = Ak {f} e k := k + 1
AT QUE (f = n) ou (H = ).

Complexidade:
SUBIR(i): O( log d n ).
DESCER(i): O(d log d n ).
ADICIONAR(i, H): mesma complexidade de SUBIR(i), ou seja, O( log d n ).
MINDIST(i, H): mesma complexidade de DESCER(i), ou seja, O(d log d n ).
Obviamente que em nmero de iteraes a complexidade do algoritmo O(n), pois em
cada iterao fechamos um n distinto do grafo. Como cada iterao utiliza
MINDIST(), ento at esta parte temos a complexidade de O(n d log d n ). Para o lao
mais interno, no pior caso, para todo (f, j)M aplicamos ADICIONAR() ou SUBIR().
Observe que (f, j) nunca ir se repetir, pois f nunca se repete. Logo esta parte tem
complexidade de O(m log d n ). Portanto a complexidade do algoritmo de Dijkstra
usando uma d-heap :
O(n d log d n + m log d n ).
Fazendo d = max{2, m n } temos O(m log d n ), considerando m n. Para o caso em
que m = kn, onde k uma constante temos ento:
O(n log d n ).

39

Para o caso em que m = n1+ , 0 < 1 temos d = max{2, n } = n , para n 2.


Logo,

m
m
= O
O(m log d n ) = O

log n d
log n n

= O( m ) = O(m).

Exemplo: Aplicar o algoritmo de Dijkstra com d-heap para encontrar um caminho


mnimo do n 1 ao n 6 no digrafo abaixo.
1

5
9
4

8
5

d = max{2, 12 6 } = 2.

dist(j) / ant(j)

Iter.
k

Inic.

4
5
6

4
3

2-heap

0/0

/ 0

/ 0

/ 0

/ 0

/ 0

[1]

0/0

8/1

/ 0

/ 0

9/1

/ 0

[2,5]

8/1

15/ 2

15/ 2

2
5

11 / 2

9/1

/ 0

[5,3,4]
3

15 / 2

9/1

/ 0

10 / 5

17 / 4

10 / 5

4
4

[4,3]
3

[3,6]
6

15 / 2

17 / 4

[6]

17 / 4

40

Algoritmos de Atualizao de Distncias


Esta parte foi dada pelo Professor Cludio e no foi digitada. Temos aqui apenas o
algoritmo genrico modificado para o problema MinSum com as condies de
otimalidade e a demonstrao de otimalidade do algoritmo. Esta parte segue a mesma
notao do artigo que enviamos para o SBPO em 2006.
Problema: Considere APstk o conjunto de arcos do k-simo caminho de s at t e dij o peso do
arco (i, j) do grafo G(N, M). Segue-se o problema MinSum.

( MS )

minimizar
k

ij
( i , j ) APstk

Notaes.
c(j): marca associada a algum caminho do n s at o n j, ambos pertencentes N.
C(j): conjunto de ns que representa o caminho de s at j associado marca c(j).
L: um subconjunto do conjunto de ns N.
Lk: o conjunto L no incio da k-sima iterao do Algoritmo.
c(j)k: a marca c(j) no final da k-sima iterao do Algoritmo.
C(j)k: o conjunto C(j) no final da k-sima iterao do Algoritmo.
N-L: um conjunto composto pelos ns no pertencentes ao conjunto L.
M(i): o conjunto dos arcos divergentes do n i no Grafo.
Algoritmo de Atualizao de Distncias para o Problema Min-Sum
Faa: C(j) := , j N , c(s) := 0 , c(j) := , j N {s}, L := {s} e k := 1
REPITA
Se ( L = )
Ento
C(t) uma soluo tima para o problema (MS) com valor timo c(t)
Seno
Retire um n h de L
Para todo (h,j) M(h) faa
Se ( c(j) > c(h) + d hj )
Ento
c(j) := c(h) + d hj
C(j) := C(h) {h} , onde h ser o ltimo elemento de C(j)
Se ( j L )
ento
L := L {j}
k := k + 1
AT QUE ( L = ).

Teorema 1: (Condies de otimalidade)

j N com c(j) c(i) + d ij ,

i N tal que (i,j) M(i) e


que exista caminho de s at i.

j N

c(j) igual a menor soma dos pesos


dos arcos dentre os caminhos de s at j.

Demonstrao: Sem perda de generalidade, seja ( s ,i1 ,i2 ,K ,ik , j ) um caminho qualquer de s
at j. Pela hiptese deste teorema,

41

c(j) c(i k ) + d ik j .
c(i k ) c(i k 1 ) + d ik 1ik .
M
c(i 2 ) c(i1 ) + d i1i2 .
c(i1 ) c(s) + d si1 .
Considerando as k+1 desigualdades anteriores de baixo para cima, temos,

c(i1 ) d si1 c(i 2 ) d si1 + d i1i2 c(i3 ) d si1 + d i1i2 + d i2i3 L


c(i k ) d si1 + d i1i2 + K + d ik 1ik c(j) d si1 + d i1i2 + K + d ik 1ik + d ik j .
Portanto, c(j) igual a menor soma dos pesos dos arcos dentre os caminhos de s at j.
Vejamos no prximo teorema que a regra de parada do Algoritmo 1 atende s condies de
otimalidade descritas pelo teorema anterior.
Teorema 2: Seja um n qualquer i N na k-sima iterao do Algoritmo 1. Temos que,

c(i)k < e (i,j) M(i) tal que

c(j)k > c(i)k + d ij

i Lk +1 .

c(j)k > c(i)k + d ij

i Lk +1 .

Demonstrao:
Devido equivalncia a seguir,

c(i)k < e (i,j) M(i) tal que

c
i Lk +1

c(i)k =

ou
c(i) < e c(j) c(i) + d , (i,j) M(i),
k
k
ij
k

faremos a demonstrao atravs desta segunda expresso.


k=1:
No final da iterao 1 temos L2 = { j N (s, j) M (s) }. Examinemos os ns i L2 .
Comecemos pelo n i = s. Temos por construo c( s )1 < e pelo prprio algoritmo na
iterao 1 garantimos c( j )1 c( s )1 + d sj , ( s, j ) M ( s ). Para os ns i L2 tal que i s
temos c(i )1 = .
k=l:
Suponhamos a tese verdadeira para k = l . Em particular, no final da iterao l, L = Ll + 1 e temos
que i Ll +1 com c(i ) l < ,

c( j ) l c(i ) l + d ij , (i, j ) M (i ).
k=l+1:
Consideremos somente o caso c(i ) l +1 < , pois o caso c(i ) l +1 = trivial.
Pela l+1-sima iterao do algoritmo temos,

c( j ) l +1 c( j ) l , j N ;

(1)

(2)
c(j)l + 1 = c(j)l ,j Ll + 1 Ll + 2 ; e ,
(3)
Ll + 2 Ll + 1 {h},
onde h o n retirado de L na l+1-sima iterao do algoritmo.
Por (3) temos que N Ll + 2 {N Ll +1 } {h}. Como i Ll + 2 i N Ll + 2 , ento basta
examinar os ns i tal que i {N Ll +1 } {h}. Examinemos os diversos casos:

42

a)

i h. Neste caso i {N Ll + 1 }, ou seja, i Ll +1 . Logo i Ll + 1 Ll + 2 . Utilizando (1),


(2) e a hiptese de induo temos,

c( j ) l +1 c( j ) l c(i ) l + d ij = c(i ) l +1 + d ij , (i, j ) M (i ).


b)

i = h. Para este caso a verificao imediata pela l+1-sima iterao do algoritmo.

43

Algoritmos para rvore Geradora Mnima


Nosso interesse agora estudar algoritmos para a resoluo do problema de rvore
geradora mnima. Em particular estamos interessados nos algoritmos de Prim e Kruskal,
que consideram um grafo G(N, M) valorado, no orientado e conexo. Estes algoritmos
tambm pertencem a classe de algoritmos gulosos. O problema de encontrar uma rvore
geradora mnima em um grafo orientado bem mais difcil e no ser considera neste
momento.
Como j definimos no incio do curso, o problema da rvore geradora mnima consiste
em encontrar uma rvore geradora T* do grafo G(N, M) tal que:

ij

( i , j )T *

ij

T , onde T uma rvore geradora qualquer de G.

( i , j )T

Vejamos primeiro o algoritmo de Prim, que bastante parecido com o algoritmo de


Dantzig para o problema de caminho mnimo.

Algoritmo de Prim
Passo 1 Inicializao:
k := 1,

Fk := {1},

Ak := N {1},

T* := , c(T*) := 0

Passo 2 Regra de Parada:


Se Ak = ento PARE

Passo 3 Incluso de um novo arco:


Escolha ( p, q ) M tal que q Ak , p Fk e c pq = min{cij | i Fk e j Ak }.
T* := T* {(p, q)}
c(T*) := c(T*) + cpq
k := k + 1
Fk := Fk 1 {q}
Ak := Ak 1 {q}
Retorne ao Passo 2.

Observao: Podemos inicializar o conjunto Fk com qualquer n, pois o grafo


considerado no orientado.

Complexidade: Este algoritmo O(nm), pois temos (n 1) iteraes e em cada uma


delas escolhemos um dos m arcos.

44

Exemplo: Aplicar o algoritmo de Prim para encontrar uma rvore geradora mnima do
grafo abaixo.
7
2

Fk

c(T*)

T*

(1,2)

(1,3)

(1,4) (2,3) (2,5) (3,4) (3,5) (3,6) (4,6) (5,6) (5,7) (6,7)

Inic.

(1, 2)

(2, 3)

(3, 4)

(3, 6)

(6, 5)

14

(5, 7)

Veja que tambm poderamos ter resolvido o problema da seguinte maneira:


Fk

cij / i

i Fk e j Ak

c(T*)

T*

Inic.

(1, 2)

2/1

(2, 3)

(3, 4)

3/3

(3, 6)

4/3

3/3

(6, 5)

1/6

7/6

14

(5, 7)

5/5

5/1 4/1

2/2 4/1 7/2


1/3 4/3

45

Assim como vimos nos algoritmos de determinao de distncias, aqui tambm


podemos melhorar a complexidade. Ento vejamos uma variante O(n2) do algoritmo de
Prim.

Algoritmo de Prim (O(n2))


Faa: F1 := {1}, A1 := N {1}, f := 1, dist(1) := 0,
c(T*) := 0
T* := ,
ant(j) := 0 e dist(j) := , j A1 e k := 1
REPITA
Se ( |T*| = n 1 )
Ento PARE: T* uma rvore geradora mnima com custo c(T*)
Seno
Para todo j + ( f ) Ak faa
Se ( dist(j) > cfj )
Ento
dist(j) := cfj
ant(j) := f
Escolha h Ak tal que dist (h) dist ( j ), j Ak
Se ( dist(h) = )
Ento PARE: o grafo G no conexo
Seno
Fk+1 := Fk {h}, Ak+1 := Ak {h},
T* := T* {(ant(h), h)}, c(T*) := c(T*) + dist(h)
f := h e k := k +1
AT QUE (|T*| = n 1) ou (dist(h) = ).
Veja que para este algoritmo no necessrio fazer a hiptese de que o grafo seja
conexo, pois o algoritmo pode identificar este fato. Claro que no algoritmo anterior
tambm poderamos ter colocado um teste semelhante.
Considerando o grafo conexo e no orientado G(N, M), vejamos a seguir o algoritmo de
Kruskal.

Algoritmo de Kruskal
Faa: T* := , c(T*) := 0 e Ni := {i}, i = 1, 2, ..., n
REPITA
Se (|T*| = n 1)
Ento PARE: T* uma rvore geradora mnima com custo c(T*)
Seno
Seja ( p, q ) M tal que p N i , q N j , i j e c pq = min{clk l N g , k N h , g h}
Ni := Ni Nj, EXCLUIR(Nj),
T* := T* {(p, q)}, c(T*) := c(T*) + cpq
AT QUE (|T*| = n 1).

46

Observao: Veja que para este algoritmo tambm podemos inserir, facilmente, uma
regra para identificar, quando ocorrer, que o grafo dado no conexo. Ou seja,
poderamos desconsiderar a hiptese de que G conexo.

Complexidade: Temos (n 1) iteraes com complexidade O(m) cada uma, pois em


uma iterao escolhemos um arco de M para inserir em T*. Portanto o algoritmo de
Kruskal apresentado acima O(nm).
possvel reduzir esta complexidade? Como?

Exemplo: Aplicar o algoritmo de Kruskal para encontrar uma rvore geradora mnima
do grafo valorado abaixo.
7

8
2

9
15

8
6

11

Floresta

c(T*)

T*

N1

N2

N3

N4

N5

N6

N7

(1,2)

(1,4)

(2,3)

(2,4)

(2,5)

(3,5)

(4,5)

(4,6)

(5,6)

(5,7)

(6,7)

Ini.

{}

15

11

(1, 4)

1,4

15

11

10

(3, 5)

1,4

3,5

15

11

16

(4, 6)

1,4,6

3,5

15

11

23

(2, 5)

1,4,6

2,3,5

15

11

30

(1, 2)

1,4,6,2,3,5

11

39

(5, 7)

47

Nosso objetivo agora demonstrar a otimalidade dos algoritmos de Prim e Kruskal, ou


seja, que as rvores geradoras obtidas por estes algoritmos so mnimas. Neste caminho
vamos, primeiramente, enunciar e demonstrar um teorema que nos fornece condies de
otimalidade para uma rvore geradora. Este resultado conhecido como condies de
otimalidade de corte. Depois disso, mostraremos que as solues obtidas pelos
algoritmos de Prim e Kruskal atendem estas condies. Iniciamos nosso propsito com
a definio de corte.

Definio: Considere uma rvore geradora (N, T) de um grafo no orientado G(N, M).
Eliminando-se um arco qualquer (i, j) desta rvore dividimos (N, T) em duas rvores
(N1, T1) e (N2, T2), onde:
iN1 e jN2;
N1 N2 = N e N1 N2 = ; e,
T1 T2 = T {(i, j)} e T1 T2 = .
O conjunto CTij = (N1, N2) = {(l, k)M / lN1 e kN2} denominado um corte do grafo
G associado ao arco (i, j) de T.

Exemplo:
G(N, M)

(N, T)

2
4

1
3

1
3

Eliminando o arco (2, 3) obtemos o corte CT23 = (N1, N2) = {(1, 3), (2, 3), (4, 3)}, onde
N1 = {1, 2, 4} e N2 = {3}.

Teorema 1 (Condies de Otimalidade de Corte):


Dado um grafo no orientado G(N, M), a rvore geradora (N, T*) de G mnima se, e
somente se, (i, j)T* cij clk (l, k)CT*ij.

Demonstrao:
( ) Considere um arco qualquer (i, j)T* tal que |CT*ij| > 1. Suponhamos, por
contradio, que cij > clk para algum (l, k)CT*ij. Isto implica que para a rvore

48

geradora (N, T) de G temos c(T) < c(T*), onde T = {T * {(i, j )}} {(l , k )}. O que
um absurdo, pois por hiptese (N, T*) uma rvore geradora mnima.
( ) Sem perda de generalidade, seja (N, T) uma rvore geradora mnima de G tal que
T T*. Como |T| = |T*|, ento para os conjuntos:

X = {(i, j ) M / (i, j ) T

e (i, j ) T *} ,

X = {(i, j ) M / (i, j ) T

e (i, j ) T *} ,

X = {(i, j ) M / (i, j ) T

e (i, j ) T *} ,

temos | X | = | X | 1. Como (N, T) uma rvore geradora mnima ento:

c(T ) =

ij

( i , j )X

ij

c(T *) =

( i , j )X

c
( i , j ) X

ij

( i , j )X

ij

ij

( i , j ) X

( i , j )X

ij

Mostraremos que esta ltima desigualdade uma igualdade. Seja um arco


qualquer (i, j)T* tal que (i, j)T, ou seja, (i, j) X . O fato de (N, T) ser uma
rvore implica na existncia de um caminho Pij indo do n i at o n j em T, logo
existe (l, k)Pij T, (l, k) (i, j) tal que (l, k)CT*ij = (N1, N2). Assim, por
hiptese, cij clk. Note que (l, k)T*, pois (l, k)CT*ij e (l, k) (i, j). Ou seja,
temos (l, k) X . Agora observe que Pij {(i, j)} forma um ciclo no grafo G.
Ento trocando o arco (l, k) pelo arco (i, j) em T obtemos uma nova rvore
geradora de G. Logo clk cij, pois seno esta nova rvore geradora teria custo
menor do que c(T), ou seja, (N, T) no seria uma rvore geradora mnima de G.
Portanto clk = cij. Excluindo (i, j) de X e (l, k) X reduzimos a cardinalidade
destes conjuntos. Repetindo este processo | X | vezes chegaremos concluso de
que

ij

( i , j ) X

( i , j ) X

ij

. Ento c(T*) = c(T), ou seja, T* tambm uma rvore

geradora mnima de G.
Considere o Grafo no orientado G(N, M) e os conjuntos S, S e (S, S) tais que S N,
S = N S e (S, S) = {(i, j)M / iS e jS}. Vejamos a seguir um resultado que
garante a otimalidade do algoritmo de Prim.

Teorema 2: Seja A um subconjunto prprio de arcos de alguma rvore geradora mnima


de G e seja S o conjunto dos ns que so extremidade inicial ou final dos arcos de A.
Seja um arco (i, j)(S, S) tal que cij clk (l, k)(S, S), ento A {(i, j)} um
subconjunto de arcos de alguma rvore geradora mnima de G.

49

Demonstrao: Suponha que A T, onde (N, T) uma rvore geradora mnima de G.


Sem perda de generalidade, suponha que (i, j)T. Veja que Pij {(i, j)} forma um ciclo
em G, onde Pij um caminho do n i ao n j em T. Este ciclo contm pelo menos um
arco (p, q)(S, S) tal que (p, q) (i, j). Ento, por hiptese, temos cij cpq. Veja que
(p, q)A, pois (p, q)(S, S). Logo trocando o arco (p, q) pelo arco (i, j) em T obtemos
uma rvore geradora T* de G tal que A {(i, j)} T*. Necessariamente cij cpq, pois
seno c(T*) < c(T). Deste modo cij = cpq e, portanto, c(T*) = c(T), ou seja, (N, T*)
tambm uma rvore geradora mnima de G.
Vejamos no prximo resultado que o algoritmo de Kruskal atende as condies de
otimalidade de corte.

Teorema: A rvore geradora (N, T*) do grafo G(N, M) gerada pelo algoritmo de
Kruskal mnima.

Demonstrao: Considere um arco qualquer (p, q)T*. Seja k a iterao em que


inserimos (p, q) em T*. Ento no momento da escolha de (p, q) tnhamos, pNi e qNj
com i j e, tambm, cpq = min{clk / (l, k)A}, onde A = {(l, k)M / lNg e kNh com
g h}. Agora mostraremos que CT*pq A. Veja que um arco (l, h) CT*pq = ( N , N ) s
no estaria em A quando escolhemos (p, q) se tivssemos l, hNx, para algum Nx
existente no momento desta escolha. Mas isto implica que antes mesmo da iterao k j
existia um caminho de h N a l N em T*. Por outro lado, como p e l N e q e
h N ento tambm existem em T* caminhos de l a p e de q a h. Estes dois ltimos
caminhos no necessariamente foram inseridos em T* at a iterao k. Juntando estes
trs caminhos e o arco (p, q) temos um ciclo em T*: (q ... h ... l ... p q).
Portanto, como temos claramente pela mecnica do algoritmo que T* no contm ciclo,
ento impossvel termos l, hNx. Ou seja, CT*pq A. Logo pela escolha de (p, q)
temos:
cpq cij, (i, j) CT*pq.
Portanto, usando as condies de otimalidade de corte temos que (N, T*) uma rvore
geradora mnima de G.

50

You might also like