Professional Documents
Culture Documents
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
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:
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.
4
4
1
3
-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) .
Exemplos:
2
+ (1) = {2,3}
4
(1) = {4}
(4) = {1,2,3}
1, se (i, j ) M
aij =
0, se (i, j ) M
De \ Para
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
1, se i = k
bij = 1, se i = h
0, caso contrrio
(1,2)
(1,3)
(2,3)
(2,4)
(3,2)
(3,4)
(4,1)
-1
-1
-1
-1
-1
-1
-1
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.
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
Busca de antecessores/sucessores: O + (i ) ou O (i ) .
a1
n2
a2
n3
np+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.
Quais so os circuitos?
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 }
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
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
11
Notaes:
P M : Caminho de 1 N a n N em G.
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
12
( 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
( 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
cij indica a
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?
ij
( i , j )T *
ij
( i , j )T
Exemplo:
rvore Geradora
2
20
12
12
8
Custo
5
1
12
2
18
14
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
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
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
custo: 60
tempo: 150.
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
b. O parque deseja exibir aos visitantes, na entrada, a mnima distncia para atingir cada
uma das atraes partindo de 1. Qual esse problema?
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
16
5
7
Custo: 20
Custo: 14
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
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
De \ Para
C2
C3
C4
C5
C6
C1
16
13
C2
10
12
C3
14
C4
20
C5
18
C2
16
C1
10
13
12
4
C3
C4
C6
7
C5
14
20
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.
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
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
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
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
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.
3
2
1
3
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.
5
3
-1
8
1. Problema ilimitado
10
-2
Exemplo 1:
1
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
1.
3.
2.
Em camadas:
1.
3.
2.
2
1
23
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
24
C
E
A
D
Camada 3
n-2
Camada 2
Camada 1
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 }
min
j{ B ,C , D , E }
25
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
Mtodos Gulosos:
1. Guloso Radical escolhe inicialmente o arco de menor peso do grafo.
Exemplo:
2
1
3
k2
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
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
Exemplo:
1
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
Passo 1 Inicializao:
c(1) := 0
ANT(1) := 0
k := 1
Fk := {1} Ak := N {1}
2
5
29
Fk
c(i) + cij
i Fk e j Ak
c(i)
ANT(i)
10
10
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.
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)
(hiptese de induo)
c(r) + crs
(escolha no Passo 3)
c(p) + cpq
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
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
Fk
j Ak
dist(j) = [
min{dist ( j )}.
jAk
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) = ).
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
33
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
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.
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.
15
10
11
Armazenando a d-heap
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
21
28
36
12
32
14
13
18
16
20
38
17
41
52
42
29
15
10
31
22
27
48
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
(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
d
d
d
d
( j 1) d =
37
38
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
m
m
= O
O(m log d n ) = O
log n d
log n n
= O( m ) = O(m).
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
( 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 = ).
j N
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,
i Lk +1 .
i Lk +1 .
Demonstrao:
Devido equivalncia a seguir,
c
i Lk +1
c(i)k =
ou
c(i) < e c(j) c(i) + d , (i,j) M(i),
k
k
ij
k
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)
43
ij
( i , j )T *
ij
( i , j )T
Algoritmo de Prim
Passo 1 Inicializao:
k := 1,
Fk := {1},
Ak := N {1},
T* := , c(T*) := 0
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)
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
45
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.
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
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}.
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 *} ,
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
ij
( i , j ) X
( i , j ) X
ij
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.
49
Teorema: A rvore geradora (N, T*) do grafo G(N, M) gerada pelo algoritmo de
Kruskal mnima.
50