Sei sulla pagina 1di 73

1

Teoria dos Grafos



Jos de Oliveira Guimares
Departamento de Computao - UFSCar
jose@dc.ufscar.br


1 Introduo..................................................................................................................................................................................... 2
1.1 Conceitos Bsicos............................................................................................................................................................... 2
1.2 Histria..................................................................................................................................................................................4
1.3 Aplicaes de Teoria dos Grafos......................................................................................................................................5
1.4 Algoritmos de Busca .......................................................................................................................................................... 6
1.5 Exerccios..............................................................................................................................................................................8
2 Complexidade de Algoritmos................................................................................................................................................... 12
2.1 Exerccios............................................................................................................................................................................ 14
3 Induo Finita............................................................................................................................................................................. 16
3.1 Projeto de Algoritmos por Induo................................................................................................................................ 17
3.2 Problema da Celebridade .................................................................................................................................................. 18
3.3 Exerccios............................................................................................................................................................................ 19
4 Estruturas de Dados para Grafos............................................................................................................................................. 21
4.1 Exerccios............................................................................................................................................................................ 21
5 rvores........................................................................................................................................................................................ 22
5.1 Exerccios............................................................................................................................................................................ 23
6 Ordenao Topolgica.............................................................................................................................................................. 25
7 Conectividade, Caminhos e Ciclos .......................................................................................................................................... 27
7.1 Ciclos................................................................................................................................................................................... 27
7.2 Caminhos ............................................................................................................................................................................ 30
7.3 Exerccios............................................................................................................................................................................ 32
8 Menor Caminho entre Vrtices ................................................................................................................................................ 35
9 Planaridade.................................................................................................................................................................................. 38
9.1 Exerccios............................................................................................................................................................................ 41
10 Emparelhamento..................................................................................................................................................................... 42
10.1 Exerccios............................................................................................................................................................................ 45
11 Fluxo em Redes ...................................................................................................................................................................... 46
11.1 Exerccios:........................................................................................................................................................................... 49
12 Mais Aplicaes Prticas de Teoria dos Grafos............................................................................................................... 50
12.1 Data-Flow........................................................................................................................................................................... 50
12.2 Make.................................................................................................................................................................................... 52
12.3 Eliminao de Cdigo Morto........................................................................................................................................... 52
13 Compresso de Dados Algoritmo de Huffman............................................................................................................ 54
14 rvore de Espalhamento de Custo Mnimo ...................................................................................................................... 58
14.1 Exerccios............................................................................................................................................................................ 63
15 Colorao ................................................................................................................................................................................ 64
15.1 Exerccios............................................................................................................................................................................ 66
16 Reduo de Algoritmos........................................................................................................................................................ 67
16.1 Problema da Satisfabilidade ............................................................................................................................................. 68
16.2 Exerccios............................................................................................................................................................................ 70

2
1 Introduo
1.1 Conceitos Bsicos

Um grafo G = (V, E) um conjunto V de vrtices e um conjunto E de arestas (edges
em Ingls) onde cada aresta um par de vrtices (Ex.: (v, w)). Um grafo representado
graficamente usando bolinhas para vrtices e retas ou curvas para arestas. Exemplo:

a

b c d

e f

Este grafo possui V = {a, b, c, d, e, f e E = {(a, b), (b, c), (b, e), (c, e), (c, d), (d, f) onde (a, b)
uma aresta entre vrtice a e b. Normalmente, arestas do tipo (a, a) no so permitidas.
Um grafo pode ser dirigido ou no dirigido. Em um grafo dirigido, a ordem entre os
vrtices de uma aresta (v, w) importante. Esta aresta diferente da aresta (w, v) e
representada com uma flecha de v para w:

v
w V = {v, w, z E = {(v, w), (v, z), (w, z)
z

Em um grafo no dirigido, (v, w) = (w, v).
Um caminho (path) uma seqncia de vrtices v
1
, v
2
, , v
n
conectados por arestas
(v
1
, v
2
), (v
2
, v
3
), (v
n - 1
, v
n
). As arestas so tambm consideradas como parte do caminho.
Ex.:

v
x caminhos: v, x, w, y
z v, x
w y, w, z
y


Um circuito um caminho onde v1 = vn, como b, c, d, e, f, d, b.

a b e

d
c f


3
Um circuito ser simples se nenhum vrtice aparecer mais de uma vez, exceto o
primeiro e o ltimo. Um circuito simples chamado de ciclo.

Definio: Dado um grafo, dizemos que vrtice v adjacente a vrtice w (ou aresta E) se
existe aresta (v, w) no grafo (ou e = (v, w)).

Definio: Um grafo conectado se existe um caminho entre dois vrtices quaisquer do
grafo.

Definio: Dgrafo um grafo dirigido.

Definio: O grau de um vrtice o nmero de arestas adjacentes a ele. Em um grafo
dirigido, o grau de entrada de um vrtice v o nmero de arestas (w, v) e o grau de sada
o nmero de arestas (v, w). Exemplo:

v

v possui grau de entrada 2 e grau de sada 1.

Definio: Uma fonte um vrtice com grau de entrada 0 e grau de sada 1. Um sumidouro
um vrtice com grau de sada 0 e grau de entrada 1.

Definio: Um grafo completo quando existe uma aresta entre dois vrtices quaisquer do
grafo. O grafo completo de n vrtices denotado por Kn. Exemplos:




K
2
K
3
K
4
K
5

(a) (b) (c) (d)


Definio: Um subgrafo G = (V, E) de um grafo G = (V, E) um grafo tal que V V e E
E. Exemplos:

a b a b
G G G c d
c d c


Definio: Um grafo G = (V, E) bipartido se V pode ser dividido em dois conjuntos V1 e V2
tal que toda aresta de G une um vrtices de V
1
a outro de V
2
. Exemplos:



K
2, 3
K
3, 3


4
Um grafo bipartido completo (GBC) possui uma aresta ligando cada vrtice de V1 a
cada vrtice de V
2
. Se n
1
= |V
1
| e n
2
= |V
2
|, o GBC denotado por K
n1, n2
.

Definio: Dados dois grafos G1 = (V1, E1) e G2 = (V2, E2), dizemos que G1 isomorfo a G2
se e somente se existe uma funo f: V1 V2 tal que (v, w) E1 se (f (v), f (w)) E2, para
todo v, w V
1
. Exemplo:
1 2 a e
5 c
3 b d
4


f = {(1, b), (5, c), (3, d), (2, a), (4, e)}

1.2 Histria

O primeiro problema de teoria dos grafos foi o das pontes de Knisberg. Como no
desenho:

terra: v

Rio x y

terra: w


Esta cidade possua um rio com duas ilhas conectadas por sete pontes como mostra
o desenho acima. O problema saber se possvel caminhar de um ponto qualquer da
cidade e retornar a este ponto passando por cada ponte exatamente um vez.
Euler resolveu este problema criando um grafo em que terra firme vrtice e ponte
aresta:
v

x y

w

Quando caminhamos por um vrtice, ns temos que entrar e sair dele (ou vice-versa,
no caso do ponto inicial), o que significa que usamos um nmero par de arestas cada vez
que passamos por um vrtice.
Como o grafo acima possui vrtices com nmero mpar de arestas, a resposta para o
problema NO.

5
1.3 Aplicaes de Teoria dos Grafos

Nos itens abaixo so detalhados alguns problemas que podem ser resolvidos
utilizando teoria dos grafos.

v Existem funes inteis no programa?

Neste exemplo utilizaremos a linguagem C. Considere que funes so vrtices e existe
aresta de f para g se existe chamada a g no corpo de f:

void f (int n)
{ if (n > 5)
g ( );



Monta-se um grafo de todo o programa:

main
p f k
m n
g h


A execuo do programa comea na funo main que pode chamar as funes p e f. A
funo f pode chamar g e h. Claramente, funes k, m e n nunca sero chamadas e podem
ser removidas na ligao do programa.

v Usando a mesma representao, podemos descobrir se um programa possui recurso
direta ou indireta. Pode existir recurso se existe ciclo no grafo:
f
h g

v Um vendedor deve passar por vrias cidades e retornar ao ponto inicial. Qual o trajeto de
menor distncia possvel ?

v Qual a menor distncia entre duas cidades a e c ?

b
300 200
a 100 c
50 20

30 70

v Como ir da cidade "a" a "c" passando pelo nmero mnimo de cidades?
6

v Quantas cores so necessrias para colorir um mapa no plano?
B
B
C D C D
A
A
E
E


v Outros:
- Labirinto
- Eliminao de cdigo morto
- make do Unix


1.4 Algoritmos de Busca

Busca em profundidade (Depth-First Search DFS)
Uma DFS comea em um vrtice v chamado raiz e caminha por todos os vrtices que
podem ser alcanados a partir de v. Observe que v um parmetro passado ao algoritmo
DFS. Qualquer vrtice pode ser a raiz. Diremos que v conectado a w se existir a aresta (v,
w). Os desenhos abaixo mostram a ordem de visita aos vrtices de acordo com buscas em
profundidade comeando em v. Vrtice numerado n visitado antes de n+1.
v v
1 1
7
2 6 2 4
3 5
5 3
4



Observe que, se executado manualmente por duas pessoas, o algoritmo DFS pode
produzir duas numeraes diferentes. Por exemplo, no grafo da esquerda acima as
numeraes 1 2 3 4 5 6 7 e 1 6 5 2 3 4 7 esto ambas corretas para DFS.

O algoritmo para busca em profundidade marca v (raiz) como visitado, pega um
vrtice w conectado a v (a aresta (v, w) existe) e continua a DFS em w. Depois que a busca
em w termina, o algoritmo toma outro vrtice z conectado a v ainda no visitado e faz a
busca em z. O algoritmo termina quando todos os vrtices ligados a v j foram marcados
(visitados). O algoritmo para DFS mostrado a seguir e incorpora cdigo para fazer
preWork e postWork, que so cdigos executados ao marcar um vrtice e aps visitar uma
aresta. PreWork e postWork dependem da finalidade para a qual DFS est sendo utilizada.


7

Algorithm DFS(G, v)
Entrada: G = (V, E) e um vrtice v V.
begin
marque v
faa preWork sobre v
for each aresta (v, w) E do
if w no foi marcado
then
DFS(G, w);
faa postWork para (v, w)
endif
end

O algoritmo DFS pode ser usado para percorrer todos os vrtices de um grafo e para
descobrir se um grafo conectado ou no. Se, aps uma DFS, todos os vrtices forem
visitados, ento o grafo conectado.

Busca em largura (Breadth-First Search)
Uma BFS feita em um grafo G = (V, E) comeando em um vrtice v. Primeiro o
algoritmo visita v e todos os vrtices conectados a v, chamados filhos de v. Isto , o
algoritmo visita vrtices w tal que (v, w) E.
No segundo passo, o algoritmo visita todos os netos de v. Isto , os vrtices que no
esto conectados diretamente a v mas esto conectados a algum vrtice que est
conectado a v. O algoritmo prossegue deste modo at que todos os vrtices alcanveis por
v sejam visitados.
O primeiro passo do BFS visita todos os vrtices que esto a uma aresta de
distncia de v, o segundo passo visita vrtices que esto a duas arestas de distncia de v e
assim por diante. Os desenhos a seguir ilustram esta interpretao do BFS.
v v 3
1 a 1 b
b 4 a
2 3 c d e 5
5
e 6 f 7 g 4 2 6
c d f
8 h


O algoritmo dado abaixo.





Algorithm BFS (G, V)

Entrada: Grafo G = (V, E) e vrtice v.

begin
8
marque v
coloque v no fim da fila F
while F no vazia do
begin
remova o primeiro vrtice w de F
faa preWork sobre v
for each aresta (w, z), tal que Z no marcado, do
begin
marque z
insira z no fim da fila F
end
end
end

No h postWork para busca em largura.
1.5 Exerccios

Algumas recomendaes para fazer esta lista e para a prova:
todas as questes devem ser justificadas ou provadas;
voc pode fazer quaisquer algoritmos pedidos nos exerccios em linguagem de
alto nvel, a mesma empregada nos algoritmos DFS e BFS;
se voc no sabe fazer uma prova, experimente trabalhar com exemplos de
grafos at ter uma idia intuitiva de como deve ser a prova;
use e abuse de induo finita, a ser ainda estudada;
o contrrio de "todos os elementos do conjunto satisfazem P" "existe um
elemento do conjunto que no satisfaz P" e vice-versa. Esta informao utilizada
em provas por absurdo onde necessrio negar a proposio que se quer
provar;
quando provar algo por absurdo, escreva o contrrio da hiptese para deixar claro
o que voc est fazendo;
os teoremas do tipo "A vlido se e somente se B vlido" exigem duas provas:
"A implica B" e "B implica A";
uma proposio do tipo "Se A ocorrer, ento B pode acontecer" necessita
somente de um exemplo para ser provado;
O nmero entre parnteses aps o nmero do exerccio diz a importncia relativa
deste exerccio. Nmeros maiores so mais importantes.

1. Faa um grafo com trs vrtices de grau par e dois de grau mpar. Tente ficar com apenas
um de grau mpar. Acrescente uma aresta no grafo de tal forma que existam quatro vrtices
de grau par. Acrescente um vrtice no grafo original e qualquer nmero de arestas de tal
forma que o nmero de vrtices de grau mpar fique igual a trs. Pode ser que algumas das
operaes anteriores no seja possvel.

2. Prove: em um grafo qualquer, h um nmero par de vrtices de grau impar. O grau de um
vrtice o nmero de arestas adjacentes a ele. Dica: este teorema pode ser provado
apenas com informaes locais a cada vrtice. Utilize as regras da aritmtica na prova.

9
3. Considere uma representao por grafos de uma entrega de presentes de amigo invisvel
onde as pessoas so os vrtices e existe aresta de v para w se v ir presentear w. Diga qual
a forma geral do grafo assim formado.

4. Faa a busca em profundidade nos grafos abaixo, comeando em v.

v v
v a
b a
c b b
d e e d c c
d
e
f g



5. Em orientao a objetos, os mtodos de uma classe B so os mtodos definidos em B e
aqueles herdados das superclasses de B, o que pode ser representado por um grafo.
Sendo met (B) o conjunto dos mtodos definidos em uma classe (sem contar os mtodos
herdados) e super (B) o conjunto das superclasses de B, faa um algoritmo que retorne
todos os mtodos de uma dada classe usando a representao em grafos. Considere que
todas as classes definam mtodos com nomes diferentes entre si.

6. Explique como BFS pode ser usado para descobrir a distncia mnima, em nmero de
arestas, entre dois vrtices de um grafo.

7. Faa um algoritmo que elimina de um programa todas as subrotinas que nunca podero
ser chamadas em execuo.

8. Encontre um caminho entre a e j no grafo abaixo que passe por todas as arestas
exatamente uma vez.


b
c
a
j
d
h
i
e g
f




10
9. Faa um algoritmo que particione um grafo G em seus componentes conexos G1, G2,
G
n
.


10. Faa DFS e BFS nos grafos abaixo, comeando em v.


v

v
(b)
v
(a)

(c)

11. Encontre, se houver, um circuito em cada um dos grafos acima.

12. Faa um algoritmo para coleta de lixo em uma representao do programa em forma de
grafos e outras estruturas de sua escolha.

13. Um sistema de computao (banco de dados, sistema operacional) possui uma senha
de acesso para cada usurio que d direito ao uso do sistema. Um usurio pode dar a outro
o direito de usar sua rea (ou conta). Se x puder usar a rea de y e y puder usar a de z,
ento x poder usar a rea de z.
Usando uma entrada de dados de sua escolha, faa um algoritmo que retorna true se
um usurio A pode usar a rea de B.

14. Dado um grafo G = (V, E), construa um grafo G = (V, E) tal que (v, w) E se existe
caminho de v para w em G. Usando esta idia, resolva o algoritmo anterior em tempo
constante, aps pr-processar os dados de entrada.

15. Prove que, dadas seis pessoas, uma de duas coisas acontece: ou trs delas se
conhecem ou trs no se conhecem.

16. Considere o seguinte algoritmo para construir uma rvore de DFS para um grafo G:

Algoritm Build_DFS_Tree(G, v)
Entrada: G = (V, E) e v um vrtice de V
Sada: T, a rvore DFS de T, inicialmente vazia.
para cada vrtice, v.DFS inicializado com um nmero
de
busca

begin
Inicialmente, DFS_number = 1;

use DFS com o seguinte preWork:
v.DFS = DFS_number;
DFS_number++;
e o seguinte postWork:
11
if w no estava marcada, adicione a aresta (v, w) em T
end

Um vrtice v chamado de ancestral de w em T com raiz r se v est no caminho nico entre
r e w. Ento w um descendente de v.

Prove que cada aresta de um grafo G = (V, E) ou pertence rvore T construda por
Build_DFS_Tree ou conecta dois vrtice de G, um dos quais um ancestral de outro em
T.

17. Prove: seja G = (V, E) um grafo dirigido e seja T = (V, F) uma rvore DFS de G. Se (v, w)
uma aresta de E tal que v.DFS < w.DFS, ento w um descendente de v na rvore T.

18. A afirmao da questo anterior vale tambm para grafos no dirigidos ?

19. Faa um grafo dirigido de tal forma que,

a) se DFS comear em um dos vrtices, todos os demais so atingidos. Se comear em
qualquer dos outros vrtices, nenhum ser atingido;
b) se DFS comear no vrtice v, quatro dos oitos vrtices sero atingidos. Se a DFS
comear em w e z, trs vrtices sero atingidos. Se comear em t, u e z, dois vrtices sero
atingidos. Se comear em k e m, apenas o vrtice s ser atingido, que um sumidouro.

20. Verifique se uma rvore binria balanceada. Use apenas preWork e postWork de
DFS.

21. Um subgrafo induzido de G = (V, E) um grafo H = (U, F) tal que U V e F inclui todas
as arestas (v, w) em E tal que v e w esto em U. Uma rvore de espalhamento de G um
subgrafo conectado que contm todos os vrtices e nenhum ciclo.

Seja G = (V, E) um grafo no dirigido conectado e seja T uma rvore DFS de G com raiz em
v. Prove:

a) Seja H um arbitrrio subgrafo induzido de G. Mostre que a interseo de T e H no
necessariamente a rvore de espalhamento de H;
b) Seja R uma subrvore de T e seja S um subgrafo de G induzido pelos vrtices em R.
Prove que R pode ser uma rvore de DFS de S.

22. Voc est organizando uma conferncia de cientistas de diferentes disciplinas e voc
tem uma lista de pessoas que poderia chamar. Assuma que qualquer pessoa na lista viria
para a conferncia desde que tivesse um certo nmero de pessoas da rea para trocar
idias. Para cada cientista, h uma lista de outros cientistas com quem ele poderia
conversar (trocar idias). Faa um algoritmo para convidar o nmero mximo de cientistas
possvel assumindo que qualquer um deles viria se tivesse >= 3 pessoas da mesma rea
para conversar.


12
2 Complexidade de Algoritmos

Dizemos que uma funo g (n) O (f (n)) se existem constantes c e N tal que, para n
N, g (n) c f (n).

f, g
g
f
N n

Por exemplo, 2n + 1 = O (n) pois 2n + 1 3n para n 1. Ou 2n
2
+ 5n + 10 = O (n
2
) pois
2n
2
+ 5n + 10 50 n
2
para n 1. A igualdade g (n) = O (f (n)) diz que cf (n) supera g (n) para
todos os nmeros maiores que um certo N. Ento:

O (log2 n) = O (log10 n) = O (log n)
O (3n) = O (5n + 7) = O (n)
O (arn
k
+ ak - 1n
k - 1
+ + a1n + a0) = O (n
k
)
n = O (n
2
)

A notao O usada para estimar o nmero de passos executados por dado
algoritmo considerando que sua entrada possui n bits. Como n bits implica n/8 bytes ou n/32
(ou n/16) palavras, podemos associar n com nmero de bits, bytes ou palavras, j que a
diferena entre eles de uma constante ( 8, 32 ou 16).
Por exemplo, vamos analisar o algoritmo que, dado um vetor de tamanho n, encontra
o seu maior elemento. Os passos em que estamos interessados so as comparaes (<,
<=, >, >=, ==, !=). Isto , queremos saber quantas comparaes teremos.
Para encontrar o maior elemento, usamos todos os elementos do vetor uma vez e
fazemos n-1 comparaes. Ento dizemos que a complexidade deste algoritmo O(n).
Um dos algoritmos para ordenar um vetor toma o maior elemento e o coloca na ltima
posio. Ento o algoritmo chama a si mesmo para ordenar os primeiros n-1 elementos do
vetor. Ento, o nmero de comparaes feitas :
n-1 para encontrar o maior elemento
n-2 para encontrar o segundo maior elemento
n-3 para encontrar o terceiro maior elemento
...
1 para encontrar o maior dentre os dois ltimos elementos
Assim, o total de comparaes (n-1) + (n-2) + ... + 1 = (1 + (n-1))(n-
1)/2 = (n
2
- n)/2 = O(n
2
)
Em geral, no se especifica o significado da complexidade (nmero de
comparaes, nmero de testes, visitas a vrtices, etc) porque este significado pode ser
deduzido pelo contexto. Por exemplo, quando dizemos que um algoritmo para ordenao
O(nlog n), estamos nos referindo a nmero de comparaes.
Se um algoritmo para grafos possuir complexidade O (|E|), (considerando um grafo
G (V, E) como entrada), ento cada aresta ser visitada um nmero constante de vezes.
13
No interessa quantas vezes (um, dois, ), desde que seja um nmero que independe do
nmero de vrtices e arestas do grafo. As barras em |E| indicam a cardinalidade do
conjunto E, que o seu nmero de elementos (nmero de arestas).
Vejamos a complexidade dos algoritmos vistos at agora.

DFS: Cada aresta visitada duas vezes, uma de cada vrtice a que ela adjacente:

1
2


Ento, o nmero de visitas 2 |E|. O grafo pode ser desconectado e o nmero de
subgrafos no mximo igual ao nmero de arestas, |V|. Ento a complexidade do
algoritmo O (|E| + |V|).

BFS: O mesmo raciocnio do DFS. Complexidade O (|E| + |V|).


Os algoritmos cuja complexidade so da forma O (n
k
), k constante, so chamados de
polinomiais e so considerados eficientes. Algoritmos com complexidade O (k
n
), k
constante, so chamados exponenciais. Exemplo:

O (1), O (n
2
), O (n
3
), O (|V|
3
+ |E|
3
), O (n) polinomiais
O (2
n
), O (3
n
) exponenciais

Em geral, algoritmos exponenciais so muito lentos para serem usados na prtica.
Veja a tabela abaixo que mostra o tempo em segundos para executar diversos algoritmos
(cujas complexidades so dadas) considerando-se n = 1000 e que o computador executa
1000 passos do algoritmo por segundo.

Complexidade log2 n n n log2 n n
1.5
n
2
n
3
1 . 1
n

tempo (seg) 0 . 01 1 10 32 1000 1000000 10
39



Algoritmos Probabilsticos

Problema: Dado um conjunto de nmeros x
1
, x
2
, x
n
, selecione um elemento que maior ou
igual a n/2 elementos do conjunto.

Uma opo para resolver este problema ordenar o conjunto e a tomar o mximo
elemento, o que pode ser feito em O (n log n). Outra possibilidade mais barata seria ir
selecionando o mximo elemento do conjunto at termos usado n/2 elementos. No difcil
de ver que nenhum outro algoritmo melhor que este, j que obrigatoriamente n/2 elementos
devem ser usados (pela definio).
Contudo, existe um algoritmo melhor se no exigirmos que a soluo esteja 100%
correta. Tomemos dois elementos x e y quaisquer do conjunto. Assuma x y. A
probabilidade de que x seja maior ou igual a n/2 elementos . A probabilidade de que x
seja menor do que n/2 elementos < .
1
Ento, a probabilidade de que x e y sejam menores

1
Se h muitos elementos iguais mediana, a probabilidade > 1/2. Um nmero a mediana de um conjunto se metade
dos outros menor do que ele e metade maior.
14
que n/2 elementos < . Ou seja, a probabilidade de que ou x ou y seja maior do que n/2
elementos 3/4. Se y for, x tambm ser, j que x y. Ento, a probabilidade de x ser
n/2 elementos .
Tomando k nmeros e selecionando o mximo dentre eles, digamos w, a
probabilidade de que w seja maior ou igual a n/2 elementos 1 - 1/2
k
. Se usarmos k = 100, a
probabilidade de w no estar na metade superior do conjunto ser quase 0. Observe que
precisamos fazer k - 1 comparaes para achar w, o que independe de n.
Este tipo de algoritmo chamado algoritmo de Monte Carlo. Ele pode dar o
resultado errado mas a probabilidade mnima. Um outro tipo de algoritmo chamado de
Las Vegas. Este tipo sempre retorna um resultado correto e possui um tempo de execuo
(Complexidade) esperado (leia-se mdio) baixo. Contudo, ele pode demorar um tempo
arbitrariamente longo para executar.


2.1 Exerccios

23. (1) Qual a complexidade da funo abaixo em funo de n, no pior caso?

int f (int n, int v[], int a)
// n > 0, 1 a n, n o tamanho do vetor
{
int b = n/a;
int i = 1, s = 0;

while ( --a > 0 && --b > 0) {
i++;
s += v[a];
}
return s;


24. Qual a complexidade do algoritmo abaixo, em funo de n ? Observe que a funo f do
exerccio anterior utilizada. A chamada de funo binSearch(a, v, k) faz uma
busca binria por a no vetor v de k elementos.

int g( int a, int n, int v[] )
// v possui n elementos
{
int k = f(n, a);
return binSearch( a, v, k );
}

25. Faa um algoritmo cuja complexidade seja O( n log )

26. Faa um algoritmo cuja complexidade seja O(n n )

27. (4) Calcule as complexidades dos algoritmos abaixo.

15



a)
// assuma que a entrada seja o vetor
i = 1;
while i <= n and v[i] < m do
i = i + 1;

b) // assuma que a entrada seja duas matrizes n
x
n, A e B.
Cuidado!
for i = 1 to n do
for j = 1 to n do
begin
soma = 0;
for k = 1 to n do
soma = soma + A [i, k] B [k, j];
C[i, j] = soma;
end
c) um algoritmo que soma os k primeiros elementos de uma lista, k = mnimo(3, nmero de
elementos da lista).
d) o algoritmo de Monte Carlo visto anteriormente que encontra um elemento x em uma lista
tal que x maior do que metade dos elementos da lista.

28. (4) Simplifique:

(a) O (n) + O (n
2
) + O (n
3
)

(b) O (n
2
) + O (n log n)

(c) O (1) + O (n)

(d) O (n
2 . 81
) + O (2
n
)

29. (1) Simplifique:

(a) O (2
2n
) + O (n
3
) + O (2
n
)

(b) O (n!) + O (2
n
)

16
3 Induo Finita

Induo finita uma tcnica de provar teoremas tambm usada no projeto de
algoritmos. Suponha que queiramos provar um teorema T que possua um parmetro n. Para
provar que T vlido para qualquer valor de n, n >= 1, provamos que:

1 - T vlido quando n = 1;
2 - Se T for vlido para n - 1, ento T ser vlido para n.

1 chamado de base. A prova de que esta tcnica funciona bvia: T vlido para 1 pela
regra 1, para 2 pela regra 2, para 3 pela regra 2, ... A suposio de que T vlido para n - 1
chamada Hiptese de Induo (HI). Vejamos alguns exemplos:

Hiptese: Sendo Sn = 1 + 2 + 3 + + n, ento
S
n
= n (n + 1)/2

Prova: Para n = 1, S
1
= 1 e S
1
=1 (1+ 1)/2 = 1, o que prova a hiptese.

Suponha que a hiptese vlida para n - 1, isto ,
S
n-1
= (n - 1) (n - 1 + 1)/2 = (n - 1) n/2.

Provaremos que ela vlida para S
n
. Sendo
Sn = Sn-1 + n
ento
Sn = (n - 1)n/2 + n = (n
2
- n + 2n)/2 =
= n (n + 1)/2
o que prova a hiptese.
qed.

Hiptese: x
n
- y
n
divisvel por x - y para todos os nmeros naturais x, y, n.

Para n = 1, x
1
- y
1
trivialmente divisvel por x - y. Suponha que a hiptese seja vlida
para n - 1, isto , x - y divide x
n - 1
- y
n - 1
x, y. Reescrevendo x
n
- y
n
, temos:
x
n
- y
n
= (x
n - 1
- y
n - 1
) (x + y) - xy (x
n - 2
- y
n - 2
)
divisvel por divisvel por
x - y x - y

Como o lado direito divisvel por x - y por hiptese, o lado esquerdo tambm o .
qed.

At agora utilizamos o seguinte princpio de induo: se uma hiptese T, com um
parmetro n, verdadeiro para n = 1 e para cada n > 1 a verdade de T para n - 1 implica que
T verdadeiro para n, ento T verdadeiro para todo n .
De fato, existem vrios tipos de induo diferentes deste:
1. pode-se considerar que T verdade para valores k entre 1 e n - 1 e ento provar a
validade para n;
2. pode-se considerar um caso base quando n = m, m uma constante, assumir que T
vlido para n e ento provar a validade para n - 1.
17
1 m 1 . n = m
2 . n n - 1

3. pode-se entender o caso base para mais de um valor como n = 1 e n = 2.
Assumindo que T verdade para n - 1 e n - 2, prova-se que T verdade para n;
4. pode-se assumir que T vlido apenas para um subconjunto de n, como os
nmeros pares (ou primos, ou divisveis por 5). O caso base seria n = 2 e a
hiptese de induo seria T vlido para n - 2, n par.

Outro caso seria T vlido para potncias de 2, que so 1, 2, 4, 8, A hiptese de
induo seria T vlido para n/2 = 2
k - 1
e ento tentaramos provar T para n = 2
k
. Neste
caso poderamos aplicar outra induo para provar que T vlido entre 2
k - 1
e 2
k
.


3.1 Projeto de Algoritmos por Induo

Construiremos um algoritmo para calcular o valor de um polinmio num dado ponto.
Isto , calcular P
n
(x), dado x, assumindo P
n
(x) = a
n
x
n
+ a
n - 1
x
n - 1
+ + a
1
x + a
0
.

Usaremos a tcnica indutiva que admitir que sabemos como resolver um problema
menor e ento usaremos este resultado para resolver o problema completo. A hiptese de
induo (HI) para o problema de calcular P
n
(x) :
HI: Sabemos como calcular P
n - 1
(x) sendo
P
n - 1
(x) = a
n - 1
x
n - 1
+ a
n - 2
x
n - 2
+ + a, x + a
0
.

O caso base n = 0 que resulta em P0 (x) = a0 que trivial. Para calcular Pn (x)
usando P
n - 1
(x) temos apenas que adicionar a
n
x
n
.
P
n
(x) = P
n - 1
(x) + a
n
x
n



Esta frmula resulta no algoritmo abaixo

Algorithm Pol(a', n, x)

Entrada: a' = (a
0
, a
1
, , a
n
), n e x
Sada: a
n
x
n
+ + a
1
x + a
0

begin
S = a
0

for i = 1 to n do
S = S + a
i
x
i
return S;
end

ou na verso recursiva:

Algorithm Pol(a', n, x)

Entrada: a' = (a
0
, a
1
, , a
n
), n e x
Sada: a
n
x
n
+ + a
1
x + a
0
18

begin
if a' == a
0

then
return a
0

else
return Pol (a' - {a
n
, n - 1, x) + a
n
x
n
endif
end

Este algoritmo no eficiente pois ele faz
n + (n - 1) + (n - 2) + + 2 + 1 = n (n + 1)/2
multiplicaes e n adies. Usaremos uma HI diferente para conseguir um resultado melhor.
Para isto definimos
Q
n - 1
(x) = a
n
x
n - 1
+ a
n - 1
x
n - 2
+ + a
1


HI: Sabemos como calcular Q
n - 1
(x)
O caso base n = 0 que o caso trivial. Para calcular Pn usando Qn - 1 usamos a
seguinte frmula:
P
n
(x) = x Q
n - 1
(x) + a
0


O nmero total de multiplicaes n e o nmero de somas n. O algoritmo final :

Algorithm Pol (a', n, x)

Entrada: a = (a
0
,

a
1
, a
n
), n e x
Sada: a
n
x
n
+ a
n - 1
x
n - 1
+ + a
1
x + a
0

begin
if a' == a
0

then
return a
0

else
return x*Pol ((a
1
, a
2
, , a
n
), n - 1, x) + a
0
endif
end


3.2 Problema da Celebridade

Um problema interessante o chamado problema da celebridade. H um conjunto
de n pessoas e queremos descobrir uma celebridade entre elas. Uma celebridade uma
pessoa que no conhece as outras n - 1 pessoas e conhecida por todas elas. Ns s
podemos perguntar a cada pessoa se ela conhece alguma outra. Assim, o nmero total de
perguntas que poderemos fazer n (n - 1).
Podemos representar este problema usando um grafo dirigido onde existir uma
aresta de v para w se v conhecer w. O objetivo seria encontrar um vrtice com n - 1 arestas
de entrada e 0 de sada.


19
Para resolver este problema, tentaremos reduzir o tamanho do problema para n - 1
eliminando uma pessoa que no celebridade. Tomando duas pessoas A e B quaisquer e
perguntando se A conhece B, podemos eliminar:

A se a resposta for sim, pois uma celebridade no conhece ningum.
B se a resposta for no, pois todo mundo conhece a celebridade.

Deste modo podemos tomar duas pessoas A e B quaisquer, eliminar uma delas
(Digamos A, que no celebridade) e resolver o problema para as restantes n - 1 pessoas.
Neste caso h duas possibilidades:

1. A celebridade est entre as restantes n - 1 pessoas.
2. No h celebridade.

Se no h celebridade entre as restantes n - 1 pessoas, no h celebridade entre as
n pessoas porque A no celebridade.
Se h celebridade X entre as n - 1 pessoas, temos que verificar se:

A conhece X.
X no conhece A.

Se a resposta para estas duas questes sim, X uma celebridade tambm entre
as n pessoas. O caso base para este problema acontece quando n = 2, que trivial. A HI :

HI: Sabemos como encontrar uma celebridade entre n - 1 pessoas.
A resoluo do problema para n pessoas usando a soluo para n - 1 j foi dada
acima.
Em cada um dos n - 1 passos do algoritmo, h:

Um teste para descobrir quem no celebridade entre A e B.
Dois testes para descobrir se a celebridade encontrada para n - 1 tambm celebridade
para n.
Ao todo temos 3 (n - 1) teste. Ou seja, para resolver este problema usamos apenas
uma pequena parte de sua entrada, que n (n - 1).


3.3 Exerccios

30. Prove por induo:
2
n
< n! para n 4;

(1 + x)
n
1 + nx
1 + 1 + + 1 > 13
n + 1 n + 2 24

31. possvel colorir as regies formadas por qualquer nmero de linhas no plano com
somente duas cores. Duas regies vizinhas devem ter cores diferentes. Trs ou mais linhas
no se interceptam no mesmo ponto.
20

32. Prove: se n+1 bolas so colocadas dentro de n caixas, pelo menos uma caixa ir conter
mais de uma bola.

33. Faa algoritmos de ordenao utilizando induo finita. Utilize as seguintes HI:
a) HI: sei como ordenar n - 1 elementos;
b) HI: sei como ordenar n/2 elementos;

34. Prove que existe no mximo um vrtice com n - 1 arestas de entrada e 0 de sada em um
grafo de n vrtices.

21
4 Estruturas de Dados para Grafos

Um grafo G = (V, E) usualmente representado por uma matriz ou lista de
adjacncias.

1. Matriz de adjacncia.
Sendo n o nmero de vrtices de G, uma matriz de adjacncia para G uma matriz A
= (ai j ) n n tal que ai j = 1 se (vi , vj )

E.

V
1
V
1
V
2
V
3
V
4
V
1
0 1 1 0
V
2
V
3
A = V
2
0 0 0 1
V
3
0 0 0 0
V
4
V
4
1 1 1 0


A desvantagem desta representao que ela ocupa muito espao se h poucas
arestas. Neste caso, a maior parte da matriz intil. A vantagem que podemos saber se
uma aresta existe ou no em tempo constante.

2. Lista de Adjacncias.
H um vetor de n posies cada uma apontando para uma lista. A posio i do vetor
aponta para uma lista contendo nmeros j tal que (v
i
, v
j
) E. Para o grafo anterior temos:

v
1
2 3 nil
v
2
4 nil
v
3
nil
v
4
1 2 3 nil

4.1 Exerccios

35. Represente um grafo no dirigido de n vrtices usando apenas metade de uma matriz n
n.

36. Seja G(V, E) um grafo. Defina a matriz S = (s
i j
), |E| x |E|, como:
si j = 1 se as arestas ci e cj so incidentes
si j = 0 caso contrrio.
Ento S uma representao de G ? Isto , S contm todas as informaes do grafo ?
Provar ou dar contra-exemplo.

37. Utilizando uma matriz de adjacncias, faa um algoritmo que resolva o problema da
celebridade.
22
5 rvores

Definio: uma rvore um grafo conectado que no contm um ciclo. Exemplos:





Definio: uma floresta um conjunto de rvores.

rvores possuem vrias propriedades interessantes. Elas so dadas abaixo e
admitimos que o nmero de vrtices maior ou igual a 2.

Proposio 1: H um nico caminho ligando dois vrtices quaisquer de um grafo.

Prova: Suponha que haja dois caminhos distintos ligando vrtices v e w no grafo. Caminhos
distintos possuem pelo menos um vrtice no comum a ambos.

v
1
w
1

v w

Se isto acontecer, haver um par de vrtices v
1
e w
1
que ligado por dois caminhos
que no possuem vrtices em comum (exceto v
1
e w
1
) e portanto haver um ciclo, o que
contradiz a hiptese de que o grafo uma rvore.

Proposio 2: Existe pelo menos um vrtice que ligado a apenas uma aresta.

Prova: Provaremos por reduo ao absurdo. Tentaremos provar que a negao da
proposio verdadeira, chegando a um absurdo. A negao "Todos os vrtices so
ligados a mais de uma aresta".
Tomando um vrtice v qualquer, construmos um caminho comeando em v. Entramos
em um dado vrtice e samos por outro. Isto sempre possvel j que cada vrtice ligado a
pelo menos duas arestas.
Como o nmero de vrtices finito, em algum momento estaremos em um vrtice w e
a nica opo ser ir para um vrtice z que j est no caminho. Neste ponto temos um ciclo
formado pelo caminho de z a w (subconjunto do caminho de v a w) e pela aresta (w, z).
Como rvores no possuem ciclos, a hiptese est errada, o que prova a proposio.

z
v
w


Proposio 3: A remoo de qualquer aresta da rvore cria exatamente duas novas rvores.

23
Prova: Tentaremos provar a proposio contrria, que "Pode-se remover uma aresta de
uma rvore e ela continuar conectada". Note que a remoo de uma aresta poderia criar no
mximo duas novas rvores em um grafo qualquer, nunca trs. Assumiremos isto como
bvio.
Suponha que podemos remover aresta (v, w) da rvore e ela continue conectada.
Ento existe um caminho entre v e w que no envolve aresta (v, w), o que significa que existe
um ciclo no grafo original formado por este caminho e (v, w).
w
v (v, w)


Assim, quando uma aresta (v, w) for removida, o grafo se desconectar formando
uma rvore que contm v e outra que contm w.

Proposio 4: Uma rvore com n vrtices possui n - 1 arestas.

Prova: Usaremos a prpria proposio como HI. O caso base n = 2 e trivial.
Removendo uma aresta da rvore temos duas rvores G1 e G2 de acordo com a
proposio 3. Assumindo que G
1
possui k vrtices e G
2
m vrtices, pela HI temos que G
1
e
G
2
possuem k - 1 e m - 1 arestas, respectivamente. Logo, o grafo original possui (k - 1) + (m
- 1) + 1 = (k + m) - 1 arestas. Como o nmero de vrtices da rvore original k + m, a
hiptese est provada.

k vrtices m vrtices
G
1
G
2
k - 1 m - 1
arestas arestas

Proposio 5: A adio de uma aresta na rvore cria exatamente um ciclo.

Prova: A adio de uma aresta (v, w) cria pelo menos um ciclo que aquele formado pelo
caminho ligando v e w na rvore (Proposio 1) e pela aresta (v, w).
Agora provaremos que a adio de uma aresta cria um e s um ciclo. Suponha que
mais de um ciclo criado pela adio de (v, w):
v w

Neste caso existem dois caminhos diferentes ligando v a w que no possuem aresta
(v, w), o que contradiz a proposio 1.


5.1 Exerccios

38. Prove: Em uma rvore, a remoo de um vrtice desconecta o grafo.
24

39. A verso no dirigida de um grafo dirigido G' uma rvore. G' possui uma raiz com grau
de entrada 0 (nenhuma aresta incidente) e todos os vrtices possuem grau de sada 0 ou 2.
Calcule o nmero de vrtices de G' com grau 0 em funo do nmero n de vrtices com grau
2. Prove por induo.

40. Qual o nmero mnimo de bits em que pode ser colocada a forma de uma rvore binria
de n vrtices ?

41. Mostre com um exemplo: a remoo de um vrtice e suas arestas adjacentes de uma
rvore pode resultar em duas ou mais rvores.

42. Seja G uma floresta com n vrtices e k rvores. Quantas arestas possui G ?

43. Faa um algoritmo que diga se um grafo uma rvore ou no.

44. Prove que um grafo conexo com um nmero mnimo de arestas uma rvore.

45. Os nmeros d
1
, d
2
, ... d
n
so tais que
d1 + d2 + ... + dn = 2n - 2
Prove que existe uma rvore com n vrtices cujos graus so d1, d2, ... dn.

46. Dada uma rvore T e k subrvores de T tal que cada par de subrvores possui pelo
menos um vrtice em comum, prove que h pelo menos um vrtice em comum a todas as
subrvores.

47. Uma rvore binria completa definida como se segue. Uma rvore de tamanho 0
consiste de 1 n que a raiz. uma rvore binria completa de altura h + 1 consiste de duas
rvores binrias completas de tamanho h cujas razes so conectadas a uma nova raiz. Se T
uma rvore binria completa de altura h. A altura de um n h menos a distncia do n da
raiz (a raiz tem altura h e as folhas, altura 0). Prove que a soma das alturas de todos os ns
em T 2
h+1
- h - 2.

48. Seja G = (V, E) uma rvore binria no dirigida com n vrtices. Ns podemos construir
uma matriz quadrada de ordem n tal que a entrada ij seja igual distncia entre v
i
e v
j
.
Projete um algoritmo O(n2) para construir esta matriz para uma rvore dada em forma de
lista de adjacncias.

49. Seja G = (V, E) uma rvore binria. A distncia entre dois vrtices em G o tamanho do
caminho conectando estes dois vrtices (vizinhos tem distncia 1). O dimetro de G a
distncia mxima sobre todos os pares de vrtices. Projete um algoritmo linear para
encontrar o dimetro de uma certa rvore.
25
6 Ordenao Topolgica

Suponha que existam um conjunto de tarefas que precisam ser executadas, uma por
vez. Algumas tarefas dependem de outras e no podem ser comeadas antes que estas
outras sejam completadas. Todas as dependncias so conhecidas e ns queremos fazer
um esquema de execuo das tarefas que respeite a dependncia entre elas. Este
problema chamado ordenao topolgica.
Para resolv-lo, usamos um grafo dirigido onde os vrtices so as tarefas e existe
uma aresta de v para w se w s pode ser executado aps a execuo de v. O grafo
evidentemente deve ser acclico (por que?).

Problema: Dado um grafo acclico dirigido (Direct Acyclic Graph - DAG) G = (V, E) com n
vrtices, numere os vrtices de 1 at n tal que, se v possui nmero K, ento todos os vrtices
que podem ser atingidos de v por um caminho dirigido possuem nmeros > K.
Deste modo a execuo das tarefas pode ser feita na ordem 1, 2, 3, n. No grafo
abaixo, os nmeros nos vrtices indicam uma ordenao topolgica.
1
2 3 4
5
6 7

A hiptese de induo :

HI: Ns sabemos como numerar um grafo com < n vrtices de acordo com as
restries acima.
Utilizaremos induo finita de uma maneira diferente: tomaremos um grafo com n
vrtices e removeremos um vrtice com alguma caracterstica especial. Ento teremos um
grafo com n - 1 arestas e aplicaremos a HI. Depois adicionamos novamente o vrtice
removido (com suas arestas).
O caso base n = 1 que trivial. Considerando o caso geral, grafo com n vrtices,
removemos um vrtice e aplicamos a hiptese de induo. O vrtice a ser removido
aquele que no possui dependentes, isto , nenhuma aresta chega a ele. Este vrtice
possui grau de entrada 0. De acordo com lema 1 (provado adiante) este vrtice sempre
existe.
Aps encontrar este vrtice, o numeramos com 1 e o removemos do grafo juntamente
com as arestas adjacentes. Ento aplicamos a HI para os n - 1 vrtices restantes usando
nmeros de 2 a n.
Observe que estes vrtices podem formar mais de um grafo no importa. A HI
pode ser aplicada em todos estes grafos porque eles satisfazem a hiptese inicial so
acclicos dirigidos.

Complexidade: cada vrtice e cada aresta usada um nmero constante de vezes. Ento,
a complexidade O (|E| + |V|).

26
Lema 1: Um grafo acclico dirigido sempre contm um vrtice com grau de entrada 0, isto ,
um vrtice sem dependncias.

Prova: Suponha o contrrio, isto , todos os vrtices possuem grau de entrada > 0 o que
significa que existe pelo menos uma aresta que leva a cada vrtice do grafo.
Neste caso, tomando um vrtice qualquer, poderamos caminhar no sentido oposto
direo das arestas sem nunca ter que parar, j que sempre existe aresta que chega a cada
vrtice. Como o nmero de vrtices finito, em algum momento chegaremos a um vrtice
em que j passamos antes. Neste caso teremos um ciclo, o que impossvel j que o grafo
acclico.


27
7 Conectividade, Caminhos e Ciclos

Definio: Um grafo no dirigido bi-conectado se existe pelo menos dois caminhos
disjuntos em vrtices ligando dois vrtices quaisquer do grafo.

Exemplos:






Se vrtices so computadores (ou processadores) e as arestas so ligaes entre
eles, um computador pode falhar e ainda sim os outros sero capazes de conversar entre si.
Como caminhos disjuntos em vrtices implica em caminhos disjuntos em arestas,
uma ligao pode ser interrompida e ainda assim todos os computadores sero capazes de
se comunicar entre si.
Grafos bi-conectado possuem um alto grau de conectividade. Situao oposta
acontece com rvores. Elas so conectadas mas a remoo de qualquer vrtice que no
seja folha (ou mesmo uma aresta) as desconecta.
Ento, se quisermos ligar vrios computadores utilizando o menor nmero de
ligaes possvel, mas de tal forma que todos possam conversar entre si, devemos usar
uma rvore.

7.1 Ciclos

Problema: Faa um algoritmo que retorna true se um grafo no dirigido G (V, E) possui
um ciclo, false caso contrrio.

Algorithm HaCiclo (G (V, E), v): boolean
{ Faz uma busca em profundidade no grafo }
Entrada: um grafo G e um vrtice v de G

begin
marca v
Seja S o conjunto de arestas (v, w) tal que w no foi marcado
for each aresta (v, w) de S do
if w no foi marcado
then
if HaCiclo (G, w)
then
retorne true;
endif
else
{ achou um ciclo - no necessrio continuar
a busca em vrtices adjacentes a v }
return true;
endif
return false;
28
end


O algoritmo HaCiclo para grafos dirigidos, HaCicloDirig, faz uma busca em
profundidade e retorna true (h ciclo) se h aresta do vrtice corrente (v) para um outro
vrtice w que est na pilha construda pela busca em profundidade. O ciclo encontrado
formado pelo caminho de w at v e a aresta (v, w):

raiz

w
v




Algorithm HaCicloDirig( G(V, E), v, S) : boolean

Entrada: um grafo G(V, E), um vrtice v de G e uma pilha S
contendo os vrtices sendo visitados.
Sada: retorna true se houver ciclo cujos vrtices so
alcanveis a partir de v.

begin
marque v
empilhe v na pilha S
for each aresta (v, w) V do
if w no foi marcado
then
if HaCicloDirig( G, w, S)
then
return true;
endif
else
if w est na pilha S
then
return true;
endif
endif
desempilhe v de S
return false;
end


Este algoritmo s funcionar se o ciclo do grafo (se existir) alcanvel a partir do vrtice v.
Ao chamar este algoritmo, passa-se uma pilha vazia como parmetro S.

29
Note que claro que se os algoritmos retornam true h ciclo no grafo (embora ns
no provamos isto). Tambm verdade que, se h ciclo no grafo, os algoritmos retornam
true, embora o raciocnio para chegar a esta concluso no seja to simples.

7.2 Uma Propriedade da Busca em Profundidade

O Algoritmo de busca em profundidade pode construir uma rvore com as arestas que ele
percorre na busca. Esta rvore chamada rvore de DFS.

r
Grafo exemplo



r
v
w
rvore de DFS do grafo acima




Vrtice (v) ser um ancestral de w em uma rvore t com raiz r se v estiver no nico caminho
entre w e r em t.


r


Lema: seja T uma rvore de DFS de um grafo G. Ento cada aresta de G:

1. pertence a T ou;
2. conecta dois vrtices em G, um dos quais ancestral do outro em T.

Prova: seja (v,z) uma aresta de G. Suponha que v seja visitado por DFS antes de z. Ento
uma de duas coisas ocorre:

1. a partir de v, visita-se z. Ento (v,z) pertence arvore de DFS.
30
2. z no visitado pois, a partir de v, visitamos outros vrtices que visitaram z:

v1
2
4
5
z
3

Ento v ancestral de z.



Prova de que o algoritmo HaCiclo funciona:

Se, partindo de v, encontramos um vrtice z j marcado, ento v ancestral de z na
rvore de DFS. Isto implica que existe um caminho entre v e z que, juntamente com a aresta
(v, z), formam um ciclo:
v
z





7.3 Caminhos

Definio: Um grafo G no dirigido Eureliano se existe um caminho fechado (circuito) que
inclui cada aresta de G. Este caminho chamado de caminho Eureliano.

Arestas em um circuito no se repetem. Assim, um caminho Eureliano contm cada
aresta do grafo exatamente uma vez.
Exemplo:
4 1

G: Caminho 8 5 3 2
Eureliano:
7 6


Teorema: Um grafo conectado G Eureliano se e somente se o grau de cada vrtice de G
par.

A prova feita por contradio: admita que um vrtice possui grau mpar. O
caminho Eureliano passar por ele um certo nmero de vezes e, a cada vez, utilizar duas
31
arestas (uma para entrar e outra para sair). Ento sobrar uma nica aresta que no poder
ser utilizada no caminho: contradio, o que prova que a hiptese est correta. A prova
dada pelo algoritmo para encontrar um caminho Eureliano, que dado a seguir.
A partir de um vrtice v qualquer, comece a percorrer o grafo sem passar por
nenhuma aresta duas vezes. Como o grau de cada vrtice par, podemos sempre entrar
em um novo vrtice por uma aresta e sair por outra:




Como o nmero de vrtices de G finito, em algum momento retornaremos a v.
Como nenhuma aresta foi usada duas vezes, temos um circuito P. Note que este circuito
pode no conter todos os vrtices do grafo:

1
G: Circuito:
4
P
2 3

Agora construmos G retirando de G as arestas do circuito encontrado acima. O grau
de cada vrtice em G par pois o nmero de arestas removidas de cada vrtice par. G
pode no ser conectado. Sejam G
1
, G
2
, G
k
os componentes conexos de G. Cada grafo
G
i
conectado e o grau de cada vrtice par (pois o grau de cada vrtice de G par).
Sejam P
1
, P
2
, P
k
os circuitos Eurelianos encontrados pela aplicao recursiva deste
algoritmo a G1, Gk.
Para encontrar um Caminho Eureliano para G, comeamos a percorrer o circuito P a
partir de um vrtice qualquer. Quando encontramos um vrtice v que pertence a um caminho
P
i
, percorremos P
i
, retornamos a v e continuamos a percorrer P novamente. Deste modo,
quanto chegarmos ao vrtice inicial de P, teremos percorrido P, P
1
, P
2
, P
k
. Isto , teremos
um circuito Eureliano. Veja a ilustrao abaixo.

P
1
P
2
P
4
P

P
3


O desenho acima mostra o circuito P (grande) e os circuitos P1, P2, P3 e P4. obtidos
aps a remoo de P do grafo. O desenho abaixo mostra como todos estes circuitos podem
ser conectados para formar um caminho Eureliano para o grafo.

32
P
1
P
2
P
4
P P
3

incio



Definio: Um circuito Hamiltoniano em um grafo conectado G um circuito que inclui cada
vrtice de G exatamente uma vez.

Encontrar um circuito Hamiltoniano (CH) claramente mais difcil que encontrar um
caminho Eureliano (CE), pois cada vez que atingimos (num percurso) um vrtice v a partir de
uma aresta "e", nunca mais podemos usar v e quaisquer de suas arestas. Em um CE, no
poderamos usar "e", mas poderamos usar v e suas outras arestas.





CH





CE


O problema Encontre um CH para um grafo G NP-completo (Veja Seo 16) e
portanto nenhum algoritmo ser estudado.

O Problema do Caixeiro Viajante (The Traveling Salesman Problem)

Um vendedor quer visitar um grupo de cidades comeando e terminando em uma
mesma cidade de tal forma que o custo da viagem (distncia percorrida) seja o menor
possvel e que cada cidade seja visitada apenas uma vez. Ou seja, o problema encontrar
um circuito Hamiltoniano de custo mnimo. Naturalmente, este problema NP-completo.
7.4 Exerccios

50. Faa um grafo que contenha um circuito que no ciclo.

33
51. No Unix possvel associar um outro nome a um arquivo ou diretrio j existente atravs
do utilitrio ln:
ln NovoNome Arq
Aps a execuo do comando acima, NovoNome ser um alis para Arq. ln pode criar
situaes perigosas, como fazer uma associao recursiva:
$cd /A/B
$ln C /A
$ o prompt do Unix. Neste caso estamos colocando o diretrio A, com nome C, dentro do
prprio A. Crie um novo comando safeln, em linguagem de alto nvel, que usa ln e no
permite este tipo de situao.

52. Faa um algoritmo que retorna true se um programa pode ser recursivo em execuo.
Assuma que a entrada do algoritmo dada em forma de um grafo usando uma
representao de sua escolha.

53. Em um sistema operacional, um processo ter sua execuo suspendida se ele
aguardar um recurso (impressora, disco, ) que est sendo usado por outro processo. Esta
situao chamada de deadlock.
Faa um algoritmo que detecta se h deadlock entre os processos. Por exemplo,
processo A espera B liberar recurso R1 e B espera A liberar recurso R2.

54. Prove: se, aps a remoo de uma aresta de um grafo, temos um ciclo, o grafo original
possui um ou mais ciclos.

55. Se A a matriz de adjacncias de um grafo, ai j = 1 se existe uma aresta entre vrtices i
e j; isto , se existe um caminho de uma aresta de comprimento 1 (um) entre i e j.
Prove que (a
i j
)
2
, que o elemento a
i j
de A
2
, o nmero de caminhos entre i e j de
tamanho 2. Estenda este resultado para A
k
.

56. Dois ciclos em um grafo G' possuem uma e s uma aresta em comum. Prove que o
grafo obtido pela remoo desta aresta possui pelo menos um ciclo.

57. Um istmo uma aresta tal que a sua remoo desconecta o grafo. Mostre que uma
aresta um istmo se e somente se ela no est contida em nenhum circuito.

58. Um plotter deve desenhar um certo conjunto de pontos isolados no papel de tal forma
que a cabea de impresso mova o menos possvel. Mapeie este problema para grafos.

59. Prove: Se G um grafo onde o grau de cada vrtice pelo menos dois, ento G contm
um ciclo.

60. Prove: Dois vrtices quaisquer de um grafo bi-conectado esto contidos em um ciclo.

61. Justifique: dois caminhos podem possuir vrtices em comum sem possuir arestas em
comum.

62. Seja G = (V, E) um grafo no dirigido conectado e seja F o conjunto de vrtices com grau
mpar (o grau de um vrtice o nmero de arestas ligadas a ele). Ento podemos dividir F
em pares e encontrar caminhos disjuntos em arestas conectando cada par.
34

63. Seja G um grafo no dirigido tal que cada vrtice possui um grau par. Projete um
algoritmo de tempo linear para direcionar as arestas de G de tal forma que, para cada
vrtice, o grau de sada igual ao de entrada.

35
8 Menor Caminho entre Vrtices


Definio: Um grafo com comprimentos (ou pesos) associa a cada aresta um comprimento
que um nmero real positivo. O comprimento de um caminho a soma dos comprimentos
de suas arestas.

Problema: Calcular o menor caminho de um vrtice v a todos os outros de um grafo dirigido.

A idia considerar os vrtices do grafo na ordem dos comprimentos de seus
menores caminhos de v. Primeiro, tomamos todas as arestas saindo de v. Seja (v, x) a
aresta de menor comprimento entre elas. Ento o menor caminho entre v e x a aresta (v, x)
por que qualquer outro caminho envolveria outra aresta (v, w), w x que sozinha j possui
comprimento maior que (v, x).

v
2
x 3
6 5





Se quisermos encontrar o vrtice y que o segundo mais perto de v, devemos
considerar apenas as arestas (v, y) e os caminhos (v, x), (x, y).
Para resolver este problema por induo, o caso base encontrar x dado acima, isto
, encontrar o vrtice mais prximo de v. A hiptese de induo :

HI: Dado um grafo G = (V, E), sabemos como encontrar os K vrtices que esto mais
prximos de v e os comprimentos dos caminhos de v a estes vrtices.

O nosso problema agora como estender a HI para mais de um vrtice. Isto ,
admitindo a HI para K, que vrtice devemos acrescentar para provar a hiptese para K + 1.
Seja V
k
o conjunto contendo v e os K vrtices mais prximos de v no grafo. Queremos
encontrar um vrtice w que o mais prximo de v entre os vrtices G - Vk e encontrar o
menor caminho de v a w.
O menor caminho de v a w s pode passar por vrtices de Vk. Ele no pode incluir um
vrtice y que no est em V
k
por que ento o caminho (v, y) seria menor que (v, w) e y seria
mais prximo de v que w.
V
k
V
k
v v


G - V
k
' y w w


36
Ento w ligado a um elemento de Vk por uma nica aresta. Considere agora todas
as arestas (u, z) tal que u V
k
e z G - V
k
.
V
k
v

u
G - V
k
' z

Cada aresta (u, z) define um caminho v u, z. Um dos vrtices z w, o vrtice mais prximo
de v dentre todos aqueles fora de Vk. Ns tomaremos todos estes caminhos e escolheremos
o menor dentre eles. Deste modo podemos acrescentar um vrtice a Vk estendendo a HI de
K para K + 1. O vrtice escolhido o w.
Segue do raciocnio acima que o vrtice w adicionado a V
k
o K + 1 mais prximo
de V. O conjunto resultante V
k+1
que realmente contm os (K + 1) vrtices mais prximos
de V.
O algoritmo comea com V1 = {v} e a cada passo adiciona a Vk o vrtice w tal que
f(w) o menor valor dentre f (y), y G - Vk. A funo f dada por:
f (y) = distncia (v, u) + comprimento (u, y)
onde u e y so vrtices da fronteira entre V
k
e G - V
k
sendo que u V
k
e y G - V
k
.

Exemplo:

V
1
V
2
v v
5 8 5 8
a c a c
2 10 8 2 10 8
d 9 d 9
1 f 1 f
12 3 b 12 12 3 b 12
g e g e
f(d) = dist (d, a, v) = 7
f(e) = dist (e, a, v) = 14
f(c) = dist (c, v) = 8
f(b) = dist (b, v) = 10

37
V
3
V
4
v v
5 8 5 8
a c a c
2 10 8 2 10 8
d 9 d 9
1 f 1 f
12 3 b 12 12 3 b 12
g e g e
f(g) = dist (g, d, a, v) = 19 f(g) = dist (g, d, a, v) = 19
f(e) = dist (e, a, v) = 14 f(e) = dist (e, a, v) = 14
f(c) = dist (c, v) = 8 f(b) = dist (b, v) = 10
f(b) = dist (b, v) = 10 f(f) = dist (f, c, v) = 16



V
5
V
6
v v
5 8 5 8
a c a c
2 10 8 2 10 8
d 9 d 9
1 f 1 f
12 3 b 12 12 3 b 12
g e g e



V
7
V
8
v v
5 8 5 8
a c a c
2 10 8 2 10 8
d 9 d 9
1 f 1 f
12 3 b 12 12 3 b 12
g e g e



38
9 Planaridade

Um grafo planar aquele que pode ser desenhado no plano de tal forma que duas
arestas quaisquer no se interceptam. Exemplo:


(a) (b) (c)

Observe que, apesar de duas arestas de (a) cruzarem, este grafo planar porque ele
pode ser transformado no desenho (b).

Teorema de Jordan: Dada uma curva fechada no plano e dois pontos, um interior e outro
exterior a ela, qualquer curva ligando os dois pontos intercepta .


interseo

Teorema: k5 e k3,3 no so planares.

Prova: Provaremos apenas que k
5
no planar. Usando a representao

2
3 4
1


o plano fica dividido em quatro regies. Em qualquer regio que coloquemos o quinto
vrtice, uma aresta que o liga a algum outro vrtice cruzar outra aresta (pelo teorema de
Jordan).

Definio: A subdiviso de uma aresta uma operao que transforma a aresta (v, w) em
um caminho v, z1, z2, zk, w sendo k 0, onde os zi so vrtices de grau 2 adicionados ao
grafo.
Um grafo G
2
ser uma subdiviso do grafo G
1
quando G
2
puder ser obtido de G
1

atravs de uma seqncia de arestas de G
1
. Exemplo:

39
G
1
b b
a d subdiviso
c de G
1
a d

c


Teorema de Kuratowski: Um grafo planar se e somente se ele no contm nenhum
subgrafo que uma subdiviso de K
5
ou K
3,3
.

A prova deste teorema est alm do alcance deste curso.

Um circuito eletrnico pode ser considerado um grafo onde as junes so vrtices e
as arestas so os fios ligando as junes. Se o grafo correspondente ao circuito planar,
todos os fios podem ser gravados na prpria placa. Se o grafo no planar por causa de
apenas uma aresta, esta um fio normal que deve passar por cima da placa. Isto equivale a
colocar esta aresta acima do plano contendo o restante do grafo:

fio normal

fio gravado na
placa



Teorema: Todo grafo planar admite uma representao plana em que todas as linhas so
retas.

Definio: Um grafo pode ser embebido em uma superfcie S se ele pode ser colocado em
S de tal forma que quaisquer duas de suas arestas no se cruzam.

Teorema: Para cada superfcie S, existe um grafo que no pode ser embebido em S.

Definio: Uma superfcie uma curva descrita por 2 dimenses, no necessariamente no
plano. Ex.:
40
esfera
Torus
pneu



Nota: K
5
pode ser embebido no Torus:


K3,3 pode ser embebido na fita de Mbius

Teorema: Um grafo pode ser embebido na esfera S se ele pode ser embebido no plano.

Existe um algoritmo O (n) para determinar se um grafo planar ou no, feito por Hopcroft e
Tarjan.


Teorema: Qualquer grafo pode ser colocado em um espao de trs dimenses.

Prova: Coloque os vrtices do grafo em uma reta X. Ento, para cada aresta, faa um plano
que contm X. Arestas distintas devem corresponder a planos distintos.
Para cada aresta desenharemos um semicrculo ligando os dois vrtices. As arestas
no se interceptaro porque elas estaro em planos diferentes.

41
d
c
b
a
X


a (b, d)
(a, d)
c b

d (a, b)
(a, c)


9.1 Exerccios

64. Prove: Se G planar, qualquer subgrafo de G planar.

65. Prove que K3, 3 no planar.

66. Desenhe um grafo no planar com oito vrtices com um nmero mnimo de arestas.
42
10 Emparelhamento

Dado um grafo, um emparelhamento um conjunto de arestas t tal que duas delas
no possuem vrtice em comum. Ex.:



significa uma aresta do
emparelhamento


Pela definio, um vrtice no incidente a mais de uma aresta do emparelhamento:

Errado


Emparelhamento Bipartido

Seja G = (V, E, U) um grafo bipartido tal que V e U so os conjuntos de vrtices
disjuntos.
V
U

Problema: Encontre um emparelhamento de cardinalidade mxima em G.

V pode representar um conjunto de trabalhadores e U um conjunto de habilidades ou
profisses (eletricista, secretria, telefonista, digitador, mecnico). Uma aresta liga um
trabalhador a todas as profisses a que ele est habilitado.

Joo Pedro Ana
V
U
Digitador Secretrio (a) Telefonista Mecnico


O problema ento dar empregos ao mximo nmero de pessoas respeitando suas
habilidades. Para o grafo acima, uma soluo seria:
J P A


d s t m

emparelhamento = M = {(J, t), (P, m), (A, s)}
43

Um caminho al ternante P para um emparelhamento M um caminho de um vrtice u
em U para v em V, ambos no emparelhados em M, tal que as arestas de P esto
alternativamente em E - M e M. Ex.:
1 2 3

M:

a b c


1 a 2 b um caminho alternante para M:

1 2
U
V
a b


Um caminho alternante sempre ser da forma

v u


A primeira e a ltima aresta no pertencem a M. Se o caminho comeasse em V e
terminasse em V, ele teria um nmero par de arestas. Como ele comea em V e termina em
U, ele possui um nmero mpar. Ex.:

V U
V U


Um caminho alternante ter sempre uma aresta que no pertence a M a mais que o
nmero de arestas em M. Ento, podemos inverter as arestas pertencentes a M / no
pertencentes criando um emparelhamento M que possui uma aresta a mais que M:

V U
V U


Sempre que existir um caminho alternante, o emparelhamento M no ser o mximo
em G. O contrrio tambm verdadeiro, resultando em

Teorema: Um emparelhamento M em G um emparelhamento mximo se e somente se G
no contm nenhum caminho alternante para M.
Construiremos agora um algoritmo para encontrar o emparelhamento mximo em G
baseado neste teorema. Utilizaremos o fato de que qualquer emparelhamento que no
mximo possui um caminho alternante e este pode estender o emparelhamento. Grande
44
parte dos algoritmos de teoria dos grafos so feitos desta forma: toma-se um teorema e
constri-se um algoritmo baseado nele.
O algoritmo faz uma primeira aproximao escolhendo aleatoriamente arestas para o
emparelhamento. Ento ele procura caminhos alternantes, modificando o emparelhamento
apropriadamente at que no existam mais caminhos alternantes. Ento, pelo teorema, o
emparelhamento resultante mximo.
Para encontrar os caminhos alternantes, criamos um grafo dirigido G a partir de G =
(V, E, U) tal que G' possui os mesmos vrtices e arestas que G. Cada aresta de G' possui
uma direo (afinal, G' dirigido) que depende da aresta correspondente de G:
se a aresta de G pertence ao emparelhamento, a direo da aresta de G' de V
para U;
se no pertence, a aresta de G' aponta de U para V.

No exemplo abaixo so mostrados G e G:

1 2 3 4 5 6
V
U
A B C D E F
G
1 2 3 4 5 6
} V
} U
A B C D E F
G


Em G, um caminho qualquer comeando em um vrtice no acasalado em U e
terminando em um vrtice no acasalado em V corresponde exatamente a um caminho
alternante em G.
Como exemplo, encontraremos um emparelhamento mximo para o grafo abaixo.

1 2 3 4
} V
} U
A B C D


Primeiro, fazemos uma primeira tentativa para M, colocando tantas arestas quanto possvel:
45
1 2 3 4
} V
G
} U
A B C D
G

Um caminho em G conforme descrito anteriormente D3B2A1. Invertendo as
arestas de M em G, temos
1 2 3 4


A B C D

G resulta em
1 2 3 4
V
U
A B C D

que no possui mais nenhum vrtice no acasalado por onde comear um novo caminho
alternante. Portanto o emparelhamento resultante mximo.


10.1 Exerccios

67. Encontre um emparelhamento mximo para os grafos abaixo.

V V
a) b)
U U


Utilize o algoritmo dos caminhos alternantes. Mostre a execuo de cada passo do
algoritmo.

68. Explique porque um caminho alternante possui um nmero par de arestas do
emparelhamento M e um nmero mpar de arestas do conjunto E - M.

46
11 Fluxo em Redes

Seja G = (V, E) um grafo dirigido com um vrtice s chamado fonte com grau de
entrada 0 e um vrtice t chamado sumidouro com grau de sada 0. A cada aresta e
associada uma capacidade c (e) > 0. A capacidade da aresta e mede a quantidade de fluxo
que pode passar atravs dela.
Um fluxo uma funo f nas arestas de G tal que:
1. 0 f (e) c (e). O fluxo atravs de uma aresta no excede sua capacidade;
2. Para todo v V - {s, t}
f (u, v) = f (v, w)

u

w

Isto , o total de fluxo que entra em v o mesmo que sai.
Podemos imaginar os vrtices como junes e as arestas como canos dgua. Cada cano
possui uma capacidade dada em m
3
/s alm da qual ele arrebenta.
As arestas tambm podem ser consideradas estradas, os vrtices cruzamentos e o
fluxo a capacidade de automveis por minuto da estrada.
Um exemplo de um grafo com os fluxos e capacidades mostrado abaixo. 4/3
significa c (e)/f (e); isto , capacidade 4 e fluxo 3.

4/3

5/5 3/2 3/3
7/5 4/4 7/7
s
4/1
6/5 1/1 6/5

5/5

Claramente, h um fluxo mximo que pode se originar em s e chegar em t
respeitando-se as capacidades de cada aresta.


Definio: Um corte um conjunto de arestas dirigidas ligando um vrtice de um conjunto A
de vrtices a vrtice de um conjunto B. A contm s e B = V - A.

Um corte um conjunto de arestas que separa um conjunto contendo s de um
conjunto contendo t. Ex.:

S t

A
B C D
Os cortes so as linhas

47
Teorema: O valor do fluxo mximo em uma rede igual capacidade do corte de menor
capacidade.

A capacidade de um corte a soma das capacidades de suas arestas. Claramente o
fluxo mximo no pode ser maior que a capacidade de algum corte da rede:
B
A 3
2
4

De outra forma, o fluxo excederia a capacidade das arestas do corte. A prova de que o fluxo
mximo igual mnima capacidade de um corte utiliza caminhos alternantes e no ser
feita aqui.


Definio: Uma seqncia aumentante (SA) em G dado um fluxo f uma seqncia de
arestas que ligariam s a t se as arestas no fossem dirigidas:
e
1
e
2
e
3
e
4
e
5
s t

Cada uma das arestas (a, b) da SA deve satisfazer uma das condies abaixo:

1. se (a, b) for dirigida de s para t, ento f (a, b) < c (a, b). Isto , as arestas que
apontam na direo de t podem ter o seu fluxo aumentado. Veja as arestas e1, e2 e e5.

2. Se (a, b) for dirigida de t para s, ento f (a, b) > 0. Isto , as arestas que apontam
de t para s podem ter o seu fluxo diminudo. Veja e
3
e e
4
.

Considere o vrtice:
e
1
c
1
/f
1
5/3 7/1

e
3
e
4
e
2
c
2
/f
2

onde 5/3 significa fluxo 3 e capacidade 5. Como todo o fluxo que entra sai, 3 + 1 = f
1
+ f
2
= 4.
Claramente podemos aumentar em 1 o fluxo em e3 e diminuir de 1 em e4:
(3 + 1) + (1 - 1) = f1 + f2 = 4
Estamos admitindo que os fluxos do restante do grafo podem ser ajustados para que
isto acontea.

Considere agora a S A
5/3 7/4 3/1 10/1 3/0
s t
a b c d

48
de um grafo G (no representado acima). Ento podemos aumentar o fluxo no caminho s - a
- b - c de 2, pois as arestas possuem capacidade para tanto. Isto , a menor diferena c (e) -
f (e) no caminho 2:
2 { 3 { } 2
s
a b c

Em c, temos que reduzir o fluxo de d para c de 2, j que o fluxo b c foi aumentado
de 2. Como f (d, c) = 1, isto no possvel.
Ento voltamos SA e aumentamos o fluxo em s - a - b - c de 1. Agora f (d, c) diminui
de 1 e consequentemente f (d, t) aumenta de 1.
No caso geral, o fluxo em uma SA pode ser aumentado do menor entre os valores:
1. min (c (e) - f (e)) entre as arestas que apontam para t.
2. min f (e) entre as arestas que apontam para s.
Este valor maior que zero j que, por definio, c (e) - f (e) > 0 no caso 1 e f (e) > 0 no caso
2. Um exemplo real :
4/3

5/5 3/2 3/3
7/3 a 4/2 b 7/7
s t
4/3
6/5 1/1 6/3

5/5 c

onde existe uma seqncia aumentante s - a - b - c - t:

7/3 4/2 4/3 6/3
s t
a b c d


O mnimo das arestas t min (4, 2, 3) = 2
O mnimo das arestas s 3.

Ento o fluxo pode ser aumentado de 2 nesta SA:


49
4/3

5/5 3/2 3/3
7/5 a 4/4 b 7/7
s t
4/1
6/5 1/1 6/5

5/5 c

Observe que nenhum fluxo fora da SA alterado.

Teorema: Um fluxo f mximo se e somente se ele no admite nenhuma seqncia
aumentante.


11.1 Exerccios:

69. Maximize o fluxo do grafo abaixo.

4/3 1/1
s 8/2 t
3/3 1/1
3/1
4/4
fluxo mximo: 6


70. Encontre o fluxo mximo do grafo abaixo utilizando o teorema do corte.

2

5 3 7 5 1

6 2
4



71. Em uma rede, prove que a quantidade de fluxo que sai de s a mesma que chega em t.

72. Utilize o algoritmo de encontrar o fluxo mximo em uma rede para resolver o problema
de encontrar um emparelhamento mximo. Dica: acrescente dois vrtices, fonte e
sumidouro.

50
12 Mais Aplicaes Prticas de Teoria dos Grafos

12.1 Data-Flow

Em linguagens data-flow, qualquer instruo pode ser executada desde que os
valores que ela usa estejam disponveis. Por exemplo,

a) a = 2*b + c;
pode ser executado to logo b e c sejam inicializados.

b) if a > b then
pode ser executado to logo a e b sejam inicializados.

Dado um procedimento

procedure P (a, b : integer)
var c, d, e : integer;
begin
d = c*a;
e = d + 1;
c = a + b;
if a > c
then
writeln (e);
endif
end

podemos montar um grafo de dependncias entre as instrues:

c = a + b
d = c * a
if a > c
e = d + 1
true
false
writeln (e)
end


Uma instruo pode ser executada se e somente se todas as que apontam para ela
j o foram. Observe que podemos colocar as instrues no procedimento em qualquer
ordem.
51
Os caminhos do grafo que so independentes entre si podem ser executados em
paralelo, como

d = c*a
e = d + 1 e if a > c

Esta propriedade pode ser usada para compilar programas escritos em uma
linguagem seqencial (ex.: FORTRAN) para um computador paralelo. Os caminhos
independentes seriam executados por diferentes processadores.
As ordenaes topolgicas do grafo descrito acima fornecem as possveis
execues seqenciais do programa. Lembre-se de que podem existir (em geral existem)
diversas ordenaes topolgicas (OT) para um mesmo grafo.
Dentre estas OT, o compilador pode selecionar uma que seja mais fcil de otimizar.
Por exemplo, suponha que diversas instrues que utilizam a varivel i estejam espalhadas
por um procedimento:

'Ik' i : = 1;

'I
e
' a : = 2 * i + j;

'Im' b : = sqrt (i) + sqr (i);


Poderia haver uma OT tal que as instrues I
k
, I
e
e I
m
aparecessem juntas:

Ik Ie Im

Deste modo o compilador poderia colocar i em um registrador, o que aumentaria a
velocidade de execuo do programa. Se as instrues I
k
, I
e
, I
m
estiverem espalhadas pelo
procedimento (ou OT) e um registrador for associado a i, ento as instrues entre Ik, Ie, Im
no podero utilizar este registrador.

No cdigo

for i = 1 to n do
v [i] = w [i] * w [i] + 1;

h n caminhos independentes no grafo:

v [1] : = v [2] : = v[n] : =



O que significa que todos eles podem ser executados ao mesmo tempo. E em

for i = 1 to n do
52
v [i + 1] = v [i] + 1;
no h caminhos independentes, significando que paralelismo no possvel.
12.2 Make

O programa make do Unix toma como entrada um arquivo texto contendo comandos
da forma

Nome : d1 d2 dn
Comandos

Nome o nome de um arquivo que depende dos arquivos d
1
d
2
d
n
.
Make l este texto e executa Comandos se a data de ltima atualizao de algum
arquivo d
i
for mais nova que de Nome. Ou seja, se algum d
i
for mais novo que Nome, ele
executa Comandos, que so comandos para o Unix que possivelmente devero atualizar
arquivo Nome. Ex.:

prog : a.obj b.obj c.obj
ln -o prog a.obj b.obj c.obj
a.obj : a.c prog.h
cc -c a.c
b.obj : b.c prog.h
cc -c b.c
c.obj : c.c
cc -c c .c

ln o linker e cc o compilador. Se, por exemplo, b.c for modificado, make ir
compil-lo novamente (Comando "cc -c b.c"), porque ele ser mais novo que "b.obj".
Ento "b.obj" ser mais novo que prog que ser linkado por "ln -o prog a.obj
b.obj c.obj ".
As relaes de dependncias do make pode ser colocada em forma de um grafo.
12.3 Eliminao de Cdigo Morto

Podemos representar um procedimento como um grafo onde as instrues so
vrtices e existe aresta dirigida de v para w se w executado aps v (ou pode ser
executado, no caso de ifs e whiles). A funo

void f(
{
if (i > 0)
{
j = 1;
goto L1;
a = 10;
}
else
j = 10;
return 1;
L1;
53
}
seria transformada no grafo


if (i > 0)
j = 1 j = 10
goto L
1

a = 10
return 1
L
1

fim da funo


Para descobrir o cdigo morto, fazemos uma busca a partir da primeira instruo do
procedimento marcando todos os vrtices visitados. As instrues correspondentes aos
vrtices no visitados nunca sero executados e podem ser removidos pelo compilador.
Note que com este mesmo grafo pode-se descobrir se a instruo return ser
executada por todos os caminhos que ligam o vrtice inicial ao vrtice "fim da funo". A
resposta para o grafo acima : no.
54
13 Compresso de Dados Algoritmo de Huffman

Problema: Temos um texto usando caracteres ASCII e queremos comprimi-lo para uma
seqncia menor de caracteres.

A tcnica que utilizaremos representar cada carter por uma seqncia de bits.
Ento tomaremos o texto original substituindo cada carter pela seqncia de bits
correspondente.
Como existe 128 caracteres ASCII, precisamos de 7 bits para cada carter se
representarmos todos eles usando o mesmo nmero de bits.
O algoritmo de Huffman representa os caracteres que aparecem mais no texto por
uma seqncia menor e os que aparecem mais por uma seqncia maior. Assim ele
comprime o texto. Ex.:

Comprimir DABAABCAA assumindo que s usamos caracteres A, B, C e D.
A 1
B 00
C 010
D 011

DABAABCAA 011100110001000 15 bits

Se representssemos cada carter com 2 bits (A = 00, B = 01, C = 10, D = 11)
usaramos 9 2 = 18 bits.
Poderia haver ambigidades na representao. Por exemplo, se A = 1 e B = 10, no
saberamos se 1010 AC ou BB.
Em geral, o cdigo de um carter no pode ser prefixo de outro.

x x x x x x x x
A
B

Esta restrio implica que colocar menos bits para alguns caracteres significa mais
bits para outros.
A compresso de dados utilizando esta tcnica implica em encontrar uma relao
caracteres/bits que satisfaa a restrio de prefixos e que minimize o nmero total de bits
para codificar o texto.

Para saber que caracteres aparecem mais ou menos no texto, calculamos
inicialmente a freqncia de cada carter. Assuma que, em um texto F, os caracteres c
1
, c
2
,
c
n
aparecem com freqncias f
1
, f
2
, f
n
. Uma codificao E associa cada c
i
a uma string
Si de bits cujo tamanho si . O nosso objetivo encontrar codificao E que satisfaa a
restrio de prefixo e minimize
n
L (E, F) = s
i
. f
i
i=1


55
que o tamanho do texto comprimido. No exemplo anterior, E = { (A, 1), (B, 00), (C, 010), (D,
011) } e s
1
= 1, s
2
= 2, s
3
= 3, s
4
= 3 e L (E, F) = 5 . 1 + 2 . 2 + 1 . 3 + 1 . 3 = 15

Considere uma rvore binria dirigida em que cada vrtice possui grau de sada 0 ou
2 e as arestas da esquerda e direita esto associados os nmeros 0 e 1, respectivamente:

0 1

0 1 1
A

00
B 0 1

010 011
C D


Associamos as folhas aos caracteres e a seqncia de bits da raiz at a folha como
a codificao do carter. Para decodificar um texto codificado, percorremos a rvore at
encontrar o 1. carter. Depois fazemos outra busca para o 2. carter e assim por diante.
Observe que, como os caracteres so folhas, a restrio de prefixo obedecida.
Uma seqncia de bits s poderia ser prefixo de outra se o carter correspondente
estivesse no meio da rvore:

0 1 A = 1
B B = 0
0 1 0 C = 00
A D = 01

C D


Agora temos que construir uma rvore que minimize L (E, F). Usamos induo finita
para reduzir o problema de n para n - 1 caracteres. O caso base n = 2 e trivial.

HI: Sabemos como construir a rvore descrita acima para n - 1 caracteres.

Para resolver o problema, tomaremos n caracteres e combinaremos 2 deles em um
n, resultado em n - 1 caracteres. Aplicamos a HI para n - 1 obtendo uma rvore na qual os
dois caracteres combinados so introduzidos:

56

0 1
reintroduzindo
0 os 2 caracteres

c 0 1
obtido p / n - 1
c = caracteres c
1
c
2
combinados


Os caracteres a serem combinados (c1 e c2) so os ns com menor freqncia. Ns
podemos assumir que c
1
e c
2
so filhos de um mesmo vrtice porque cada vrtice possui
um ou dois filhos.

Obs.: No provamos que a rvore obtida desta forma minimiza L (E,F).

Como exemplo, codificaremos DABAABCAA, onde as seqncias so A = 5, B = 2,
C = 1, D = 1.
Combinando C e D, obtemos X com freqncia 2 {A = 5 / B = 2 / X = 2 }. Combinando B e X,
obtemos Y com freqncia 4 {A = 5 / Y = 4 }. Este o caso base, que resulta na rvore

0 1

Y A


Desdobrando Y, temos

0 1

0 1 A

B X


Desdobrando X, temos

0 1

0 1

B 0 1

C D


Ento, A = 1, B = 00, C = 010, D = 011

DABAABCAA = 011100110001011

57
Observe que este algoritmo no um algoritmo de grafos, embora o uso de grafos facilite a
sua compreenso.
58
14 rvore de Espalhamento de Custo Mnimo

Uma rvore de espalhamento de um grafo G uma rvore contendo todos os vrtices
de G. Para um dado grafo, podem existir vrias rvores de espalhamento diferentes. Se
associarmos um peso a cada aresta, uma destas rvores ter um custo menor do que as
outras.
2
Esta seo apresenta um algoritmo que encontra a rvore de espalhamento de
custo mnimo (AECM) de um grafo. Note que, dentre todos os subgrafos conectados que
possuem todos os vrtices de G, o que possui custo mnimo uma rvore. Se tivesse um
ciclo, poderamos retirar a aresta de maior custo e continuaramos a ter um subgrafo
conectado, que ainda teria um custo menor.


b

2 4
a 3 d
G: 3 5
1
c
6 e

Para o grafo acima, teramos a AECM

b

2 4
d
3 1

c e



Para encontrar a AECM de um grafo G, usaremos a seguinte HI:

HI: Dado um grafo dirigido G = (V, E), ns sabemos como encontrar um subgrafo T de
G com K arestas tal que T uma rvore que um subgrafo da AECM de G.

Analisando a HI de uma perspectiva dinmica, ela comea com uma rvore T vazia e
vai acrescentando arestas nesta rvore at obter uma rvore que contm todos os vrtices
de G. Considerando o grafo

2
Naturalmente, o custo de uma rvore a soma dos custos de suas arestas.
59
b

2 4
a 3 d
3 5
1
c
6 e

os passos da execuo do algoritmo correspondente HI seriam:
b b

d 4 d
a a
1

c e c e
b b

2 4 d 2 4 d
a a 3
1 1

c e c e

O caso base para a HI K = 1. Ento precisamos escolher a primeira aresta a ser
colocada em T. Afirmamos que esta aresta a de custo mnimo dentre todas as arestas do
grafo. Para provar este ponto, suponha que tenhamos a AECM e ela no possui a aresta de
custo mnimo. Ento podemos acrescentar esta aresta AECM produzindo um ciclo.
Retirando uma outra aresta qualquer do ciclo, obtemos uma rvore que possui um custo
menor do que a AECM, o que contradiz a hiptese de que a AECM possui custo mnimo.
Logo, a suposio inicial de que a AECM no possui a aresta de custo mnimo est errada.

No caso geral, j encontramos uma rvore T que subgrafo da AECM e queremos
estender T de uma aresta. A unio de T com a nova aresta deve ser uma rvore e ser
subgrafo da AECM. O problema qual aresta escolher.
Sendo T um subgrafo da AECM, deve haver pelo menos uma aresta da AECM
ligando T a vrtice no em T:
AECM
T

esta
aresta existe

60
No caso geral, existe mais de uma aresta nesta situao. Seja Ek o conjunto de todas
as arestas ligando vrtices em T a vrtices fora de T. Afirmamos que a aresta de menor
custo de E
k
pertence AECM.
G

T
agora
G e no
AECM
E
k


Para provar este ponto, assuma que (v, w) a aresta de menor custo em Ek tal que v
T e w T.
v T G

2 w

Suponha que (v, w) AECM, temos a configurao

T
v
x w G
3


y


onde apenas as arestas da AECM so mostradas. Como a AECM contm todos os vrtices
do grafo, existe uma aresta ligando um vrtice de T a outro no em T. Suponha que esta
aresta seja (x, y), que diferente de (v, w) j que estamos admitindo que (v, w) AECM.
Existe um caminho entre v e w na AECM que contm (x, y), j que esta aresta conecta
T com G - T, v T, w G - T. Acrescentando (v, w) na AECM, criamos um ciclo formado pelo
caminho entre v e w e a aresta (v, w). Removendo a aresta (x, y) deste ciclo, a AECM
continua sendo uma rvore e possui custo menor que a anterior, pois o custo de (v, w)
menor do que (x, y), pois estamos admitindo que o custo de (v, w) o menor dentre todos os
custos de arestas ligando T a G - T (menor custo em Ek).
Acima ns admitimos que a aresta de menor custo em Ek no est na AECM e
encontramos uma contradio que a AECM no ter custo mnimo. Isto , acrescentando (v,
w) e retirando (x, y), encontramos uma rvore em um custo menor ainda.

61
Ento a suposio inicial de que (v, w), aresta de menor custo em Ek, no est na
AECM, est errada. Isto ,
(v, w) AECM

O algoritmo correspondente HI comea com T = { aresta de menor custo } e vai
acrescentando arestas a T at que T possua todos os vrtices do grafo. As arestas
acrescentadas so as de menor custo que ligam T a G - T.

Algorithm AECM( G (V, E) )

begin
T = aresta de G com menor custo
while T] < V] do
T = T U { aresta (v, w) de menor custo tal que v T e
w G - T }
return T;
end

Um exemplo completo mostrado a seguir.

8

9 7 1
5
10
4 2

3

8
T
9 7 1
5
10
4 2

3
acrescenta min (8, 10, 5, 2)

62
8
T
9 7 1
5
10
4 2

3
acrescenta min (8, 10, 7, 3)


8
T
9 1
7
5
10
4 2

3
acrescenta min (8, 7, 4)


8
T
9 7 1
5
10
4 2

3
acrescenta min (9, 7, 8)

a rvore resultante


1
7
4 2

3




63
14.1 Exerccios

73. (4) Prove ou mostre um contra-exemplo: A rvore de Espalhamento de Custo Mnimo de
um grafo G (V, E) possui as |V| - 1 arestas de menor custo de G.


74. (4) Encontre a AECM do grafo abaixo.

12
20
2 7 3
10 7
1
8


Mostre as rvores obtidas em cada passo do algoritmo.

75. (3) Prove que a aresta de menor custo em um grafo G pertence AECM de G.


64
15 Colorao

Seja G (V, E) um grafo e C = 'Ci 1< i < n' um conjunto de cores. Uma colorao de
G a atribuio de cores de C para todos os vrtices de G de tal forma que vrtices
adjacentes tenham cores diferentes. Ex.:
C = 'v (ermelho), a (zul), p (reto)'
v v

a p
p a


Uma K-colorao uma colorao que utiliza K cores.

Definio: O nmero cromtico de um grafo G, indicado por X (G), o menor nmero de
cores K para o qual existe uma K - colorao de G.

No grafo acima, X (G) = 3, pois o tringulo

v
a p


impede que X (G) seja 2.

Um grafo completo de n vrtices, tambm conhecido por K
n
necessita de n cores, j
que cada vrtice est ligado a todos os outros:

1 1
3
2 3 2
4


Ento, X (K
n
) = n. Obviamente, se um grafo G possuir K
n
como subgrafo, ento X (G) X
(K
n
) ou X (G) n.

Um grafo bipartido pode ser dividido em dois conjuntos U e V tal que no existam
arestas dentro de cada conjunto:
U

V K
n
)


65
Ento, todo grafo bipartido pode ser colorido com apenas duas cores.

O Problema das Quatro Cores: Dado um mapa qualquer (no plano), podemos colori -lo com
apenas quatro cores? Por colorir queremos dizer que regies adjacentes so coloridas com
cores diferentes:

4
3 2
1 1 3
2

De fato, quatro cores podem colorir qualquer mapa no plano, o que conhecido por
cartgrafos a sculos. Contudo, este teorema s foi provado em 1976 usando teoria dos
grafos e um computador.
Este problema pode ser transformado em um problema de grafos associando-se
cada regio a um vrtice. Existe uma aresta entre dois vrtices se as duas regies
correspondentes forem adjacentes (fazem fronteira) no mapa. Por exemplo, o mapa da
esquerda transformado no grafo da direita.

1 4 1 4
5
2 3 5

2 3


O problema agora provar que qualquer grafo construdo desta forma pode ser
colorido com no mximo quatro cores.
Todo grafo obtido de um mapa planar. Se no fosse, haveria fronteira entre duas
regies que no fazem fronteira no plano seria uma fronteira no espao. Veja figura
abaixo, onde a ligao preta indica uma ponte acima do papel.

66
Lembre-se de que um grafo no planar pode ser colocado em um plano desde que
algumas arestas liguem alguns vrtices no espao:

K
5


a aresta pontilhada uma aresta no espao.

15.1 Exerccios

76. O grafo da figura abaixo mostra o mapa rodovirio de um pas. Os vrtices representam
cidades e os arcos, estradas. Em cada cidade, o governo espera construir uma das
seguintes obras: um teatro, um centro de esportes, uma piscina. Isto , apenas uma e
sempre uma obra em cada cidade. Decidiu-se que duas cidades ligadas por uma estrada
no devem possuir obras semelhantes. possvel atribuir obras a cidades de acordo com
essa restrio ? Que problema em teoria dos grafos equivalente a este ?



77. (4) Mapeie o problema abaixo para grafos, especificando precisamente o que vrtice,
aresta e qual seria o problema a ser resolvido. No se esquea de dizer os parmetros do
problema. Por exemplo, uma resposta poderia ser Encontre um clique com k vrtices.
Uma companhia manufatura os produtos qumicos C
1
, C
2
, C
n
. Alguns destes
produtos podem explodir se colocados em contato com outros. Como precauo
contra acidentes, a companhia quer construir k armazns para armazenar os
produtos qumicos de tal forma que produtos incompatveis fiquem em armazns
diferentes. Qual o menor nmero k de armazns que devem ser construdos?



67
16 Reduo de Algoritmos

Um problema (no algoritmo) P pode ser reduzido a um problema Q se, conhecido
um algoritmo para Q, ento podemos encontrar um algoritmo para P. Indicaremos que P
pode ser reduzido a Q por
P Q


a direo da flecha indica para onde a soluo vai.
O problema encontre o maior elemento de um vetor pode ser reduzido a ordene um
vetor. Aps ordenar o vetor, podemos simplesmente pegar o ltimo elemento, que o
maior.
Note que a transformao do resultado de ordene um vetor para encontre o
maior feito em tempo O (1).
O problema de multiplicar duas matrizes A e B pode ser reduzido ao problema de
elevar uma matriz ao quadrado usando a seguinte frmula:
|O B`
2
|O B` |O B` |BA O`
.A O, .A O, .A O, .O AB,


Tendo A e B, construmos a matriz |O B` e invocamos o algoritmo
.A O,
SQR (X) que retorna X
2
. Do resultado tomamos BA e AB. Concluso: A complexidade da
multiplicao de matrizes no maior do que a complexidade do problema Eleve matriz X
ao quadrado. Isto , tendo disponvel um algoritmo para elevar uma matriz ao quadrado,
podemos obter um algoritmo para multiplicar matrizes com a mesma complexidade.

O problema da ordenao dos nmeros X1, X2, Xn pode ser reduzido
compresso de dados pelo mtodo de Huffman da seguinte forma:
Para isto, construa a rvore de Huffman para 2
X1
, 2
X2
2
Xn
. Pelo algoritmo, a rvore ter a
forma


256 exemplo
32
16
2 1


Os nmeros ordenados podem ser obtidos em tempo linear (O (n)) percorrendo-se a
rvore.
Deste ponto em diante ns estudaremos apenas os problemas que retornam apenas
sim ou no. A maioria dos problemas pode ser facilmente convertida para este tipo de
problema.

Definio: Um problema P polinomialmente redutvel a Q se possvel transformar a
entrada de P em entrada para Q em tempo polinomial e Q retorna sim (ou no) se e
somente se P retorna sim (ou no) com a mesma entrada. Isto , a resposta dada por Q
pode ser usada como a resposta para P.
68
resposta sim / no
P Q
entrada convertida
em tempo polinomial


Se a converso da entrada de P para Q tomar tempo O (f (n)) e o algoritmo para Q
possuir complexidade O(g(n)), ento o algoritmo para P dado pela reduo possui
complexidade
O(f(n)) + O(g(n)) = O(f(n) + g(n))
Em particular, se g (n) for exponencial, O(f(n) + g (n)) ser O (g (n)). Se g(n) for polinomial, o
algoritmo para P dado pela reduo tambm ser polinomial. Exemplos:

O(n
3
+ 2
n
) = O (2
n
)
O(n
2
+ n) = O(n
2
)

P e Q so polinomialmente equivalentes se cada um pode ser reduzido ao outro em
tempo polinomial. Todos os problemas que podem ser resolvidos em tempo polinomial so
equivalentes polinomialmente entre si (PROVE !).

A classe de todos os Problemas que podem ser resolvidos em tempo polinomial
chamada de P. A classe dos problemas para os quais uma dada soluo pode ser
conferida em tempo polinomial chamada de NP.
Por exemplo, o problema ordene um vetor pertence a NP por que, dado um vetor
(supostamente ordenado), podemos conferir se ele est mesmo ordenado em tempo O (n).
O problema encontre um subgrafo completo em um grafo G pertence a NP.





subgrafo encontrado


Dado o subgrafo encontrado, podemos facilmente descobrir se ele completo.
Aparentemente, a classe NP possui problemas muito mais difceis que a P, j que para um
problema pertencer a NP temos apenas que conferir uma dada soluo em tempo
polinomial, enquanto que em P precisamos resolver o problema em tempo polinomial.
Voltaremos a esta questo adiante.

16.1 Problema da Satisfabilidade

Uma expresso booleana S estar na forma normal conjuntiva (FNC) se ela for o
produto de sub-expresses que so somas.
Produto "e" lgico e soma "ou" lgico. Exemplo:
69
_ _ _ _ _
S = (a + b + c) (a + b + c) (a + b + c)

Qualquer expresso booleana pode ser transformada em FNC. Uma expresso booleana S
satisfazvel se suas variveis podem receber valores 0 ou 1 de tal forma que S seja 1. No
exemplo acima, S satisfazvel: se a = 1, b = 1 e c = 0, ento S = 1.
O problema SAT determinar se dada expresso S satisfazvel ou no. Encontrar
os valores da variveis para os quais S = 1 no faz parte do problema SAT. Este problema
est claramente em NP porque, dados valores para as variveis, podemos facilmente
descobrir o valor de S. Se S for 1, ser satisfazvel.

Definio: Um problema X chamado de NP-completo se
1. X pertence a NP.
2. Cada problema em NP polinomialmente redutvel a X. Isto , com a
soluo para X temos a soluo para qualquer outro problema.


Teorema de Cook (1971): SAT NP - completo

Este um dos resultantes mais importantes da computao terica, seno o mais
importante. Ele implica que, se o problema SAT pode ser resolvido em tempo polinomial,
todos os outros problemas NP-completos o sero. Como exemplo, considere que X1 NP-
completo, como mostra a figura:

Y
2
W
2

SAT X
1
X
2
Y
1
W
1


Ento a complexidade de X1 igual complexidade do polinmio que transforma a entrada
de X1 para SAT mais a complexidade do SAT, que estamos assumindo ser polinomial.
Como O(polinmio) + O(polinmio) = O(polinmio), X
1
tambm polinomial. Ento, se SAT
puder ser resolvido em tempo polinomial, todos os problemas em NP tambm podero,
implicando P = NP. Infelizmente, ningum conseguiu ainda provar que SAT pode ou no ser
resolvido em tempo polinomial. Isto , ningum sabe se P = NP ou P NP, embora ningum
acredite que P = NP.
Em 1972, Richard Karp descobriu outros 24 problemas NP-completo. A lista hoje
contm 4000 problemas. Se uma soluo polinomial for encontrada para um deles,
automaticamente teremos a soluo polinomial para todos os demais. Se algum provar
que um desses problemas no pode ser resolvido em tempo polinomial, nenhum deles
poder.
Todos os problemas NP-completo so polinomialmente equivalentes entre si, o que
indica que eles tm uma estrutura em comum.

Definio: Clique de um grafo um subgrafo completo deste grafo.

70
O problema do clique : determine se o grafo contm um clique de tamanho K. Clique
NP - completo, pois SAT redutvel ao problema do clique:

Y
2
W
2

SAT X
1
X
2
Y
1
clique


Dado um problema qualquer em NP, digamos X1, podemos reduzi-lo a SAT e ento
reduzir SAT ao problema do clique. Resolvendo clique, resolvemos X
1
. Ento, qualquer
problema em NP redutvel ao clique.
Em uma figura, como a acima, representando relaes de reduo, um problema X
ser NP-completo se existir um caminho de X para SAT. Como X tambm pertence a NP,
existir seta de SAT para X, pois qualquer problema em NP pode ser reduzido a SAT. Em
geral, no se prova que SAT redutvel a um problema X, mas sim que algum problema NP-
completo redutvel a X. No desenho abaixo mostrando as relaes de reduo, suponha
que foi provado que clique redutvel a A. Como o problema do clique NP-completo, A
tambm o .

Y
2
W
2

SAT X
1
X
2
Y
1

clique
A
C
B NP - completo

Observe que todos os problemas NP - completo so polinomialmente equivalentes,
pois um pode ser reduzido a outro em tempo polinomial. Dados dois problemas NP-
completo X e Y, existe sempre um caminho de X para Y e outro de Y para X, pelo menos um
deles passando por SAT. Por exemplo, podemos usar a soluo de A para resolver C
usando o caminho A clique SAT C.
16.2 Exerccios


78. (3) Dados os problemas

71
(a) Dado um vetor de elementos x1, x2, xn, encontre um elemento x dentre eles tal que x
maior ou igual que n/2 elementos.

(b) Ordene o vetor descrito em (a).

(c) Encontre o menor e o maior elementos do vetor.

Reduza:

(a) a (b).

(a) a (c).

(c) a (b).

79. (5) Assuma que um problema P polinomialmente redutvel a Q e:

(a) A Entrada de P pode ser transformada em entrada para Q em tempo O (n log n).

(b) Um algoritmo AQ que resolve o problema Q pode ser Executado em tempo O (n
2
).

Explique como podemos fazer um algoritmo para P usando AQ. Qual a complexidade deste
algoritmo ?

80. (5) Um problema P toma um vetor de n inteiros qualquer como entrada e no
conhecemos nenhum algoritmo para resolv-lo. Contudo, descobrimos que P pode ser
reduzido a um problema Q, que tem como entrada um vetor ordenado de inteiros. Admitindo
que exista um procedimento
procedure ProcQ (vet, n) : boolean;
que resolva o problema Q, faa um procedimento ProcP para resolver o problema P. Admita
a existncia de um procedimento Ordene (vet, n) que ordena vetor vet de n inteiros.
Qual a complexidade de ProcP se a de ProcQ :

O (n
2
) ?

O (n) ?

O (2
n
) ?

81. (5) Assumindo que N e NP so conjuntos, qual a relao entre eles (, =, , etc) ?

82. (1) A expresso

S = (a + b) (a + b + c) (a + b + c) c

satisfazvel?

83. (2) Quais dos problemas abaixo pertencem a NP ?

(a) Encontrar um elemento em um vetor que maior do que todos os outros.
72

(b) Associar cores aos vrtices de um grafo de tal forma que dois vrtices adjacentes
possuam cores diferentes.

(c) Encontrar a AECM de um grafo.

(d) Encontrar um caminho hamiltoniano de um grafo.

84. (5) Sejam A e B dois problemas NP-completos e P(n) o polinmio que a complexidade
da converso da entrada de A para B. Se algum encontrar um algoritmo de complexidade f
(n) para resolver B, ento, aplicando a reduo, teremos um algoritmo de complexidade f (n)
+ P (n) para A. Isto :
Complex (Alg. A) = P (n) + f (n)
Suponha que:

(a) f (n) polinomial. Podemos afirmar que existe algoritmo para A com
complexidade polinomial ? Se existe, mostre-o!

(b) f (n) exponencial. Podemos afirmar que existe algoritmo para A com
complexidade exponencial ?

(c) f (n) exponencial. Podemos afirmar que no exise algoritmo para A com
complexidade polinomial ?

85. (3) Suponha que SAT no seja NP-completo. Como poderamos provar que o problema
do clique NP-completo ?

86.. (50) Suponha que todos os problemas NP existentes estejam representados na Figura
abaixo.

Y
O (n
3
) O (n)
W O (n
2
)
X
SAT
O (n
2
)
O (n) O (n
2
log n)
K O (n) S



Uma seta de Q para P indica que P pode ser reduzido a Q. A seta em linhas
pontilhadas mostra a complexidade da transformao da entrada de P para a entrada de Q.
Baseado nesta Figura, responda:

(a) Se for encontrado um algoritmo de complexidade O(n
2
) para resolver SAT, qual a
complexidade dos algoritmos para resolver cada um dos problemas acima se estes
algoritmos forem obtidos pela reduo dos problemas a SAT ?
73

(b) Se for encontrado um algoritmo de complexidade O(n
2
) para resolver R, qual a
complexidade dos algoritmos para resolver cada um dos problemas acima se estes
algoritmos forem obtidos pela reduo dos problemas a R ?

(c) Se um algoritmo para S tiver complexidade O(n
2
), qual seria a complexidade de um
algoritmo para R obtido pela reduo a S ?

(d) Explique porque R e S so NP-completos.

Potrebbero piacerti anche