Você está na página 1de 71

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................................................................................................................................4
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 Uma Propriedade da Busca em Profundidade.........................................................................................................29
7.3 Caminhos..................................................................................................................................................................30
7.4 Exerccios.................................................................................................................................................................32
8 Menor Caminho entre Vrtices.......................................................................................................................................34
9 Planaridade......................................................................................................................................................................37
9.1 Exerccios.................................................................................................................................................................40
10 Emparelhamento ..........................................................................................................................................................41
10.1 Exerccios...............................................................................................................................................................44
11 Fluxo em Redes.............................................................................................................................................................45
11.1 Exerccios:..............................................................................................................................................................48
12 Mais Aplicaes Prticas de Teoria dos Grafos............................................................................................................49
12.1 Data-Flow...............................................................................................................................................................49
12.2 Make.......................................................................................................................................................................51
12.3 Eliminao de Cdigo Morto.................................................................................................................................51
13 Compresso de Dados Algoritmo de Huffman........................................................................................................53
14 rvore de Espalhamento de Custo Mnimo..................................................................................................................56
14.1 Exerccios...............................................................................................................................................................61
15 Colorao.......................................................................................................................................................................62
15.1 Exerccios...............................................................................................................................................................64
16 Reduo de Algoritmos.................................................................................................................................................65
16.1 Problema da Satisfabilidade...................................................................................................................................66
16.2 Exerccios .............................................................................................................................................................68
1
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 v
1
= v
n
, como b, c, d, e, f, d, b.
a b e

d
c f
2
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 K
n
. 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 V
1
e
V
2
tal que toda aresta de G une um vrtices de V
1
a outro de V
2
. Exemplos:


K
2, 3
K
3, 3
3
Um grafo bipartido completo (GBC) possui uma aresta ligando cada vrtice de V
1
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 G
1
= (V
1
, E
1
) e G
2
= (V
2
, E
2
), dizemos que G
1
isomorfo a G
2
se e somente se existe uma funo f: V
1
V
2
tal que (v, w) E
1
se (f (v), f (w)) E
2
,
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.
1.3 Aplicaes de Teoria dos Grafos
4
Nos itens abaixo so detalhados alguns problemas que podem ser resolvidos
utilizando teoria dos grafos.
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.
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
Um vendedor deve passar por vrias cidades e retornar ao ponto inicial. Qual o trajeto
de menor distncia possvel ?
Qual a menor distncia entre duas cidades a e c ?
b
300 200
a 100 c
50 20

30 70
Como ir da cidade "a" a "c" passando pelo nmero mnimo de cidades?
Quantas cores so necessrias para colorir um mapa no plano?
5
B
B
C D C D
A
A
E
E
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.
Algorithm DFS(G, v)
6
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
marque v
coloque v no fim da fila F
7
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.
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.
8
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
9 Faa um algoritmo que particione um grafo G em seus componentes conexos G
1
, G
2
,
G
n
.
10 Faa DFS e BFS nos grafos abaixo, comeando em v.
9
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:
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.
10
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.
11
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 (log
2
n) = O (log
10
n) = O (log n)
O (3n) = O (5n + 7) = O (n)
O (a
r
n
k
+ a
k - 1
n
k - 1
+ + a
1
n + a
0
) = 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. No interessa quantas vezes (um, dois, ), desde que seja um nmero que
12
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 que n/2 elementos < . Ou seja, a probabilidade de que ou x ou y seja maior
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.
13
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.
14
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
)
15
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 S
n
= 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
S
n
= S
n-1
+ n
ento
S
n
= (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.
1 m 1 . n = m
2 . n n - 1
16
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 P
0
(x) = a
0
que trivial. Para calcular P
n
(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
begin
if a' == a
0
17
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 P
n
usando Q
n - 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.
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:
18
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.
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:
19
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.
20
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 = (a
ij
) n n tal que a
ij
= 1 se (v
i
, v
j
)

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
ij
), |E| x |E|, como:
s
ij
= 1 se as arestas c
i
e c
j
so incidentes
s
ij
= 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.
21
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.
22
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 G
1
e G
2
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.
23
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
d
1
+ d
2
+ ... + d
n
= 2n - 2
Prove que existe uma rvore com n vrtices cujos graus so d
1
, d
2
, ... d
n
.
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.
24
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|).
Lema 1: Um grafo acclico dirigido sempre contm um vrtice com grau de entrada 0, isto
, um vrtice sem dependncias.
25
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.
26
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;
27
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.
28
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.
2. z no visitado pois, a partir de v, visitamos outros vrtices que visitaram z:
29
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 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
30
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 G
1
, G
k
.
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 P
1
, P
2
, P
3
e P
4
. 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.
31
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.
51 No Unix possvel associar um outro nome a um arquivo ou diretrio j existente
atravs do utilitrio ln:
32
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 R
1
e B espera A liberar recurso R
2
.
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, a
ij
= 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
ij
)
2
, que o elemento a
ij
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.
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.
33
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 - V
k
e
encontrar o menor caminho de v a w.
O menor caminho de v a w s pode passar por vrtices de V
k
. 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
34
Ento w ligado a um elemento de V
k
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 V
k
. Ns tomaremos todos estes caminhos e
escolheremos o menor dentre eles. Deste modo podemos acrescentar um vrtice a V
k
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 V
1
= {v} e a cada passo adiciona a V
k
o vrtice w tal que
f(w) o menor valor dentre f (y), y G - V
k
. 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
35
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
36
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: k
5
e k
3,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, z
1
, z
2
, z
k
, w sendo k 0, onde os z
i
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:
G
1
b b
a d subdiviso
c de G
1
a d

c
37
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.:
esfera
Torus
pneu
Nota: K
5
pode ser embebido no Torus:
38

K
3,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.
d
c
b
a
X

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

d (a, b)
(a, c)
39
9.1 Exerccios
64 Prove: Se G planar, qualquer subgrafo de G planar.
65 Prove que K
3, 3
no planar.
66 Desenhe um grafo no planar com oito vrtices com um nmero mnimo de arestas.
40
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)}
41
Um caminho alternante 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.:
VU
VU
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 parte dos algoritmos de teoria dos grafos so feitos desta forma: toma-se um
teorema e constri-se um algoritmo baseado nele.
42
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:
43
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.
44
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
Teorema: O valor do fluxo mximo em uma rede igual capacidade do corte de menor
capacidade.
45
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 e
1
, e
2
e e
5
.
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 e
3
e diminuir de 1 em e
4
:
(3 + 1) + (1 - 1) = f
1
+ f
2
= 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
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:
46
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:
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.
47
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.

48
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.
49
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:
'I
k
) i : = 1;

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

'I
m
) b : = sqrt (i) + sqr (i);

Poderia haver uma OT tal que as instrues I


k
, I
e
e I
m
aparecessem juntas:
I
k
I
e
I
m

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
I
k
, I
e
, I
m
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
v [i + 1] = v [i] + 1;
no h caminhos independentes, significando que paralelismo no possvel.
50
12.2 Make
O programa make do Unix toma como entrada um arquivo texto contendo
comandos da forma
Nome : d
1
d
2
d
n

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;
}
seria transformada no grafo
51
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.
52
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 S
i
de bits cujo tamanho s
i
. O nosso objetivo encontrar codificao E que
satisfaa a restrio de prefixo e minimize

n
L (E, F) = s
i
. f
i
i=1
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
53
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:
54

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 (c
1
e c
2
) 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
Observe que este algoritmo no um algoritmo de grafos, embora o uso de grafos facilite
a sua compreenso.
55
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.
56
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
57
No caso geral, existe mais de uma aresta nesta situao. Seja E
k
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 E
k
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 E
k
).
Acima ns admitimos que a aresta de menor custo em E
k
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.
58
Ento a suposio inicial de que (v, w), aresta de menor custo em E
k
, 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 T1 < V1 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)

59
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
60
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.
61
15 Colorao
Seja G (V, E) um grafo e C = 'C
i
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
)
Ento, todo grafo bipartido pode ser colorido com apenas duas cores.
62
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.
Lembre-se de que um grafo no planar pode ser colocado em um plano desde que
algumas arestas liguem alguns vrtices no espao:
63

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?
64
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 X
1
, X
2
, X
n
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.
65
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:
_ _ _ _ _
66
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 X
1

NP-completo, como mostra a figura:
Y
2
W
2

SAT X
1
X
2
Y
1
W
1
Ento a complexidade de X
1
igual complexidade do polinmio que transforma a
entrada de X
1
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.
O problema do clique : determine se o grafo contm um clique de tamanho K. Clique
NP - completo, pois SAT redutvel ao problema do clique:
67
Y
2
W
2

SAT X
1
X
2
Y
1
clique
Dado um problema qualquer em NP, digamos X
1
, 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
(a) Dado um vetor de elementos x
1
, x
2
, x
n
, encontre um elemento x dentre eles tal que x
maior ou igual que n/2 elementos.
(b) Ordene o vetor descrito em (a).
68
(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.
(b) Associar cores aos vrtices de um grafo de tal forma que dois vrtices
adjacentes possuam cores diferentes.
69
(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 ?
(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 ?
70
(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.
71

Você também pode gostar