aleph0.info...sum ario 1 conceitos b asicos 7 1.1 grafosoes|c~iniciaisde ni . . . . . . . . . . . ....
TRANSCRIPT
Teoria dos Grafos
Uma breve introduc~ao com algoritmos
Jair Donadelli1
ultima revisao, 24 de agosto de 2010
1A vers~ao eletronica desse texto contem hyperlinks que ilustram a discuss~ao de alguns topicos da disci-
plina. Eu tomei o cuidado de fazer ligac~oes com paginas WEB que tinham, no momento que z o acesso,
informac~oes corretas, entretanto essas paginas est~ao fora do meu controle e podem sofrer alterac~oes, portanto
leia com cautela.
2
Sumario
1 Conceitos Basicos 7
1.1 Grafos | denic~oes iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1 Grau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2 Subgrafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.1 Clique e conjunto independente . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2.2 Grafo bipartido e corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.3 Teorema de Mantel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 Isomorsmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.4 Outras noc~oes de grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5 Representac~ao computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.1 Listas de adjacencias de G . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.2 Matriz de adjacencias de G . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.5.3 Complexidade de algoritmos em grafos . . . . . . . . . . . . . . . . . . . . . . 20
1.6 Percursos em grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.6.1 Percurso generico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.7 Algoritmos de busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.7.1 Busca em Largura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.7.2 Busca em Profundidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2 Caminhos, circuitos e caminhos mınimos 29
2.1 Caminhos e circuitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2 Caminhos mnimos em grafos com pesos nas arestas . . . . . . . . . . . . . . . . . . 33
2.2.1 Algoritmo de Dijkstra para caminhos mnimos . . . . . . . . . . . . . . . . . 34
2.2.2 Algoritmo de FloydWarshall para caminhos mnimos . . . . . . . . . . . . . 38
3 Conexidade 41
3.1 Grafos conexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 Articulac~oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.2 Conexidade de grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2.1 Construc~ao de grafos k-conexos minimais . . . . . . . . . . . . . . . . . . . . 48
3.3 Grafos eulerianos e grafos hamiltonianos . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.1 Grafos eulerianos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.3.2 Grafos hamiltonianos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4 Arvores e Florestas 55
4.1 Arvores, denic~ao e caracterizac~ao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.2 Arvores geradoras de custo mnimo em grafos com pesos nas arestas . . . . . . . . . 57
4.2.1 Algoritmo de JarnkPrim para arvore geradora mnima . . . . . . . . . . . . 58
4.2.2 Algoritmo de Kruskal para arvore geradora mnima . . . . . . . . . . . . . . . 59
5 Emparelhamentos 63
5.1 Emparelhamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.2 Emparelhamentos e coberturas em grafos bipartidos . . . . . . . . . . . . . . . . . . 65
5.3 Algoritmo de Edmonds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
6 Grafos Dirigidos 71
6.1 Representac~ao computacional e Percurso . . . . . . . . . . . . . . . . . . . . . . . . . 71
6.2 Caminhos mnimos em grafos dirigidos com pesos nas arestas . . . . . . . . . . . . . 73
6.2.1 Algoritmo de BellmanFord . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6.3 Componentes fortemente conexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
4 SUMARIO
6.4 Fluxo em redes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
A Algoritmos e Estruturas de dados 87
A.1 Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.1.1 Correc~ao de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.2 Estruturas de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
A.2.1 Heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
A.2.2 Estruturas de dados para representar conjuntos disjuntos . . . . . . . . . . . 92
A.2.3 Estruturas de dados para representac~ao de conjuntos disjuntos . . . . . . . . 92Indice Remissivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Indice de Smbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
SUMARIO 5
Apresentacao
O primeiro registro bibliograco da Teoria dos Grafos tem como autor o ilustre matematico
Leonhard Euler, que em 1736 desceveu uma soluc~ao para os problema da pontes de Konigsberg.
\In 1736, Euler solved the problem known as the Seven Bridges of Konigsberg. The
city of Konigsberg, Prussia was set on the Pregel River, and included two large
islands which were connected to each other and the mainland by seven bridges.
The problem is to decide whether it is possible to follow a path that crosses each
bridge exactly once and returns to the starting point. It is not: there is no Eulerian
circuit. This solution is considered to be the rst theorem of graph theory"
Wikipedia (en.wikipedia.org/wiki/Leonhard Euler)
Mapa de Konigsberg em 1652.
Fonte: http://www.preussen-chronik.de/_/bild_jsp/key=bild_kathe2.html (domnio
publico)
O termo grafo foi cunhado por James Joseph Sylvester em 1878e o primeiro livro surgiu em
1936 escrito por Denes Konig, Theorie der endlichen und unendlichen Graphen.
Nos ultimos trinta anos a Matematica Discreta tem tido cada vez mais destaque na Matematica.
Isso se deve a grande variedade de aplicac~oes em problemas modernos como os algoritmos de busca
do Google e roteamento na internet, os quais s~ao modelados por uma estrutura discreta conhecida
como Grafo.
Essa imagem do Wikipedia e do Wikimedia Commons e devida ao usuario Matt Britt e esta disponvel em http:
//en.wikipedia.org/wiki/Image:Internet_map_1024.jpg?redirect=no sob a licensa Creative Commons Attribution
2.5
\Each line is drawn between two nodes, representing two IP addresses. The length
of the lines are indicative of the delay between those two nodes. This graph re-
presents less than 30% of the Class C networks reachable by the data collection
program in early 2005. Lines are color-coded according to their corresponding
RFC 1918 allocation as follows:
6 SUMARIO
Grafo da Internet em 2005.
Dark blue: net, ca, us
Green: com, org
Red: mil, gov, edu
Yellow: jp, cn, tw, au, de
Magenta: uk, it, pl, fr
Gold: br, kr, nl
White: unknown"
Em contraste com a sua origem recreativa, a moderna Teoria dos Grafos usa tecnicas sostica-
das com conex~oes profundas com outros ramos da Matematica, da Ciencia da Computac~ao e com
aplicac~oes numa variedade de outras areas como Fsica [11], Qumica [26], Biologia [5, 23, 24]. S~ao
conhecidas muitas aplicac~oes de grafos em disciplinas da Matematica como Teoria da Medida [20],
Teoria dos Grupos [22], Teoria de Codigos [25], Criptograa [16] e Complexidade Computacional
[10, 18, 27, 28]. Ainda, encontramos aplicac~oes em diversos problemas de interesse pratico como
SUMARIO 7
alocac~ao de registradores para otimizac~ao de codigo gerado por compiladores [4, 17], alocac~ao de
processos para processadores [8], alocac~ao de frequencia para radios moveis [14] e trafego aereo [2].
Dentre as aplicac~oes modernas, a teoria de redes complexas (grosso modo, grafos com estrutu-
ras n~ao-triviais) desempenha um papel importante em uma ampla variedade de disciplinas como
Sociologia e Epidemiologia (redes sociais), Biologia (redes de regulac~ao), Engenharia (redes de co-
municac~ao).
Na Biologia as aplicac~oes incluem, por exemplo, determinar o papel das protenas ou genes de
func~ao desconhecida. De um modo geral, tres classes de redes biomoleculares tem atrado mais
atenc~ao atualmente: redes metabolicas de reac~oes bioqumicas, redes de interac~ao proteica e as
redes de regulac~ao que descrevem as interac~oes entre os diferentes reguladores genes.
Sımbolos
N Denota o conjunto dos numeros naturais;
Z denota o conjunto dos numeros inteiros;
Q denota o conjunto dos numeros racionais;
R denota o conjunto dos numeros reais;
R+ denota o conjunto dos numeros reais positivos;
|X| denota a cardinalidade do conjunto X;
para X ⊆ V denotamos por X o complemento de X em V, isto e, o conjunto V \ X;
(V2
)denota o conjunto dos subconjuntos de V de cardinalidade 2(
V
2
)=X ⊆ V : |X| = 2
;
bxc = maxn ∈ Z : n ≤ x para todo x real;
lg(x) e a notac~ao para logaritmo na base 2;
para qualquer famlia de conjuntos A1, A2, . . . , Am
m⋃i=1
Ai = A1 ∪A2 ∪ · · · ∪Am;
denotamos por A4B a diferenca simetrica dos conjuntos A e B, isto e, A4B = (A∪B)\(A∩B);
Notac~ao assintotica : Sejam fn e gn sequencias de numeros reais, onde fn > 0 para todo
n sucientemente grande. Usaremos as seguintes notac~oes para o comportamento assintotico
dessas sequencias:
– gn = O(fn), quando n → ∞, se existem constantes positivas c ∈ R e n0 ∈ N tais que
|gn| ≤ cfn, para todo n ≥ n0;– gn = Ω(fn), quando n → ∞, se existem constantes positivas C ∈ R e n0 ∈ N tais que
gn ≥ Cfn, para todo n ≥ n0;– gn = Θ(fn), quando n→∞, se existem constantes positivas c, C ∈ R e n0 ∈ N tais que
Cfn ≤ gn ≤ cfn, para todo n ≥ n0;
8 SUMARIO
CAPıTULO 1
CONCEITOS BASICOS
Neste captulo introduzimos os conceitos mais basicos da Teoria dos Grafos dos pontos de vista
combinatorio e algortmico, tambem aqui convencionamos as notac~oes que ser~ao usadas por todo o
texto. Nas primeiras sec~oes, apresentamos a denic~ao de grafo e alguns parametros e aspectos estru-
turais de grafos. Os conceitos algortmicos aparecer~ao a partir da setima sec~ao onde representac~oes
de grafos apropriadas para tratar problemas computacionais s~ao apresentadas. O captulo termina
com um algoritmo para percorrer grafos e que serve como base para muitos outros algoritmos que
veremos nos captulos posteriores.
1.1 Grafos — definicoes iniciais
Um grafo e um par ordenado de conjuntos nitos (V, E) tal que E ⊆(V2
). Cada elemento de V
e chamado de vertice do grafo e cada elemento de E e chamado de aresta do grafo.
Todo grafo pode ser representado geometricamente por um diagrama. No plano, desenhamos
um ponto para cada vertice e um segmento de curva ligando cada par de vertices que determinam
uma aresta (gura 1.1). Claramente, a representac~ao geometrica de um grafo n~ao e unica, mas para
cada representac~ao existe um unico grafo.
Exemplo 1. Os conjuntos
V = 1, 2, 3, 4, 5, 6, 7, 8
E =1, 2, 1, 5, 2, 5, 3, 4, 6, 7
denem um grafo (V, E) e um diagrama desse grafo e apresentado na gura 1.1 a seguir.
2
4
7
8
13
5
6
Figura 1.1: Representac~ao geometrica (ou diagrama) do grafo.
Se G denota o grafo que e denido pelo par (V, E) ent~ao escrevemos G = (V,E).
Sejam u e v vertices de um grafo G; se u, v e uma aresta de G, ent~ao dizemos que u e v s~ao
vertices adjacentes, tambem dizemos que u e v s~ao extremos de uma aresta; dizemos que duas
arestas s~ao arestas adjacentes se elas tem um vertice em comum.
Quando nos referimos a um grafo conhecido G sem especicarmos o conjunto dos vertices e o con-
junto das arestas que denem G esses passam a ser referidos como V(G) e E(G), respectivamente.
Para um grafo G qualquer, chamamos |V(G)| de ordem de G e chamamos |V(G)| + |E(G)| de
tamanho de G, por exemplo, o grafo do exemplo 1 tem ordem 8 e tamanho 13. Um expoente em
G explicta a ordem de G, assim quando queremos ressaltar que G e um grafo de ordem n, para
algum n ∈ N, escrevemos Gn.
Chamamos G0 = (∅,∅) de grafo vazio e todo grafo de ordem 1 de grafo trivial.
10 Conceitos Basicos
1.1.1 Grau
Para um vertice v qualquer num grafo G, denimos os conjuntos
EG(v) =x, y ∈ E(G) : x = v ou y = v
, (1.1)
e
NG(v) =w ∈ V(G) : v,w ∈ E(G)
, (1.2)
esse ultimo chamado de vizinhanca de v. Os elementos de NG(v) s~ao chamados de vizinhos de v.
Para todo v ∈ V(G), o numero de vizinhos de v e chamado de grau do vertice v no grafo G.
Os graus dos vertices de um grafo formam um dos seus parametros importantes e por isso recebem
uma notac~ao especial. Para um grafo G = (V, E) n~ao-vazio
grau de u em G: dG(u) = |NG(u)| (1.3)
grau mınimo em G: δ(G) = mindG(u) : u ∈ V (1.4)
grau maximo em G: ∆(G) = maxdG(u) : u ∈ V (1.5)
grau medio em G: d(G) =1
|V |
∑u∈V
dG(u) (1.6)
Observac~ao 1. As vezes suprimimos osndices G ou os argumentos (G) para simplicar a notac~ao;
escrevemos, por exemplo, E(v) e N(v) para os conjuntos denidos acima, e escrevemos ∆ para o
grau maximo e d(v) para o grau de v. Fazemos isso sempre que n~ao ha ambiguidade, ou perigo de
confus~ao.
Exemplo 2. No exemplo 1 encontramos d(7) = |E(7)| = d(6) = |E(6)| = 1 e d(5) = |E(5)| = 2.
Tambem, o grau maximo e ∆(G) = 2, o grau mnimo e δ(G) = 0 e o grau medio e d(G) = 5/4 = 1, 25.
Teorema 1. Para todo grafo G vale que∑u∈V(G)
dG(u) = 2|E(G)|. (1.7)
Demonstrac~ao. Seja (V, E) em grafo e dena o conjunto X = (u, e) ∈ V×E : u ∈ e e vamos contar
seu numero de elementos de duas maneiras distintas.
Primeiro, cada vertice u participa de d(u) elementos de X, portanto
|X| =∑u∈V
d(u). (1.8)
Depois, cada aresta e esta presente em dois elementos de X, logo
|X| = 2|E|. (1.9)
De (1.8) e (1.9) temos (1.7).
Corolario 2. Em todo grafo o numero de vertices com grau mpar e par.
Demonstrac~ao. Seja G um grafo. Denote por I o subconjunto formado pelos vertices em V(G) de
grau mpar e denote por P o subconjunto dos vertices de grau par. Usando que I ∩ P = ∅ e que
I∪ P = V(G) podemos escrever∑u∈V dG(u) =
∑u∈I dG(u) +
∑v∈P dG(v), e do Teorema 1, temos
2|E(G)|︸ ︷︷ ︸par
=∑u∈I
dG(u) +∑v∈P
dG(v)︸ ︷︷ ︸par
, (1.10)
portanto devemos ter∑u∈I dG(u) par, o que semente e possvel quando |I| e par.
Grafos | denic~oes iniciais 11
Exercıcios
Exerccio 1. Um qumico deseja embarcar os produtos A,B,C,D, E, F, X usando o menor numero de
caixas. Alguns produtos n~ao podem ser colocados numa mesma caixa porque reagem. Os produtos
A,B,C, X reagem dois-a-dois; A reage com F e com D e vice-versa; E tambem reage com F e com
D e vice-versa. Descreva o grafo que modela essa situac~ao, mostre um diagrama desse grafo e use-o
para descobrir o menor numero de caixas necessarias para embarcar os produtos com seguranca.
Exerccio 2. Adaltina esperava as amigas Brandelina, Clodina, Dejaina e Edina para um lanche
em sua casa. Enquanto esperava preparou os lanches: Bauru, Misto quente, Misto frio e X-salada.
Brandelina gosta de Misto frio e de X-salada; Clodina de Bauru e X-salada; Dejaina gosta de Misto
quente e Misto frio; Edina gosta de de Bauru e Misto quente. Descreva o grafo que modela essa
situac~ao, mostre um diagrama desse grafo e use-o para descobrir se e possvel que cada amiga de
Adaltina tenha o lanche que gosta. Se e possvel, determine o numero de soluc~oes.
Exerccio 3. Dena todos os grafos sobre o conjunto de vertices 1, 2, 3, 4 e tamanho 6.
Exerccio 4. Para todo n ∈ N, qual e o numero maximo de arestas que pode ter um grafo com n
vertices?
Exerccio 5. O complemento de um grafo G, denotado por G, e o grafo que tem o mesmo conjunto
de vertices de G e dois vertices formam uma aresta em G se e somente se nao formam uma aresta
de G:
V(G) = V(G),
E(G) =
(V(G)
2
)\ E(G) =
u, v ⊂ V(G) : u, v 6∈ E(G)
.
De o complemento dos seguintes grafos
(i) G dado por
V(G) = 1, 2, 3, 4, 5,
E(G) = 1, 2, 1, 3, 1, 4, 1, 5, 2, 3, 2, 4, 2, 5, 3, 4, 3, 5, 4, 5.
(ii) H dado por
V(H) = 1, 2, 3, 4, 5, 6, 7,
E(H) = 1, 2, 1, 3, 2, 4, 2, 5, 3, 6, 3, 7.
(iii) B dado por
V(B) = a, b, c, 1, 2, 3,
E(B) = a, 1, a, 2, a, 3, b, 1, b, 2, b, 3, c, 1, c, 2, c, 3.
Exerccio 6. Dena a uniao dos grafos G e H por
G ∪H =(V(G) ∪ V(H), E(G) ∪ E(H)
).
A uni~ao G ∪H e um grafo?
Exerccio 7. Dena a interseccao dos grafos G e H por G ∩H =(V(G) ∩ V(H), E(G) ∩ E(H)
). A
intersecc~ao G ∩H e um grafo?
Exerccio 8. Um grafo e chamado de completo sobre V se todo par de vertices de V e uma aresta
do grafo, ou seja E =(V2
). Um grafo completo com n vertices e denotado por Kn. Prove que
G ∪G = Kn.
12 Conceitos Basicos
Exerccio 9. Considere o caso geral do exerccio 1: Um qumico deseja embarcar os produtos
p1, p2, . . . , pn usando o menor numero de caixas. Alguns produtos n~ao podem ser colocados numa
mesma caixa porque reagem. Seja G o grafo que modela esse problema, onde vertices s~ao produtos
e arestas os pares que reagem, e denote por χ(G) o numero de mnimo de caixas de modo que seja
possvel encaixotar os produtos com seguranca. Prove que
χ(G) ≤ 12+
√2m+
1
4
onde m e o numero de pares de produtos que reagem. (Dica: Em uma distribuic~ao mnima de
caixas, a cada duas caixas, precisa existir pelo menos um produto em uma caixa reagindo com um
produto da outra caixa. Assim podemos garantir um numero mnimo de arestas para o grafo, m.)
Exerccio 10. Chico e sua esposa foram a uma festa com tres outros casais. No encontro deles
houveram varios apertos de m~ao. Ninguem apertou a propria m~ao ou a m~ao da(o) esposa(o), e
ninguem apertou a m~ao da mesma pessoa mais que uma vez.
Apos os cumprimentos Chico perguntou para todos, inclusive para a esposa, quantas m~aos cada
um apertou e recebeu de cada pessoa uma resposta diferente. Quantas m~aos Chico apertou?
Exerccio 11. Prove que δ(G) ≤ d(G) ≤ ∆(G) para todo grafo G.
Exerccio 12. Decida se pode existir um grafo G com vertices que tem graus 2, 3, 3, 4, 4, 5, respec-
tivamente. E graus 2, 3, 4, 4, 5? Se sim, descreva-os.
Exerccio 13. Seja G um grafo com 14 vertices e 25 arestas. Se todo vertice de G tem grau 3 ou 5,
quantos vertices de grau 3 o grafo G possui?
Exerccio 14. Prove que existem pelo menos dois vertices com o mesmo grau em todo grafo de
ordem pelo menos dois. (Dica: comece por um caso pequeno, por exemplo ordem 3, antes de tentar
resolver o caso geral.)
Exerccio 15. Para um numero natural r, um grafo e r-regular se todos os vertices tem grau r.
Para um grafo r-regular com n vertices e m arestas, expresse m em func~ao de n e r.
Exerccio 16. De exemplo de um grafo 3-regular que n~ao e completo.
Exerccio 17. Dado G, o grafo linha de G, denotado por LG, e o grafo cujos vertices s~ao as
arestas de G e um par de vertices dene uma aresta em LG se, e somente se, esses vertices s~ao
arestas adjacentes em G. Dado G determine |V(LG)| e |E(LG)|.
1
2
3
4
5
646
12
35
23
34
25
56
G LG
Figura 1.2: Exemplo de um grafo e o respectivo grafo linha.
Exerccio 18. Determine χ(G) e χ(LG) para os grafos denidos pelos diagramas da gura 1.2, em
que χ e o parametro denido no exerccio 9.
Exerccio 19. Prove que num grafo G com δ(G) > 0 e |E(G)| < |V(G)| existem pelo menos dois
vertices de grau 1.
Subgrafos 13
1.2 Subgrafos
Dizemos que o grafo H e um subgrafo do grafo G se, e somente se, V(H) ⊆ V(G) e E(H) ⊆ E(G)e nesse caso escrevemos H ⊆ G para indicar que H e subgrafo de G.
Exemplo 3. Considerando o grafo G do exemplo 1 temos que
G ′ =(1, 2, 5
,1, 5, 5, 2, 1, 2
)e
G ′′ =(3, 5, 6
,∅)
s~ao subgrafos de G, enquanto que
H =(1, 2, 3
,1, 2, 3, 4
),
I =(1, 2, 3, 4, 9
,1, 2, 3, 4
)e
J =(1, 2, 3, 4, 8
,1, 2, 3, 4, 1, 8
)n~ao s~ao subgrafos de G pois: H n~ao e grafo, em I n~ao vale V(I) ⊆ V(G) e em J n~ao vale E(J) ⊆ E(G).
Dados um grafo G e um subconjunto de vertices U ⊆ V(G), escrevemos G[U] para o subgrafo
induzido por U que e o subgrafo
G[U] =
(U,E(G) ∩
(U
2
)).
Analogamente, denimos subgrafo induzido por um subconjunto de arestas. SeM = e1, e2, . . . , em ⊆E(G), ent~ao o subgrafo induzido por M, denotado G[M], tem como conjunto de vertices e1 ∪e2 ∪ · · · ∪ em e como conjunto de arestas o proprio M, ou seja,
G[M] =( m⋃i=1
ei,M).
Exemplo 4. Dos grafos G, H e I cujos diagramas s~ao dados na gura 1.3, podemos dizer que H e
um subgrafo induzido de G enquanto que I e um subgrafo mas n~ao e induzido.
G H I
a b
c
d e
a
d
b
e
a
d
c
b
e
Figura 1.3: Diagrama dos grafos G, H e I.
Um subgrafo H ⊆ G onde V(H) = V(G) e chamado de subgrafo gerador. No exemplo acima
I e subgrafo gerador de G, enquanto que H n~ao e subgrafo gerador de G.
1.2.1 Clique e conjunto independente
Se o subconjunto U ⊆ V(G) induz um subgrafo completo em G ent~ao chamamos U de clique
em G. Mais especicamente, se G[U] e um grafo completo com k vertices ent~ao dizemos que U e
um k-clique em G. O caso particular de um 3-clique num grafo G e chamado de triangulo de G.
Por outro lado, se U ⊆ V(G) e tal que G[U] = (U,∅) ent~ao U e chamado de conjunto inde-
pendente de G, ou k-conjunto-independente no caso |U| = k.
14 Conceitos Basicos
Exemplo 5. O subgrafo G ′ do exemplo 3 e um 3-clique e G ′′ do exemplo 3 e um 3-conjunto-
independente.
No grafo G do exemplo 1 os conjuntos 3, 5, 6 e 1, 4, 6, 8 s~ao independentes; no caso de 1, 4, 6, 8
temos um conjunto independente de cardinalidade maxima pois n~ao ha naquele grafo conjunto
independente com 5 ou mais vertices. Nesse mesmo grafo, 8, 6, 7 e 1, 2, 5 s~ao cliques, o ultimo
de cardinalidade maxima.
Observac~ao 2. O tamanho do maior clique e o tamanho do maior conjunto independente num grafo
G s~ao difceis de serem calculados computacionalmente. Eles pertencem a classe dos problemas NP-
difceis (veja [15], pagina 53). Uma consequencia desse fato e que n~ao e sabido se existe algoritmo que
resolve algum desses problemas cuja complexidade de tempo e um polinomio em |V(G)| + |E(G)|.
A descoberta de um algoritmo com complexidade de tempo polinomial no tamanho de G, ou a
prova de que ele n~ao existe, e um dos problemas n~ao-resolvidos mais importantes da atualidade, o
problema P × NP. Trata-se de um dos sete problemas do milenio [19], dos quais restam seis n~ao
resolvidos, cada um com uma recompensa de US$1.000.000,00 para uma soluc~ao, paga pelo Clay
Mathematics Institute.
1.2.2 Grafo bipartido e corte
Chamamos um grafo G de grafo bipartido se existem dois conjuntos independentes A e B em
G que particionam V(G), isto e, A e B s~ao tais que A ∩ B = ∅ e A ∪ B = V(G). Por exemplo, o
seguinte grafo e bipartido
V(G) = 1, 2, 3, 4, 5, 6, 7, 8
E(G) =1, 6, 6, 2, 3, 7, 3, 8, 7, 4, 7, 5
,
pois V(G) = 1, 2, 3, 4, 5 ∪ 6, 7, 8 e tanto 1, 2, 3, 4, 5 quanto 6, 7, 8 s~ao conjuntos independentes.
Notemos que a bipartic~ao pode n~ao ser unica, no caso do exemplo acima podemos escrever
V(G) = 6, 3, 4, 5∪ 1, 2, 7, 8 e tanto 6, 3, 4, 5 quanto 1, 2, 7, 8 s~ao conjuntos independentes. Para
evitar ambiguidades escrevemos um grafo bipartido G com bipartic~ao A,B como G = (A ∪B,E).
Sejam G um grafo, A e B ⊂ V(G) dois subconjuntos disjuntos em V(G). Denimos o subconjunto
de arestas
E(A,B) =u, v ∈ E(G) : u ∈ A e v ∈ B
; (1.11)
e o subgrafo bipartido induzido por A e B e o grafo bipartido(A ∪ B, E(A,B)
).
Observac~ao 3. Convencionamos que os grafos triviais e vazio s~ao grafos bipartidos.
Exemplo 6. A gura abaixo mostra as arestas de E(A,B) para A = 0, 1, 8 e B = 3, 4, 5, 6.
0
1
45
6
7
8
3
2
Figura 1.4: E(0, 1, 8, 3, 4, 5, 6
)e formado pelas arestas
0, 4, 0, 5, 1, 3, 1, 6, 8, 3, 6, 8
.
Subgrafos 15
O conjunto de arestas E(A,A) e chamado de corte definido por A. Da denic~ao de corte
podemos escrever
E(G) = E(G[A]) ∪ E(G[A]) ∪ E(A,A). (1.12)
Exemplo 7. A gura abaixo mostra as arestas de E(A,B) para A = 0, 1, 8 e B = 3, 4, 5, 6.
0
1
45
6
7
8
2
3
Figura 1.5: O corte denido pelo conjunto 0, 1, 2, 7, 8 e formado pelas arestas0, 4, 0, 5, 1, 3, 1, 6, 8, 3, 6, 8, 5, 7, 6, 7, 2, 3, 2, 4
.
1.2.3 Teorema de Mantel
Suponha que G = (V, E) e um grafo que n~ao contenha triangulo. Vamos determinar o numero
maximo de arestas que pode haver em G.
Seja A um conjunto independente em G de cardinalidade maxima. Como G n~ao contem
triangulos a vizinhanca de qualquer vertice e um conjunto independente, portanto temos
d(v) ≤ |A|, para todo v ∈ V. (1.13)
Como A e um conjunto independente em G podemos classicar as arestas de E(G) em dois tipos:
E1 s~ao as arestas de G que tem exatamente um dos extremos fora de A e E2 s~ao as arestas de G
que tem ambos extremos fora de A. Dessa forma, o numero de arestas em E e |E1|+ |E2| e∑u∈A
d(u) = |E1|+ 2|E2| ≥ |E|.
Usando (1.13) chegamos a ∑u∈A
d(u) ≤∑u∈A
|A| = |A||A|,
portanto |E| ≤ |A||A|. Usando a desigualdade entre as medias aritmetica e geometrica1
|A||A| = |A|(|V | \ |A|) ≤ |V |2
4. (1.14)
Assim, provamos o seguinte resultado que foi mostrado pela primeira vez por Mantel em 1906.
Teorema (Mantel, 1906). Se G e um grafo sem triangulos ent~ao |E(G)| ≤ |V(G)|2/4.
Esse teorema e um caso particular do famoso Teorema de Turan, que foi o princpio de um ramo
da teoria dos grafos chamada de Teoria Extremal de Grafos (veja mais sobre esse assunto em [3]).
1Desigualdade: (a1a2 · · ·an)1n ≤ a1+a2+···+an
n. O caso n = 2 e simples e pode ser derivado do fato de que
(a − b)2 ≥ 0.
16 Conceitos Basicos
Exercıcios
Exerccio 20. Quantos subgrafos tem o grafo(1, 2, 3, 4, 5, 6, 1, 2
)?
Exerccio 21. Quantos subgrafos completos tem o grafo completo de ordem n?
Exerccio 22. Sejam G um grafo e M ⊆ E(G). Tome o subconjunto U =⋃e∈M e de vertices de G.
Prove ou de um contra-exemplo para G[U] = G[M].
Exerccio 23. Descubra um subgrafo induzido de
V(G) = 1, 2, 3, 4, 5, 6, 7, 8 e
E(G) =1, 2, 1, 3, 2, 3, 2, 5, 3, 6, 8, 5, 8, 6, 5, 6, 3, 4, 5, 7
1-regular e com o maior numero possvel de arestas. (Qual a relac~ao com a resoluc~ao do exerccio
2?)
Exerccio 24. Mostre que em qualquer grafo G com pelo menos 6 vertices vale: ou G tem um
3-clique e G tem um 3-conjunto-independente, ou G tem um 3-conjunto-independente e G tem um
3-clique. (Dica: exerccio 8 e princpio da casa dos pombos sobre EK6(v), para algum vertice v.)
Exerccio 25. Dado um grafo G, denotamos por α(G) a cardinalidade do maior conjunto indepen-
dente em G,
α(G) = max|A| : A ⊂ V(G) e um conjunto independente
.
Prove que se d(G) > α(G) ent~ao G contem triangulo, para todo G.
Exerccio 26. Para todo grafo G, denotamos por ω(G) a cardinalidade do maior clique em G
ω(G) = max|A| : A ⊂ V(G) e um clique
.
Prove que ω(G) = α(G).
Exerccio 27. Demonstre que as desigualdades abaixo valem para todo grafo G
(i) α(G) ≥ |V(G)|/(∆(G) + 1);
(ii) α(G) ≤ |E(G)|/δ(G), se δ(G) 6= 0;
(iii) ω(G) ≤ ∆(G) + 1.
Exerccio 28. Suponha H ⊆ G. Prove ou refute as desigualdades:
(i) α(H) ≤ α(G);
(ii) α(G) ≤ α(H);
(iii) ω(G) ≤ ω(H);
(iv) ω(H) ≤ ω(G).
Exerccio 29. Seja G um grafo bipartido. Prove que todo subgrafo de G e bipartido.
Exerccio 30. Seja G = (A∪B, E) um grafo bipartido qualquer e suponha que |A| < |B|. E verdade
que α(G) = |B|? Determine ω(G).
Exerccio 31. Um grafo bipartido G com partes A e B e dito completo se
E(G) =a, b ⊆ V(G) : a ∈ A e b ∈ B
.
Um grafo bipartido completo sobre A,B com partes de cardinalidade |A| = n e |B| = m e denotado
por Kn,m. Determine |E(Kn,m)|.
Exerccio 32. Prove que todo grafo G tem um subgrafo bipartido H com |E(H)| ≥ |E(G)|/2.
Subgrafos 17
Exerccio 33. Prove que todo grafo G tem um subgrafo gerador bipartido H tal que dH(v) ≥dG(v)/2 para todo v ∈ V(G).
Exerccio 34. Prove a armac~ao da equac~ao (1.12).
Exerccio 35. Dado um grafo G, dena para todo U ⊆ V(G) a vizinhanca de U, denotada NG(U),
por
NG(U) =⋃u∈U
NG(u).
E verdade que |E(U,U)| = |NG(U)|? Justique.
Exerccio 36. Prove que para quaisquerU,W ⊆ V(G), ondeG e um grafo, vale que E(U4W,U4W) =
E(U,U)4E(W,W).
Exerccio 37. Prove que para todo G e todo U ⊂ V(G)∑u∈U
dG(u) = 2|E(G[U])|+ |E(U,U)|.
Exerccio 38. Um grafo G e dito k-partido, para k ∈ N, se existem k conjuntos independentes A1,
A2, . . . , Ak que particionam V(G), ou seja, V(G) = A1∪A2∪· · ·∪Ak, o conjunto Ai e um conjunto
independente em G para todo i ∈ 1, 2, . . . , k e Ai ∩ Aj = ∅ para quaisquer i e j distintos. Prove
que dentre os grafos k-partidos (k ≥ 2) completos com n vertices o numero maximo de arestas e
atingido quando |Ai|− |Aj| ≤ 1 para todos i, j ∈ 1, 2, . . . , n distintos.
Exerccio 39. Mostre que, se n = kq + r com 0 ≤ r < k, ent~ao o numero de arestas do grafo do
exerccio anterior e1
2
(k− 1
k
)(n2 − r2) +
(r
2
)e que esse numero e limitado por
≤ k− 1k
(n
2
).
Exerccio 40 (Teorema de Turan, 1941). Para todo k ≥ 2, se G tem n vertices e n~ao contem um
k-clique ent~ao
|E(G)| ≤ k− 2k− 1
n2
2.
Exerccio 41. Redena para todo grafo G o parametro χ(G) dado no exerccio 9 em func~ao dos
conjuntos independentes de G. Esse parametro de um grafo e conhecido na literatura como numero
cromatico2 do grafo (veja [9], captulo 5).
Exerccio 42. Prove que G e bipartido se e somente se χ(G) < 3.
Exerccio 43. Prove que as duas desigualdades dadas a seguir valem para todo grafo G com pelo
menos um vertice
ω(G) ≤ χ(G) (1.15)
χ(G) ≥ |V(G)|
α(G). (1.16)
Exerccio 44. Prove que todo grafo G satisfaz
χ(G) ≤ 1+ maxH⊆G
δ(H).
2Computar o numero cromatico e um problema NP-difcil [15].
18 Conceitos Basicos
1.3 Isomorfismo
Dizemos que os grafos G e H s~ao isomorfos e, nesse caso, escrevemos G ' H, se existe uma
func~ao bijetora
f : V(G)→ V(H) (1.17)
tal que
u, v ∈ E(G) se, e somente se, f(u), f(v) ∈ E(H) (1.18)
para todos u, v ∈ V(G). Uma func~ao f como acima e chamada de isomorfismo.
Exemplo 8 (Grafo de Petersen). Os grafos representados na gura 1.6 s~ao isomorfos pelo isomor-
smo f(1) = a, f(2) = b, f(3) = c, f(4) = d, f(5) = e, f(6) = f, f(7) = g, f(8) = h, f(9) = i,
f(10) = j. Esse grafo e chamado de grafo de Petersen, e um dos grafos mais conhecidos na Teoria
dos Grafos.
6
1
10 72
9 8
43
5
a
bjg
d i
c
f
he
Figura 1.6: Grafos isomorfos (grafo de Petersen).
Notemos que quaisquer dois grafos completos G e H de mesma ordem s~ao isomorfos. Mais que
isso, qualquer bijec~ao entre V(G) e V(H) dene um isomorsmo entre eles. Nesse caso, dizemos que
o grafo e unico a menos de isomorsmos e por isso usamos a mesma notac~ao para todos eles, a
saber Kn, quando o conjunto dos vertices n~ao e relevante.
Exemplo 9. Ha oito grafos distintos com tres vertices, eles est~ao descritos nas representac~oes da
gura 1.7 abaixo.
3 2
1
3 2
1
3 2
1
3 2
1
3 2
1
3 2
1
3 2
1
3 2
1
Figura 1.7: Grafos distintos de ordem 3.
No entanto, ha apenas 4 grafos n~ao-isomorfos com tres vertices, representados pelos diagramas
da gura 1.8
Figura 1.8: Grafos n~ao-isomorfos de ordem 3.
N~ao existe uma caracterizac~ao simples de grafos isomorfos. Isso signica que n~ao ha algoritmo
eciente que recebe dois grafos e decide se eles s~ao isomorfos.
Isomorsmo 19
Exemplo 10. Nenhum dos grafos G, H e K representados na gura 1.9 s~ao isomorfos.
1
2
3
4
G H K
1
2
3
1
2
3
4
5
6
4
5
6
5
6
Figura 1.9: Grafos n~ao-isomorfos.
Temos que G n~ao e isomorfo a H porque G n~ao tem um vertice de grau quatro enquanto que
o vertice 5 em H tem grau quatro, portanto n~ao ha como haver uma bijec~ao entre os vertices
desse grafo que preserve as adjacencias. Pelo mesmo motivo H n~ao e isomorfo a K. Agora, G n~ao
e isomorfo a K porque caso existisse um isomorsmo f : V(G) → V(K) ent~ao a imagem por f do
conjunto 2, 3, 5 ⊂ V(G) e, obrigatoriamente, o conjunto 2, 3, 5 ⊂ V(K), mas qualquer bijec~ao f
n~ao preserva adjacencia entre esses vertices pois 2, 3, 5 em G induz um triangulo e em K n~ao (veja
o exerccio 47 abaixo).
Nesse exemplo foram dados argumentos diferentes para concluir o mesmo fato, o n~ao-isomorsmo
entre pares de grafos. Ainda, existem exemplos de grafos n~ao isomorfos para os quais esses argu-
mentos n~ao funcionam (da mesma forma que a existencia de um vertice de grau quatro funciona
para mostrar que G n~ao e isomorfo a H mas n~ao serve para mostrar que G n~ao e isomorfo a K pois
1, 2, 2, 3, 3, 3 s~ao os graus dos vertices de ambos os grafos).
Observac~ao 4. E difcil caracterizar de modo eciente o n~ao-isomorsmo entre grafos:
O problema do n~ao-isomorsmo de grafos : Dados os grafos G = (V, E) e H = (V, E ′) decidir
se eles s~ao n~ao-isomorfos.
N~ao se conhece algoritmo de tempo polinomial no tamanho dos grafos para decidir se dois grafos
n~ao s~ao isomorfos. Mais do que isso, n~ao se conhece um algoritmo de tempo polinomial no tamanho
dos grafos que receba como entrada uma terna (G,H, P) onde P e uma prova de que G e H n~ao s~ao
isomorfos e que devolva sim se G1 n~ao e isomorfo a G2 e devolva n~ao caso contrario. Em linguagem
tecnica dizemos que n~ao se sabe se o problema do n~ao-isomorsmo de grafos esta na classe
NP de complexidade computacional.
Observac~ao 5. Por outro lado, podemos considerar o problema do isomorsmo de grafos:
O problema do isomorsmo de grafos : Dados os grafos G = (V, E) e H = (V, E ′) decidir se
eles s~ao isomorfos.
Atualmente n~ao se conhece algoritmo polinomial no tamanho do grafo que resolva o problema.
Entretanto, n~ao e difcil projetar um algoritmo de tempo polinomial que recebe a terna (G,H, f)
onde f : V(G) → V(H) e devolve sim caso G e H s~ao isomorfos e f e o isomorsmo, caso contrario
devolve n~ao. Em linguagem tecnica dizemos que o problema do isomorsmo de grafos esta na
classe NP de complexidade de problemas computacionais. Entretanto, n~ao e sabido se esse
problema e NP-completo.
Exercıcios
Exerccio 45. Determine quais pares dentre os grafos abaixo s~ao isomorfos.
(i) G1 dado por V(G1) = v1, u1, w1, x1, y1, z1 e
E(G1) = u1, v1, u1, w1, v1, w1, v1, x1, w1, y1, x1, y1, x1, z1;
20 Conceitos Basicos
(ii) G2 dado por V(G2) = v2, u2, w2, x2, y2, z2 e
E(G2) = u2, v2, u2, w2, v2, w2, v2, x2, w2, y2, x2, y2, y2, z2;
(iii) G3 dado por V(G3) = v3, u3, w3, x3, y3, z3 e
E(G3) = u3, v3, u3, w3, v3, w3, v3, x3, w3, y3, x3, y3, u3, z3.
Exerccio 46. Mostre que existem 11 grafos n~ao-isomorfos com 4 vertices.
Exerccio 47. Sejam G e H grafos isomorfos e f : V(G) → V(H) um isomorsmo. E verdade que
G[U] e isomorfo a H[f(U)] para todo U ⊆ V(G)? Justique.
Exerccio 48. Mostre que o grafo de Petersen e isomorfo ao complemento do grafo linha do K5.
Exerccio 49. Um automorfismo de um grafo e um isomorsmo do grafo sobre ele mesmo. Quantos
automorsmos tem um grafo completo?
Exerccio 50. Mostre que o conjunto de automorsmos de um grafo com a operac~ao de composic~ao
de func~oes denem um grupo.
Exerccio 51. Qual o numero de grafos distintos sobre um conjunto de vertices V de tamanho n?
Exerccio 52. Prove que ha pelo menos 2(n2)(n!)−1 grafos n~ao isomorfos sobre um conjunto de
vertices V de tamanho n.
Exerccio 53. Um grafo G = (V, E) e vertice-transitivo se para quaisquer u, v ∈ V existe um
automorsmo f de G com f(v) = u. Analogamente, G e aresta-transitivo se para quaisquer
arestas x, y, z,w ∈ E existe um automorsmo f de G tal que f(x), f(y) = z,w.
De um exemplo de grafo vertice-transitivo. De um exemplo de grafo aresta-transitivo. De um
exemplo de grafo aresta-transitivo mas n~ao vertice-transitivo.
1.4 Outras nocoes de grafos
Em algumas situac~oes podemos ter um modelo para um problema a ser resolvido e esse modelo
seria um grafo se desconsiderassemos algumas peculiaridades da situac~ao. Por exemplo, um mapa
rodoviario pode ser modelado denindo-se um vertice para cada cidade e duas cidades formam
uma aresta no grafo (modelo) se existe rodovia ligando essas cidades correspondentes aos vertices.
Normalmente, distancia e um parametro importante nesses mapas e assim as arestas devem ter um
comprimento associado a elas. Entretanto, \comprimento de aresta" n~ao faz parte da denic~ao de
um grafo. Num outro exemplo, se estamos interessados em rotas de trafego dentro de uma cidade
podemos denir um vertice por esquina e duas esquinas consecutivas numa mesma rua formam uma
aresta. Nesse caso, as ruas tem sentido (m~ao e contra-m~ao) e as arestas tambem deveriam ter mas,
novamente, essa caracterstica n~ao faz parte da denic~ao de grafos.
Esses problemas e muitos outros podem ser modelados com \outros tipos" de grafos. Alguns
desses outros tipos s~ao
Grafo com pesos nas arestas e um tripla (V, E, ρ) de modo que (V, E) e um grafo e ρ : E→ R
e uma func~ao que assume valores em R ⊆ R.Grafo orientado tem orientac~ao nas arestas (s~ao pares ordenados) de modo que para vertices
u e v, se (u, v) e uma aresta ent~ao (v, u) n~ao e aresta.
Grafos dirigido ou digrafo e dado por um par (V, E) onde E ⊆ V × V \ (v, v) : v ∈ V.Multigrafo e dado por um conjunto V de vertices, um conjunto E de arestas e uma func~ao de
E em(V2
)que diz quem s~ao os extremos de cada aresta; nesse caso podemos ter mais de uma aresta
com os mesmos extremos.
Em cada um dos casos acima, o grafo (V, E) naturalmente denido por essas estruturas e chamado
grafo subjacente .
Outros tipos podem ser derivados combinando esses tipos de grafos, por exemplo, grafo dirigido
com pesos nas arestas.
Representac~ao computacional 21
1 2
5
3 4
1
3 4
5
(c) (d)
2
(b)
1
3 4
5
(a)
1
3 4
5
2 2
Figura 1.10: (a) Grafo orientado. (b) Multigrafo. (c) Grafo dirigido. (d) Grafo subjacente aos
grafos dados em (a), (b) e (c).
Exercıcios
Exerccio 54. Dena isomorsmo para grafos orientados.
Exerccio 55. Formule uma vers~ao do teorema 1 para grafos orientados.
1.5 Representacao computacional
Nesta sec~ao comecamos uma abordagem algoritmica da teoria dos grafos. O primeiro passo e de-
nir representac~oes computacionais de grafos; as representac~oes que mostraremos a seguir assumem
que os vertices s~ao um segmento inicial dos inteiros positivos. Log, precisamos de um mapeamento
do conjunto de vertices do grafo G no subconjunto dos numero naturais V ′ = 1, 2, . . . , |V(G)|. Isso
e feito para facilitar o acesso as informac~oes usando estruturas de dados indexadas disponveis nas
linguagens de programac~ao estruturadas. Em resumo, dado G o problema e construir um grafo
isomorfo a G com vertices no conjunto V. Assim, se G e uma entrada para um problema computa-
cional, ent~ao G deve ser \traduzido" para sua copia isomorfa e a partir da o problema e tratado;
a soluc~ao do problema sobre a copia deve ser recuperada para uma soluc~ao para G. Isso pode ser
feito usando as tecnicas de busca conhecidas para recuperar os inteiros associados aos vertices como,
por exemplo, tabela de espalhamento (hashing) ou arvore binaria de busca. Feito isso, qualquer
problema computacional sobre um grafo G e tratado computacionalmente sobre um grafo isomorfo
G ′ com vertices V(G ′) = 1, 2, . . . , |V(G)| e a estrutura de busca escolhida no passo anterior e usada
para representar o isomorsmo.
No que segue, sempre que tratamos problemas computacionais sobre grafos estamos assumindo
os grafos s~ao denidos sobre o conjunto de vertices 1, 2, . . . , n, para algum n ∈ N. Veremos duas
das estruturas de dados mais conhecidas para a representac~ao de grafos.
1.5.1 Listas de adjacencias de G
E um vetor N[ ] de listas ligadas. A lista N[i] contem os vizinhos do vertice i e cada no dessa lista
e composto por uma variavel que armazena um vertice e um ponteiro que aponta para o proximo
no da lista.
Exemplo 11. Para o G grafo representado na gura 1.9, uma lista de adjacencias e como segue
Observac~ao 6. A representac~ao de uma grafo por listas de adjacencias n~ao e unica, pois qualquer
permutac~ao dos nos em N[i] dene uma lista valida.
1.5.2 Matriz de adjacencias de G
E a matriz |V |× |V | denotada por A(G), ou A simplesmente, denida por
A(i, j) =
1, se i, j ∈ E(G)0, caso contrario.
22 Conceitos Basicos
N:
2 3
1 5 3
32
4
2 4
5
6
6
5
1 2 3 4 5 6
Figura 1.11: Lista de adjacencias do grafo G na gura 1.9.
Exemplo 12. Para o G grafo representado na gura 1.9, a matriz de adjacencias e
A =
0 1 0 0 0 0
1 0 1 0 1 0
0 1 0 1 1 0
0 0 1 0 0 1
0 1 1 0 0 1
0 0 0 1 1 0
.
1.5.3 Complexidade de algoritmos em grafos
Neste texto entendemos por complexidade do algoritmo a
complexidade de tempo no pior caso
expressa em func~ao do tamanho da representac~ao do grafo, ou seja,
T(n) = maxT(G) : G tem representac~ao de tamanho n
onde T(G) denota o numero de instruc~oes executadas por um algoritmo dado com entrada G.
Exemplo 13. Sejam A e B dois algoritmos distintos que executam a mesma tarefa sobre um grafo
G = (V, E). O algoritmoA gasta, no pior caso, |V |2 passos para executar a tarefa e o algoritmo B gasta
(|V |+ |E|) log |E| passos no pior caso. Para grafos com |V |2/4 arestas o primeiro algoritmo e sempre
melhor enquanto que para grafos com 1.000|V | arestas o segundo algoritmo e assintoticamente
melhor (melhor para |V | ≥ 16.645, enquanto que o primeiro e melhor para |V | ≤ 16.644). Para
entradas pequenas (ate 25 mil vertices) as func~oes |V |2 e (|V | + |E|) log |E| s~ao comparadas nos
gracos da gura 1.12 para grafos com 1.000|V | arestas.
Usualmente, a express~ao que estabelece a complexidade de um algoritmo e escrita em func~ao
do tamanho da representac~ao usada e em notac~ao assintotica: sejam f, g duas func~oes denidas nos
naturais e que assumem valores naturais (ou, reais positivos, ent~ao
f(n) = O(g(n)), para n aucientemente grande
signica que existem constantes positivas c e n0 tais que para todo n ≥ n0 vale
f(n) ≤ c · g(n).
No nosso caso n e o tamanho da representac~ao do grafo, n = |V |2 na caso de matriz de adjacencias
e n = |V |+ |E| no caso de listas de adjacencias.
Vejamos a complexidade de alguns algoritmos que executam tarefas simples comparando cada
uma das representac~oes dadas acima para um grafo xo G = (V, E)
Representac~ao computacional 23
01e+072e+073e+074e+075e+076e+077e+078e+079e+071e+08
0 1000 2000 3000 4000 5000
n2(n+ 1000n) log(1000n)
(n2/4+ n) log(n2/4)
0
5e+08
1e+09
1.5e+09
2e+09
2.5e+09
3e+09
5000 10000 15000 20000 25000
n2(n+ 1000n) log(1000n)
(n2/4+ n) log(n2/4)
Figura 1.12: Graco das func~oes do exemplo 13.
Tarefa Matriz de adjacencias Lista de adjacencias
i, j ∈ E? O(1) O(|V |)
Determine d(i) O(|V |) O(|V |)
Devolva E O(|V |2) O(|E|)
Observac~ao 7. Um algoritmo em grafo e de complexidade polinomial se a complexidade de tempo
no pior caso e expressa por uma func~ao polinomial no tamanho da representac~ao, entretanto, \
ter complexidade polinomial" e independente da representac~ao do grafo por matriz ou lista de
adjacencias pois essas representac~oes s~ao polinomialmente relacionadas, ou seja, uma pode ser
obtida da outra por algoritmo de tempo polinomial.
Exercıcios
Exerccio 56. Mostre que se f(n) = O(g(n)) ent~ao O(f(n)) +O(g(n)) = O(g(n)).
Exerccio 57. E verdade que para todo Gn vale que |E(Gn)| = O(n) para n sucientemente grande?
Exerccio 58. E verdade que para todo Gn vale que log |E(Gn)| = O(logn) para n sucientemente
grande?
Exerccio 59. Sejam G um grafo sobre o conjunto de vertices 1, 2, . . . , n, A a sua matriz de
adjacencias e b(i, j) as entradas da matriz A2. Que parametro de G esta associado ao numero
b(i, i), para cada i ∈ V(G)? Qual a relac~ao entre b(i, j) e, NG(i) e NG(j) quando i 6= j?Exerccio 60. Seja G um grafo qualquer sobre o conjunto de vertices 1, 2, . . . , n e A sua matriz de
adjacencias. Como e possvel determinar o numero de triangulos de um grafo G qualquer a partir
de A3?
Exerccio 61. Em 1990, Coppersmith e Winograd [6] mostraram um algoritmo que determina o
produto de matrizes duas n×n usando O(n2,376) operac~oes aritmeticas. Como esse algoritmo pode
ser usado para determinar se um grafo tem triangulo?
24 Conceitos Basicos
Exerccio 62. Sejam G um grafo sobre o conjunto de vertices 1, 2, . . . , n e A sua matriz de
adjacencias. Prove que se os autovalores de A s~ao distintos ent~ao o grupo dos automorsmos e
abeliano.
Exerccio 63. O traco de uma matriz A, denotado por tr(A), e a soma dos elementos na diagonal
da matriz. Quanto vale o traco de uma matriz de adjacencias? Quanto vale tr(A2) em func~ao de
E(G)?
Exerccio 64. Por A ser uma matriz simetrica, sabemos da Algebra Linear que todos os seus
autovalores s~ao numeros reais. Determine os autovalores da matriz de adjacencias do grafo completo
Kn sobre o conjunto de vertices 1, 2, . . . , n. Mostre que se G e um grafo r-regular sobre o conjunto
de vertices 1, 2, . . . , n, ent~ao r e uma autovalor de A.
Exerccio 65. Dada uma representac~ao por listas de adjacencias de um grafo dirigido D descreva
um algoritmo com tempo de execuc~ao O(|V(D)|+ |E(D)|) para computar a representac~ao por listas
de adjacencias do grafo subjacente.
Exerccio 66. Neste exerccio apresentamos duas estruturas de dados para representar grafos diri-
gidos. Dizemos que a aresta (u, v) ∈ E num grafo dirigido (V, E) sai de u e chega em v.
Os vetores de incidencias de um grafo dirigido D = (V, E) s~ao os vetores S e C indexados por
E tais que para e = (u, v) ∈ E temos S[e] = u e C[e] = v, e nesse caso dizemos que e sai de u e
chega em v.
Uma matriz de incidencias de um grafo dirigido D = (V, E) e uma matriz B de dimens~ao
|V |× |E| (as linhas s~ao indexadas por V e as colunas por E) tal que
B(i, j) =
−1 se a aresta j sai do vertice i,
1 se a aresta j chega no vertice i,
0 caso contrario.
Para cada uma das representac~oes, determine o tempo para:
(i) dados e ∈ E e v ∈ V, determinar se e sai ou chega em v;
(ii) dado e ∈ E, determinar suas extremidades;
(iii) dado v ∈ V determinar as arestas que saem de v e determinar as arestas que chegam
em v.
Determine o que as entradas da matriz |V |× |V | dada por B ·BT representam, onde BT e a matriz
transposta de B.
Exerccio 67 ([7]). Mostre que determinar se um grafo orientado contem um sorvedouro | isto e,
um vertice com grau de entrada |V |− 1 e grau de sada 0 | pode ser feito em tempo O(|V |) quando
uma representac~ao por matriz e utilizada.
SorvedouroFonte
1.6 Percursos em grafos
Nessa sec~ao veremos algoritmos que formam a base para muitos algoritmos em grafos (para quase
todos deste texto). O objetivo de um percurso num grafo e o seguinte: dado a representac~ao de um
grafo G = (V, E), sistematicamente visitar todos os vertices e todas as arestas desse grafo.
Dado um vertice w em V, dizemos que o vertice u do grafo e alcancavel por w em G se existe
uma sequencia de vertices v1, v2, . . . , vm de G tal que
w = v1,
Percursos em grafos 25
u = vm,
vi e vi+1 s~ao adjacentes, para todo i ∈ 1, 2, . . . ,m− 1.
Denimos que w e alcancavel por w em G, para todo w ∈ V.Uma sequencia de vertices como acima e chamada de passeio em G.
1.6.1 Percurso generico
Um percurso num grafo G comeca com as seguintes considerac~oes: cada vertice esta em um de
dois estados possveis em qualquer instante da execuc~ao: n~ao-visitado ou visitado; cada aresta em
E(u) esta em um de dois estados: n~ao-visitada a partir de u ou visitada a partir de u, para todo
u ∈ V(G). De incio todos os vertices de G est~ao no estado n~ao-visitado e todas as arestas no
estado n~ao-visitada a partir de ambos os extremos.
O seguinte algoritmo, que chamaremos de Visite(G, v), recebe um grafo G e um vertice inicial
v ∈ V(G) e visita uma unica vez todos os vertices alcancaveis a partir de v e visita duas vezes todas
as arestas induzidas por esses vertices, uma visita a partir de cada extremo. Para gerenciar essa
visita o algoritmo Visite(G, v) usa uma lista L na qual a busca, inserc~ao e remoc~ao de elementos
e feita de maneira arbitraria e com custo constante, tambem o teste \L = ∅?" e feito em tempo
constante.
Algoritmo 1: Visite(G, v).
Dado : um grafo G e um vertice v.
Devolve: visita aos vertices e arestas n~ao-visitados e alcancaveis a partir de v.
insira v em L;1
marque v visitado;2
enquanto L 6= ∅ faca3
escolha u ∈ L;4
se em EG(u) ha aresta n~ao-visitada a partir de u entao5
escolha u,w em EG(u) n~ao-visitada a partir de u;6
marque u,w visitada a partir de u;7
se w e n~ao-visitado entao8
insira w em L;9
marque w visitado;10
senao remova u de L.11
Analise e correcao do algoritmo Visite(G, v). No que segue faremos uma analise do algoritmo
Visite(G, v). Fixe um grafoG representado por uma lista de adjacencias e um vertice v deG, suponha
que todos os vertices e arestas s~ao n~ao-visitados, considere uma execuc~ao de Visite(G, v) e dena
A = u ∈ V(G) : u e alcancavel a partir de v.
Proposicao 3. Cada vertice de G entra em L no maximo uma vez.
Demonstrac~ao. Um vertice w e inserido em L na linha 1 ou 9. A condic~ao para essas linhas serem
executadas e que w seja n~ao-visitado e apos a inserc~ao o vertice w e marcado visitado, nas linhas
2, 10. Logo a condic~ao para inserc~ao de w em L passa a ser falsa. A proposic~ao segue do fato de
que um vertice visitado nunca se tornara n~ao-visitado durante uma execuc~ao de Visite(G, v).
Proposicao 4. A linha 4 e executada no maximo dG(w) + 1 vezes, para cada w ∈ V(G).
Demonstrac~ao. Fixe um vertice w e assuma que w ∈ L. Para cada execuc~ao da linha 4 com u = w,
ou vale a condic~ao da linha 5 ou e executada a linha 11.
Se vale a condic~ao da linha 5 ent~ao o numero de arestas n~ao-visitadas a partir de w em EG(w)
diminui de um, se n~ao vale ent~ao w e removido de L. Como consequencia n~ao ha aresta n~ao-
visitadas a partir de w apos d(w) execuc~oes da linha 4 com u = w, e apos d(w) + 1 execuc~oes w
26 Conceitos Basicos
e removido de L. O resultado agora segue da proposic~ao anterior e do fato de nunca uma aresta ser
marcada n~ao-visitada.
Corolario 5. O algoritmo Visite(G, v) termina.
Demonstrac~ao. Por denic~ao de grafo o conjunto |V(G)| e nito. Pela proposic~ao 3 cada vertice
entra em L no maximo uma vez. Pela proposic~ao 4 apos no maximo∑u∈V(G)
d(u) + 1 = 2|E|+ |V |
iterac~oes do enquanto - faca na linha 3 temos L = ∅.
Lema 6. Numa execuc~ao de Visite(G, v) todo vertice alcancavel a partir de v e visitado.
Demonstrac~ao. Seja w ∈ V(G) um vertice alcancavel a partir de v. Por denic~ao existe um passeio
v1, v2, . . . , vm−1, vm (1.19)
em G. Vamos provar por induc~ao em m que se w e alcancavel a partir de v por um passeio com m
verticesx ent~ao w e visitado.
Para a base da induc~ao, suponha m = 1. Como v e alcancavel a partir de v e e visitado (linha
2), a base esta provada.
Suponha (hipotese da induc~ao) que todo vertice alcancavel a partir de v por um passeio de
m− 1 vertices e visitado, m > 1. Seja w um vertice alcancavel a partir de v por um passeio com m
vertices, como em (1.19).
Escreva em = vm−1, vm. Como vm−1 e alcancavel por um passeio com m − 1 vertices, po
hipotese vm−1 foi visitado, portanto, entrou em L. Pelo corolario5 vm−1 e removido de L em algum
momento da execuc~ao e antes disso a aresta em e visitada a partir de vm−1 na linha 7; nesse ponto
ou vm ja foi visitado ou vale a condic~ao da linha 8 e vm e visitado na linha 10. Assim w = vm e
visitado. Pelo Princpio da Induc~ao Finita todo vertice alcancavel por m arestas e visitado, para
todo inteiro m ≥ 1.
Corolario 7. Cada aresta de G[A] e visitada duas vezes.
Demonstrac~ao. Seja x, y uma aresta de G[A]. Como x ∈ A temos x ∈ L em algum momento
da execuc~ao de Visite(G, v) e antes de x ser removido de L a aresta x, y e visitada a partir de
x. Analogamente, de y ∈ A temos que a aresta x, y e visitada a partir de y, logo a aresta e
visitada duas vezes. Como uma aresta visitada nunca sera rotulada como n~ao-visitada durante uma
execuc~ao, a aresta x, y sera visitada exatamente duas vezes.
Com isso temos o seguinte resultado, que estabelece que Visite(G, v) faz o que foi prometido.
Esse resultado e a correc~ao do algoritmo, isto e, a prova de que ele funciona corretamente.
Teorema 8. Apos Visite(G, v) cada vertice de A foi visitado uma vez e cada aresta de G[A]
foi visitada duas vezes.
O proximo passo e determinar a complexidade do algoritmo. Como e usual, O(1) denota tempo
constante. As duas primeiras linhas tem tempo O(1). Vimos que o laco e executado no maximo
2|E| + |V | vezes, logo uma estimativa e o numero maximo de rodadas do laco vezes o custo de
cada rodada; se cada linha tiver custo constante, ent~ao o custo total do laco e O(|E| + |V |). Para
determinar o custo de cada linha precisamos saber detalhadamente como cada operac~ao de cada
linha pode ser realizada.
A linha 1 e feita em tempo constante por hipotese, assim como as linhas 3, 4, 9 e 11. A linha 2
pode ser implementada em tempo constante, basta manter um vetor com |V | posic~oes, a posic~ao i
do vetor contem 0 ou 1 indicando se o vertice i e n~ao-visitado ou visitado. Com isso, as linha 8 e
10 tambem tem custo O(1). Resta determinar os custos das linhas 5, 6 e 7; pra esses casos basta
manter um ponteiro em cada lista de adjacencias N[i] indicando o primeiro vertice n~ao visitado
dela, os detalhes s~ao deixamos a cargo do leitor.
Percursos em grafos 27
Lema 9. A complexidade de Visite(G, v) e O(|A|+ |E(G[A])|).
Demonstrac~ao. O algoritmo Visite(G, v) pode ser implementado de forma que cada linha tenha
custo constante, logo a complexidade e proporcional ao numero de rodadas do laco na linha 3,
ou seja, o tempo gasto e proporcional ao numero de visitas. Pelo teorema 8 a complexidade e
O(|A|+ |E(G[A])|).
Agora, e simples mostrar (exerccio 68) que o seguinte algoritmo percorre o grafo (V, E), visitando
cada vertice uma unica vez e visitando cada aresta duas vezes e com complexidade de tempo
O(|V |+ |E|).
Algoritmo 2: Percurso(G).
Dado : um grafo G.
Devolve: visita aos vertices e arestas de G.
marque todos elementos de V(G) e de E(G) n~ao-visitado;1
enquanto ha vertice n~ao-visitado faca2
escolha v n~ao-visitado;3
insira v em L;4
marque v visitado;5
enquanto L 6= ∅ faca6
escolha u ∈ L;7
se em EG(u) ha aresta n~ao-visitada a partir de u entao8
escolha u,w em EG(u) n~ao-visitada a partir de u;9
marque u,w visitada a partir de u;10
se w e n~ao-visitado entao11
insira w em L;12
marque w visitado;13
senao remova u de L.14
Exercıcios
Exerccio 68. Prove que Percurso(G) visita cada vertice de G uma vez e cada aresta de G duas
vezes e tem complexidade O(|V(G)|+ |E(G)|).
Exerccio 69. Para facilitar a analise do seguinte algoritmo, voce pode considerar instancias G tais
que todo vertice de G e alcancavel a partir de qualquer vertice dado.
Algoritmo 3: Visite vertices(G).
Dado : um grafo G tal que todo vertice e alcancavel a partir de qualquer outro vertice.
Devolve: visita aos vertices de G.
marque todos elementos de V(G) n~ao-visitado;1
escolha um vertice v n~ao-visitado;2
insira v em L;3
marque v visitado;4
enquanto E(L, L) 6= ∅ faca5
escolha uma aresta u,w ∈ E(L, L);6
insira u,w em M;7
v← u,w ∩ L;8
insira v em L;9
marque v visitado.10
(a) Prove ou refute: o seguinte algoritmo visita todos os vertices de G (Pode-se assumir que
E(L, L) 6= ∅ se e somente se L = V(G); esse fato sera provado no captulo 3).
(b) Prove que, no nal de execuc~ao do algoritmo, M contem |V(G)|− 1 arestas.
28 Conceitos Basicos
(c) Determine a complexidade do algoritmo do exerccio anterior. Justique tudo com
cuidado, principalmente no que se rera as linhas 5, 6 e 8. Pode-se assumir que as operac~ao
em L e em M s~ao feitas em tempo constante.
1.7 Algoritmos de busca
Algoritmo de busca e como s~ao chamados, usualmente, alguns dos algoritmos de percurso em
grafos. Nessa sec~ao veremos dois casos particulares do algoritmo 2 visto acima, cada caso e obtido
quando denimos uma poltica de gerenciamento para a lista L.
Se consideramos apenas as visitas aos vertice, ent~ao uma estrategia geral de busca pode ser
descrita da seguinte maneira: enquanto houver vertice u n~ao-visitado, visite u e seus vizinhos n~ao-
visitados. Para visitar os vizinhos de u destacamos as duas estrategias a seguir, as quais re etem
duas polticas de gerenciamento da lista L.
1.7.1 Busca em Largura
Numa busca em largura, primeiro visitamos cada vizinho n~ao-visitado de v, percorremos N(v) e
guardamos-o numa la; quando n~ao houver mais vizinhos removemos v, pegamos o primeiro vertice
da la e repetimos o processo. Em outras palavras, a lista L e administrada como la .
No algoritmo 2, inserc~ao e feita no m da la L, remoc~ao e feita no comeco da la L e a linha
escolha u ∈ L devolve o primeiro elemento da la.
Algoritmo 4: Visite em Largura(G, v).
Dado : um grafo G e um vertice v.
Devolve: visita aos vertices e arestas n~ao-visitados e alcancaveis a partir de v.
insira v no m da la L;1
marque v visitado;2
enquanto L 6= ∅ faca3
seja u ∈ L o primeiro vertice da la;4
se em EG(u) ha aresta n~ao-visitada a partir de u entao5
escolha u,w em EG(u) n~ao-visitada a partir de u;6
marque u,w visitada a partir de u;7
se w e n~ao-visitado entao8
insira w no m da la L;9
marque w visitado;10
senao remova u de L.11
1.7.2 Busca em Profundidade
Numa busca em profundidade, visitamos cada vizinho n~ao visitado de v, percorremos N(v) e
guardamos-o numa pilha; quando n~ao houver mais vizinhos removemos v de L, pegamos o topo da
pilha e repetimos o processo. Em outras palavras, a lista L acima e administrada como pilha .
No algoritmo 2, inserc~ao e feita no topo da pilha L, remoc~ao e feita no topo da pilha L e a linha
escolha u ∈ L devolve o topo da pilha L.
Busca em profundidade rotulada. A seguinte vers~ao da busca em profundidade, que chamamos
de busca em profundidade rotulada, sera muito util adiante; a ideia e manter um contador de
operac~oes na pilha e rotular cada vertice com dois valores inteiros: o valor do contador quando o
vertice entrou na pilha e o valor do contador quando o vertice saiu da pilha. Pra isso o algoritmo
usa dois vetores, chega[ ] e sai[ ], indexados por V. Em chega[v] temos o momento no qual v foi
empilhado e em sai[v] o momento em que v foi removido da pilha.
Algoritmos de busca 29
Ainda, o algoritmo usa um vetor pai[ ] indexado pelos vertices. No nal da execuc~ao pai[v] tem
o vertice que foi empilhado antes de v durante a execuc~ao, em outras palavras, foi o vertice que
descobriu v.
A seguir damos uma vers~ao recursiva para a busca em profundidade rotulada (a pilha ca
implementada, implicitamente, pela pilha da recurs~ao) a qual recebe um grafo G dado por uma
lista de adjacencias e um vertice w ∈ V(G); no incio temos cont = sai[v] = chega[v] = 0 e
pai[v] = nil, para todo vertice v de G.
Algoritmo 5: BP(G,w).
Dado : um grafo G e um vertice w.
Devolve: busca em profundidade em G a partir de w com rotulos chega, sai e pai em cada
vertice.
cont← cont+ 1;1
chega[w]← cont;2
para cada u ∈ N(w) faca3
se chega[u] = 0 entao4
pai[u]← w;5
BP(G,u);6
cont← cont+ 1;7
sai[w]← cont.8
Proposicao 10. Apos uma execuc~ao de BP(G,w), para quaisquer u, v ∈ V(G) alcancaveis apartir de w, um e somente um dos itens abaixo vale para esse par de vertices
(a) chega[u] < sai[u] < chega[v] < sai[v];
(a') chega[v] < sai[v] < chega[u] < sai[u];
(b) chega[u] < chega[v] < sai[v] < sai[u];
(c) chega[v] < chega[u] < sai[u] < sai[v].
Demonstrac~ao. A prova e deixada como exerccio.
Denimos, para todo t ∈ N, a t-esima iterac~ao do vetor pai, denotada por pai(t), da seguinte
maneira
pai(t)[v] =
v se t = 0
pai(t−1)[pai[v]
]se t > 0.
(1.20)
Exercıcios
Exerccio 70. Escreva uma vers~ao n~ao recursiva da busca em profundidade rotulada.
Exerccio 71. Prove a proposic~ao 10.
Exerccio 72. Considere uma execuc~ao da busca rotulada BP(G,w). Para simplicar, considere
que todo vertice de G e alcancavel a partir de w. Prove as seguintes equivalencias. Para quaisquer
u, v ∈ V(G)
1.[chega[v], sai[v]
]∩[chega[u], sai[u]
]= ∅ se e somente se n~ao existe t ∈ N tal que pai(t)[u] =
v e n~ao existe t ′ ∈ N tal que pai(t′)[v] = u;
2.[chega[v], sai[v]
]⊂[chega[u], sai[u]
]se e somente se existe t ∈ N tal que pai(t)[v] = u;
3.[chega[v], sai[v]
]⊃[chega[u], sai[u]
]se e somente se existe t ∈ N tal que pai(t)[u] = v.
Exerccio 73. Adapte o algoritmo 3 do exerccio 69 para que o percurso seja uma busca em largura.
Faca o mesmo para busca em profundidade.
30 Conceitos Basicos
CAPıTULO 2
CAMINHOS, CIRCUITOS E CAMINHOS MINIMOS
Neste captulo tratamos de duas classes especiais de grafos e de um problema algortmico classico.
Na primeira sec~ao apresentamos a classe dos caminhos e noc~oes que permeiam essa classe como
comprimento de caminhos e alguns parametros associados a caminhos em grafos como distancia
entre vertices e diametro do grafo, em seguida apresentamos a classe dos circuitos. A segunda sec~ao
trata do problema algortmico de determinar distancias entre pares de vertices num grafo com pesos
nas arestas. Mais especicamente, nessa sec~ao s~ao apresentados dois algoritmos tradicionais para
o problema: o algoritmo de Dijkstra de 1959 e o algoritmo e o algoritmo de Floyd e Warshall de
1962. Esses algoritmos usam uma tecnica para projeto de algoritmos conhecida como Programac~ao
Dinamica.
2.1 Caminhos e circuitos
Um caminho e qualquer grafo ou subgrafo isomorfo a (V, E) dado por
V = 0, 1, . . . , k
E =i, i+ 1 : 0 ≤ i ≤ k− 1
,
(2.1)
para algum k ∈ N.Exemplo 14. Um caminho com quatro vertices e representado pelo diagrama da gura 2.1.
x0 x2x1x0 x1 x2 x3
Figura 2.1: Representac~ao geometrica do caminho(x0, x1, x2, x3,
x0, x1, x1, x2, x3, x3
).
O caminho P denido em (2.1) tambem e denotado pela sequencia
P = 0, 1, . . . , k
de seus vertices, de modo que vertices consecutivos na sequencia s~ao adjacentes. Seguindo notac~ao
estabelecida na sec~ao 1.1, denotamos por Pk+1 um caminho com k+1 vertices. Em outras palavras,
um caminho e um passeio sem repetic~ao de vertices.
Exemplo 15. Considere o grafo G representado no diagrama da gura 2.2 abaixo. O caminho P4 =
a, b, f, i e o subgrafo G[a, b, f, i], tambem o subgrafo P5 =(a, d, c, h, i,
a, d, d, c, c, h, h, i
)e um caminho. O subgrafo induzido pelo conjunto de vertices m e um P1 e o subgrafo induzido
pela aresta j, l e um P2.
Num caminho P = x, v0, . . . , vk, y, dizemos que os vertices x e y s~ao os extremos de P e dizemos
que os vertices vi, 0 ≤ i ≤ k, s~ao os vertices internos de P.
O numero de arestas num caminho e o comprimento desse caminho.
Em um grafo G = (V, E), a distancia entre dois vertices quaisquer u, v ∈ V, denotada por
distG(u, v), e denida como o comprimento do menor caminho com extremos u e v, isto e
distG(u, v) = mink ∈ N : u, v s~ao extremos de um caminho Pk+1 ⊆ G
, (2.2)
quando existe algum caminho. Se u e v n~ao s~ao extremos de algum caminho em G, ent~ao conven-
cionamos distG(u, v) =∞, de modo que ∞ satisfaz
n+∞ = ∞ e (2.3)
n < ∞, (2.4)
para todo n ∈ N.
32 Caminhos, circuitos e caminhos mnimos
G:
c f
i
m
j `
ba
dge
h
Figura 2.2: Exemplos de subgrafos que s~ao caminhos.
Exemplo 16. No grafo do exemplo 15 temos distG(a, j) = ∞, distG(a, b) = 1, distG(a, i) = 3,
distG(m, j) =∞. Observe que o caminho de comprimento mnimo pode n~ao ser unico.
Observac~ao 8 (dist e uma metrica). Para todo G temos denida a func~ao distG : V(G)×V(G)→ Nque satisfaz
1) distG(u, v) = distG(v, u) para todos u, v ∈ V(G);
2) distG(v, u) = 0 se e somente se u = v;
3) a desigualdade triangular
dist(u,w) ≤ dist(u, v) + dist(v,w) (2.5)
para quaisquer u, v,w ∈ V(G).
Portanto, a distancia dene uma metrica em V(G).
Denimos o diametro do grafo G como a maior distancia entre dois vertices quaisquer de G,
ou seja
diam(G) = maxu,v∈V(G)
distG(u, v). (2.6)
Naturalmente, diam(G) =∞ se existirem dois vertices no grafo G que n~ao extremos de um caminho.
Um circuito e qualquer grafo ou subgrafo isomorfo a (V, E) dado por
V = 1, . . . , k
E =i, i+ 1 : 1 ≤ i ≤ k− 1 ∪
k, 1,
(2.7)
para algum k ≥ 3.Como no caso do caminho, para simplicar, o circuito denido em (2.7) tambem e denotado
pela sequencia de seus vertices
C = 1, 2 . . . , k, 1
de modo que vertices consecutivos s~ao adjacentes. O numero de arestas num circuito e o compri-
mento desse circuito e denotamos um circuito de comprimento k por Ck.
Exemplo 17. Consideremos o grafo G do exemplo 15 temos que C4 = G[b, d, e, g
]e um circuito,
bem como o subgrafo C5 = (V, E) dado por V = a, b, d, e, g e E = a, b, b, e, e, g, g, d, d, a.
Observac~ao 9. Quando denotamos um caminho por uma sequencia v1, v2, . . . , vk os elementos da
sequencia s~ao 2-a-2 distintos, ou seja, n~ao ha vertices repetidos na sequencia. Quando a sequencia
denota um circuito a unica repetic~ao permitida e a do primeiro vertice que deve ser igual ao ultimo.
Proposicao 11. Todo grafo G contem um caminho de comprimento pelo menos δ(G) e, se
δ(G) ≥ 2, um circuito de comprimento pelo menos δ(G) + 1.
Caminhos e circuitos 33
Demonstrac~ao. Dado um grafo G, vamos exibir um caminho com pelo menos δ(G) arestas e um
circuito com pelo menos δ(G) + 1 arestas.
Seja P = x0, x1, . . . , xk um caminho de comprimento maximo em G. Temos que
NG(x0) ⊂ V(P), (2.8)
caso contrario, haveria caminho mais longo que P em G. Logo, |NG(x0)| ≤ |V(P)| − 1 e, como
|NG(x0)| ≥ δ(G) e |E(P)| = |V(P)| − 1, segue que |E(P)| ≥ δ(G), isto e, P e um caminho de
comprimento pelo menos δ(G).
Agora, tratando do caso de circuito, vamos supor que δ(G) ≥ 2. Se o grau mnimo e pelo menos
dois, ent~ao o vertice x0 tem um vizinho em P diferente de x1 e assim esta bem denido o numero
m = maxj : 1 < j ≤ k e xj ∈ NG(x0)
, (2.9)
que e o maior ndice em 2, . . . , k de um vertice vizinho de x0 em P. Agora, basta notar que o
circuito x0, x1, . . . , xm, x0 tem comprimento m+1 e que NG(x0) ⊆ x1, x2, . . . , xm, logo m ≥ δ(G).Portanto, C tem comprimento pelo menos δ(G) + 1.
Denimos a cintura do grafo G como o comprimento do menor circuito contido em G, ou seja
cin(G) = mink ∈ N : existe um circuito Ck ⊆ G
, (2.10)
quando existe um, se n~ao existe convencionamos cin(G) =∞.
Notemos que um circuito de comprimento mpar, ou simplesmente circuito mpar n~ao e um
grafo bipartido. Como subgrafo de grafo bipartido tambem e bipartido (exerccio 29), conclumos
que grafos bipartidos n~ao contem circuito mpar. De fato, a classe dos grafos livres de circuitos de
comprimento mpar e a classe dos grafos bipartidos coincidem.
Teorema 12. Um grafo G e bipartido se e somente se G n~ao contem circuitos de comprimento
mpar.
Demonstrac~ao. Seja G um grafo. Suponha que G contem um circuito mpar e vamos mostrar que
G n~ao e bipartido.
A prova e por contradic~ao. Seja C = x0, . . . , x2k, x0 um circuito mpar em G e suponha que G e
bipartido com partes A e B. Para 1 ≤ j ≤ k− 1 temos
NC(x2j) = x2j−1, x2j+1
portanto, x2j n~ao pode pertencer a mesma parte que os vertices x2j−1, x2j+1. Digamos, sem perda
de generalidade, quek−1⋃j=1
x2j ⊆ A
e, portanto,k−1⋃j=1
x2j−1, x2j+1 ⊆ B.
Como x1 ∈ B devemos ter x0 ∈ A. Como x2k−1 ∈ B devemos ter x2k ∈ A, portanto x0, x2k ∈ E(C),contradizendo o fato de A ser um conjunto independente.
Agora, vamos mostrar que se G n~ao contem circuito mpar ent~ao G e bipartido. Fixamos w, um
vertice de G, e seja Hw o subgrafo de G induzido pelos vertices v ∈ V(G) com distG(w, v) < ∞.
Primeiro, vamos mostrar que Hw e bipartido. Dena os conjuntos disjuntos
Aw = v ∈ V(Hw) : distG(w, v) = 2j para algum j ∈ N (2.11)
Bw = v ∈ V(Hw) : distG(w, v) = 2j+ 1 para algum j ∈ N (2.12)
com Aw ∪ Bw = V(Hw). Vamos mostrar que esses conjuntos s~ao independentes. Sejam u, v ∈ Awdistintos e sejam P = w = x1, . . . , x2a = u e Q = w = y1, . . . , y2b = v os caminhos com extremos
34 Caminhos, circuitos e caminhos mnimos
w e u e w e v, respectivamente, e que realizam as distancias. Se os vertices internos de P e Q s~ao
disjuntos ent~ao u, v ∈ E(G) implicaria num circuito mpar, logo u e v n~ao s~ao adjacentes nesse
caso. Se os vertices internos n~ao s~ao disjuntos, sejam p e q os maiores ndices para os quais xp = yq.
Como os caminhos realizam as distancias p = q e, como anteriormente, se u, v ∈ E(G) ent~ao essa
aresta e os caminhos de xp a u e de yq (=xp) a v formariam circuito mpar.
SejaW = w1, w2, . . . , wm um subconjunto de V(G) tal que distG(wi, wj) =∞ para todo i 6= jde cardinalidade maxima. Os subgrafos Hw1
, . . . , Hwms~ao bipartidos
V(Hwi) ∩ V(Hwj
) = ∅, para todos i 6= j (2.13)
e
G =
m⋃i=1
Hi (2.14)
logo G e bipartido, pois uni~ao de grafos bipartidos disjuntos e bipartido (verique).
Exercıcios
Exerccio 74. E verdade que todo grafo com pelo menos tres vertices, exatamente dois vertices de
grau 1 e os demais vertices com grau 2 e um caminho?
Exerccio 75. Escreva um algoritmo que recebe uma grafo G e decide se G e um caminho. Determine
a complexidade do algoritmo.
Exerccio 76. Prove que se u1, u2, . . . , uk e um passeio em G ent~ao existem ndices i1, i2, . . . , ittais que a subsequencia u1, ui1 , ui2 , . . . , uit , uk e um caminho em G.
Exerccio 77. Dado F ⊂ E(G) mostre que se |E(C) ∩ F| e par para todo circuito C em G ent~ao F e
um corte.
Exerccio 78. Sejam P = u1, u2, . . . , uk e Q = v1, v2, . . . , v` duas sequencias de vertices de um
grafo. Denimos a concatenacao dessas sequencias como a sequencia dos vertices de P seguidos
dos vertices deQ, denotada P,Q = u1, u2, . . . , uk, v1, v2, . . . , v`. Supondo que P eQ sejam caminhos
no grafo, sob que condic~oes a sequencia P,Q e caminho?
Exerccio 79. Prove a desigualdade triangular (equac~ao (2.5)).
Exerccio 80. Prove as armac~oes feitas nas equac~oes (2.13) e (2.14).
Exerccio 81. Escreva um algoritmo baseado na busca em largura para reconhecer grafos bipartidos.
Prove que seu algoritmo funciona corretamente.
Exerccio 82. Seja G um grafo onde a distancia entre qualquer par de vertices e nita. Mostre que
se existem w ∈ V(G) e u, v ∈ E(G) tais que dist(w,u) = dist(w, v) ent~ao cin(G) ≤ dist(w,u) +
dist(w, v) + 1.
Exerccio 83. Mostre que a relac~ao e ∼ f em E(G) dada por e = f ou existe um circuito C ⊂ G tal
que e e f pertencem a E(C) e uma relac~ao de equivalencia.
Exerccio 84. Seja G um grafo nas condic~oes do exerccio 69 e seja M o conjunto construdo por
Visite vertices(G). Prove que G[M] n~ao contem circuito.
Exerccio 85. Seja C ⊆ G um circuito no grafo G. Prove que para qualquer U ⊆ V(G) vale que
|E(C) ∩ E(U,U)| n~ao pode ser mpar.
Exerccio 86. Seja k um numero natural. O k-cubo e o grafo cujo conjunto de vertices s~ao as
sequencias binarias de k bits e dois vertices s~ao adjacentes se e somente se as k-tuplas correspon-
dentes diferem exatamente em uma posic~ao. Determine o numero de vertices, arestas, o diametro e
a cintura do k-cubo. Determine os parametros α, ω e χ do k-cubo. Prove que o k-cubo e bipartido.
Caminhos mnimos em grafos com pesos nas arestas 35
110 111
011010
000 001
101100
Figura 2.3: Exemplo: o 3-cubo.
Exerccio 87. Prove que o seguinte algoritmo (que esta baseado numa busca em largura) funciona
corretamente. Determine a complexidade do algoritmo.
Algoritmo 6: Distancia(G,w).
Dado : um grafo G e um vertice w ∈ V(G).Devolve: distG(w, v) para todo v ∈ V(G).
marque todos elementos de V(G) n~ao-visitado;1
marque w visitado;2
insira w no m da la L;3
d[w]← 0;4
enquanto L 6= ∅ faca5
tome u o primeiro elemento da la L;6
para cada v ∈ NG(u) faca7
se v e n~ao-visitado entao8
marque v visitado;9
insira v no m da la L;10
d[v]← d[u] + 1;11
remova u de L;12
devolva d[ ].13
2.2 Caminhos mınimos em grafos com pesos nas arestas
Nesta sec~ao consideramos grafos com pesos nas arestas, esses grafos s~ao denidos por uma terna
(V, E, ρ) onde V e E s~ao os usuais conjuntos de vertices e arestas, respectivamente, e ρ : E(G)→ R+
e uma func~ao que atribui um peso a cada aresta de E.
O comprimento de um caminho P = x0, x1, . . . , xk em (V, E, ρ) e a soma dos pesos (compri-
mentos) das arestas do caminho
c(P) =
k−1∑i=o
ρ(xi, xi+1),
e a distancia entre dois vertices u e v e o comprimento do menor caminho com extremos u e v,
dist(u, v) = minc(P) : P e um caminho com extremos u e v
quando existe algum caminho, caso contrario convencionamos que dist(u, v) =∞ tal que valem (2.3)
e (2.4), pagina 29. Um caminho com extremos u e v de comprimento dist(u, v) <∞ e chamado de
caminho mınimo.
Esses grafos podem ser representados por lista de adjacencias com a lista de v contem os vertices
u ∈ V(G) tais que v, u ∈ E(G) junto com o peso ρ(u, v).
Exemplo 18. O diagrama da gura 2.4 representa um grafo com pesos nas arestas e uma lista de
adjacencias para esse grafo e representada na gura 2.5.
36 Caminhos, circuitos e caminhos mnimos
b
4
a
2
c
1
1 d
e
3
10f
3
8
Figura 2.4: Diagrama de um grafo com peso nas arestas. A distancia entre a e e e 10 e um caminho
mnimo e a, c, b, d, f, e.
b
1
4
f
3
e
d
10
a b c f
2
3 3
b
4
c
c e
1
e
ed
N:
Figura 2.5: Lista de adjacencias do grafo G no exemplo acima.
Exercıcios
Exerccio 88. Seja G um grafo com pesos nas arestas e s um vertice de G. Prove a seguinte variante
da desigualdade triangular (2.5): para todo v, u ∈ E(G)
distG(s, u) ≤ distG(s, v) + ρ(v, u). (2.15)
Exerccio 89. Suponha que P = v1, v2, . . . , vk e um caminho mnimo num grafo G. Prove que
Pi,j = vi, . . . , vj e um caminho mnimo com extremos vi e vj em G para quaisquer i, j com 1 ≤ i <j ≤ k.
Exerccio 90. Dados (V, E, ρ) e s ∈ V considere o problema de determinar dist(s, x) para todo
x ∈ V com a seguinte estrategia: declare s visitado e em cada passo visite o vertice n~ao visitado
mais proximo de um vertice ja visitado. Construa um exemplo de grafo com pesos nas arestas que
mostre que essa estrategia n~ao funciona.
2.2.1 Algoritmo de Dijkstra para caminhos mınimos
Suponha que s~ao dados G = (V, E, ρ) e um vertice s ∈ V. Queremos determinar distG(s, v), para
todo v ∈ V.As estruturas de dados que vamos usar s~ao: um vetor d[ ], uma estrutura para representar um
subconjunto S ⊆ V (pode ser um vetor de bits).
S: em qualquer ponto da execuc~ao do algoritmo o conjunto S identica os vertices v ∈ V que ja
tem a distancia dist(s, v) computada;
Caminhos mnimos em grafos com pesos nas arestas 37
d[ ]: em qualquer ponto da execuc~ao do algoritmo d[v] armazena um valor que signica
(a) ou a distancia dist(s, v) de s para v, caso v ∈ S;(b) ou d[v] e o comprimento de algum caminho com extremos s e v (n~ao necessariamente
o mnimo), caso v ∈ S;(c) ou d[v] =∞, caso v ainda n~ao tenha sido visitado.
O algoritmo que descrevemos a seguir recebe G e s como acima, determina distG(s, x), para todo
x ∈ V e funciona da seguinte forma. A inicializac~ao das estruturas de dados s~ao: S = ∅; d[s] = 0
pois s esta a distancia 0 dele mesmo; para qualquer vertice v 6= s temos d[v] =∞.
Algoritmo 7: Inicie(G, s).
seja S subconjunto vazio de V(G);1
para cada v ∈ V(G) faca d[v]←∞;2
d[s]← 0;3
Num determinado momento da execuc~ao, em que S 6= ∅, o conjunto S contem os vertices
cujas distancias ja est~ao determinadas. Nesse ponto, retiramos de S o vertice u que tem menor
valor de d[ ]), esse e o vertice de S (conjunto dos vertices com distancia ainda n~ao determinada
pelo algoritmo) mais proximo do vertice de sada s, portanto, sua distancia ca determinada pelo
valor de d[u] e podemos inser-lo em S. Em seguida, visitamos cada vizinho t de u (por (2.15)
dist(s, t) ≤ d[u] + ρ(u, t)) e testamos se um caminho de menor comprimento foi encontrado e se
for o caso, ent~ao atualizamos d[ ], essa etapa e chamada de Relaxac~ao
Algoritmo 8: Relaxac~ao(u, t).
se d[t] > d[u] + ρ(u, t) entao d[t]← d[u] + ρ(u, t).1
Note que a condic~ao na linha 1 do algoritmo 8 e sempre falsa para t ∈ S. O algoritmo prossegue,
ate que S = V. Esse algoritmo e conhecido como algoritmo de Dijkstra.
Algoritmo 9: Dijkstra(G, s).
Dado : um grafo G com pesos ρ nas arestas e um vertice s ∈ V(G).Devolve: distG(s, v) para todo v ∈ V(G).
Inicie(G, s);1
enquanto S n~ao-vazio faca2
seja u tal que d[u] = mind[v] : v ∈ S;3
insira u em S;4
para cada t ∈ N(u) faca5
Relaxac~ao(u, t).6
Uma demonstrac~ao formal de que o algoritmo funciona, isto e, no nal d[v] armazena as distancias
dist(s, v), para todo v ∈ V, e a complexidade do algoritmo s~ao determinados a seguir.
Analise e correcao do algoritmo de Dijkstra. Vamos mostrar que o algoritmo funciona cor-
retamente.
Proposicao 13. Em qualquer momento da execuc~ao de Dijkstra(G, s) valem os seguintes fatos
(a) d[v] ≥ dist(s, v) para todo v ∈ V e uma vez que d[v] = dist(s, v) o valor de d[v] nunca
mais muda.
(b) Se dist(s, v) =∞ ent~ao d[v] =∞ durante toda a execuc~ao.
Demonstrac~ao. Para provar (a) vamos supor o contrario e assumir que u ∈ V e o primeiro vertice
para o qual ocorreu que d[u] < dist(s, u) durante uma execuc~ao e seja v ∈ V o vertice que causou
a mudanca no valor de d[u] numa relaxac~ao, assim a relaxac~ao faz
d[u] = d[v] + ρ(u, v) (2.16)
38 Caminhos, circuitos e caminhos mnimos
e, nesse momento da execuc~ao d[v]+ρ(u, v) ≥ dist(s, v)+ρ(u, v) pois u foi a primeira ocorrencia
do fato suposto, ou seja,
dist(s, u) > d[u] = d[v] + ρ(u, v) ≥ dist(s, v) + ρ(u, v)
contradizendo a desigualdade (2.15).
Para provar (b) notemos que, por (a), d[v] ≥ dist(s, v) =∞.
Proposicao 14. Se P = s, x1, . . . , xk, v e um caminho mnimo e d[xk] = dist(s, xk) ent~ao apos
Relaxac~ao(xk, v) teremos d[v] = dist(s, v).
Demonstrac~ao. Apos Relaxac~ao(xk, v) temos d[v] ≤ d[xk] + ρ(xk, v) = dist(s, xk) + ρ(xk, v).
Pelo exerccio 89 dist(s, xk) + ρ(xk, v) = dist(s, v), portanto, d[v] ≤ dist(s, v). Pela proposic~ao
13(a), d[v] ≥ dist(s, v), portanto d[v] = dist(s, v).
A correc~ao do algoritmo segue do proximo resultado. Provaremos um invariante do laco en-
quanto. Esse invariante e uma propriedade que permanece valida a cada iterac~ao laco, independen-
temente do numero de vezes que e executado.
Teorema 15. Para todo k ∈ N, apos k iterac~oes enquanto na linha 2 vale que
d[v] = dist(s, v) para todo v ∈ S.
Demonstrac~ao. No incio, antes da primeira iterac~ao, temos S = ∅, portanto o teorema vale
trivialmente.
A prova e por contradic~ao. Suponha que
X = t ∈ N : apos a t-esima rodada existe u ∈ S tal que dist(s, u) 6= d[u] 6= ∅.
Pelo Princpio da Boa-Ordenac~ao, esse conjunto tem um mnimo. Seja k = minX, k ≥ 1. Seja
u o primeiro vertice inserido em S e com d[u] 6= dist(s, u), ou seja, o vertice inserido na k-esima
iterac~ao do laco. Seja P um caminho mnimo com extremos s e u em G. Esse caminho existe por
causa da armac~ao feita na proposic~ao 13(b).
Seja x, y ∈ E(G) a primeira aresta de P no sentido de s para u com x ∈ S e y ∈ S no momento
da execuc~ao imediatamente anterior a u entrar em S. Notemos que, nesse momento da execuc~ao,
u 6= s, logo S 6= ∅, e possvel termos x = s e y = u mas x 6= u.Agora, quando x entrou em S, antes de u, ocorreu Relaxac~ao(x, y) o que fez com que d[y] =
dist(s, y) pela proposic~ao 14 e por d[x] = dist(s, x). Como os pesos n~ao s~ao negativos e P e mnimo
dist(s, y) ≤ dist(s, u), ou seja
d[y] = dist(s, y) ≤ dist(s, u) ≤ d[u]
onde a ultima desigualdade vem da proposic~ao 13(a). Mas, d[u] ≤ d[y] pois ambos est~ao em S e u
foi escolhido, assim d[u] = dist(s, u) e temos uma contradic~ao.
A correc~ao do algoritmo de Dijkstra segue facilmente do teorema acima; cada iterac~ao remove
um vertice de S, logo apos |V | iterac~oes S = ∅, ou seja S = V(G), e a armac~ao do teorema e que
d[v] esta correto para todo v ∈ V(G). A prova de que Dijkstra, com uma pequena modicac~ao,
encontra um caminho mnimo e deixada para o exerccio 96.
Agora, vamos analisar a complexidade do algoritmo de Dijkstra, a qual Inicie(G, s) tem comple-
xidade O(|V |) e Relaxac~ao(u, t), O(1).
A complexidade do algoritmo de Dijkstra depende de como e determinado o mnimo na 3. O
laco da linha 2 sera excutado uma vez para cada u ∈ V(G); a contribuic~ao do laco da linha 2 para
a complexidade do algoritmo e ∑u∈V
T3(u) + T4(u) + T5,6(u)
Caminhos mnimos em grafos com pesos nas arestas 39
onde Ti(u) e o tempo gasto no linha i para u dado na linha 3. Se o mnimo e determinado fazendo
comparac~oes ent~ao em cada rodada o custo e |S|− 1, portanto,
∑u∈V
T3(u) =
|V |−1∑i=1
(i− 1) = O(|V |2).
Ademais∑u∈V T4(u) = O(|V |) e∑
u∈V
T5,6(u) =∑u∈V
∑v∈N(u)
O(1) = O(|E|).
Logo∑u∈V T3(u) + T4(u) + T5,6(u) = O(|V |2 + |E|), mesmo levando em conta a complexidade da
inicializac~ao.
Outra possibilidade e usar la de prioridades para determinar o mnimo: No caso de la
de prioridades implementada por heap binaria,
Q[ ]: la de prioridades com elementos de S e chave d[ ], o elemento de maior prioridade
corresponde ao de menor chave. O procedimento extrai mınimo de Q remove e devolve
o elemento de maior prioridade de Q.
Nesse caso, O(|V |) e o tempo para construir uma la de prioridade, portanto Inicie(G, s) tem
complexidade O(|V |). A remoc~ao da linha 3 tem o custo O(log(|S|)) de refazer a heap [7], logo
T3(u) = O(log |V |) para todo u ∈ V. Inserc~ao em S pode ser feita em tempo constante, ou seja,
T4(u) = O(1). Agora, T5,6(u) pode ser escrita como
T5,6(u) =∑
t∈N(u)
T6(u).
Cada vez que a linha 6 de Dijkstra e executada pode ser necessaria uma atualizac~ao da heap, da
seguinte forma
Q[t]← minQ[t], d[u] + ρ(u, t);
refaz heap.
Essa operac~ao toma tempo O(log |V |). Logo
∑u∈V
T3(u)+ T4(u)+ T5,6(u) =∑u∈V
O(log |V |) +O(1) + ∑t∈N(u)
O(log |V |)
= O ((|V |+ |E|) log |V |) .
Teorema 16. O algoritmo de Dijkstra sobre G = (V, E) tem complexidade = O ((|V |+ |E|) log |V |) .
Exercıcios
Exerccio 91. Construa um grafo com pesos que podem ser negativos e no qual algoritmo de
Dijkstra devolve resposta errada.
Exerccio 92. Suponha que o teste na linha 7 do algoritmos de Dijkstra seja mudado para |Q| > 1,
o que faria o laco ser executado |V |− 1 vezes ao inves de |V |. O funcionamento do algoritmo estaria
correto?
Exerccio 93. Na estimativa de T3(u) dissemos que T3(u) = O(log(|S|)) e depois superestimamos
tomando T3(u) = O(log |V |) para todo u. Usando a primeira estimativa, obteramos
∑u∈V
T3(u) =
|V |∑i=1
O(log i).
Prove que, assintoticamente, a alternativa usada n~ao e superestimada, isto e, prove que
n∑i=1
O(log i) = Θ(n logn).
40 Caminhos, circuitos e caminhos mnimos
Exerccio 94. Dado um grafo D com pesos ρ : E(D) → [0, 1] que representam a probabilidade de
uma aresta n~ao falhar. Escreva um algoritmo para descobrir o caminho mais seguro entre dois
vertices.
Exerccio 95. Seja D = (V, E, ρ) um grafo com peso ρ : E → 0, 1, . . . ,m nas arestas, m ∈ N xo.
Modique a la de prioridades do Dijkstra para computar distancia em tempo O(m|V |+ |E|).
Exerccio 96. Considere a seguinte variante do algoritmo de Dijkstra
Algoritmo 10: Dijkstra'(G, s).
Dado : um grafo G com pesos ρ nas arestas e um vertice s ∈ V(G).Devolve: distG(s, v) para todo v ∈ V(G).
Inicie(G, s);1
para cada v ∈ V(G) faca p[v]← nil;2
enquanto S n~ao-vazio faca3
seja u tal que d[u] = mind[v] : v ∈ S ;4
para cada t ∈ N(u) faca5
se d[t] > d[u] + ρ(u, t) entao6
d[t]← d[u] + ρ(u, t);7
p[t]← u.8
O seguinte algoritmo recebe um grafo com pesos nas arestas e um par de vertices w, v desse grafo
e devolve uma sequencia de vertices v1, v2, . . . , vk, com v1 = w e vk = v.
Algoritmo 11: Imprime caminho mnimo(G,w, v).
Dado : um grafo G vertices w, v ∈ V(G).Devolve: caminho mnimo com extremos w e v, quando existe.
Dijkstra'(G,w);1
enquanto p[v] 6= nil faca2
empilhe v em L;3
v← p[v];4
imprima w;5
enquanto L 6= ∅ faca imprima (desempilhe(L)).6
Prove que a resposta de Imprime caminho mnimo(G,w, v) e um caminho mnimo com extremos
w e v. (Dica: prove que a sequencia e um passeio, que o passeio tem comprimento mnimo e conclua
que o passeio e um caminho.)
2.2.2 Algoritmo de Floyd–Warshall para caminhos mınimos
Seja G = (V, E, ρ) um grafo com pesos nas arestas. Nesta sec~ao vamos apresentar um algoritmo
para resolver o seguinte problema: dado G = (V, E, ρ) computar distG(i, j) para todos i, j ∈ V.Notemos que isso pode ser feito atraves de Dijkstra(G, v) para todo v ∈ V.
Suponha que G seja representado pela matriz
ai,j =
0 se i = j
ρ(i, j) se i, j ∈ E∞ caso contrario.
(2.17)
Antes de apresentarmos o algoritmo precisamos de algumas denic~oes. Para todo k ∈ 0, 1, . . . , |V |
denotamos por [k] o subconjunto 1, 2, . . . , k ⊆ V, com [0] = ∅. Dizemos que o caminho P =
i, v0, . . . , vt, j e um [k]-caminho se o seus vertices internos v0, . . . , vt pertencem a [k]. Com isso
podemos denir uma variante da distancia que chamaremos de [k]-distancia entre i e j como o
comprimento do menor [k]-caminho com extremos i e j e e denotada por distk(i, j), com dist0(i, j) =
ai,j.
Caminhos mnimos em grafos com pesos nas arestas 41
4
5
23
2
12
2 10 1
Figura 2.6: Exemplo dos conceitos denidos acima.
Exemplo 19. O seguinte diagrama representa um grafo com pesos nas arestas. O unico [0]-caminho
com extremos 3 e 4 e 3, 4; os [1]-caminhos com extremos 3 e 4 s~ao 3, 4 e 3, 1, 4; os [2]-caminhos com
extremos 3 e 4 s~ao 3, 4 e 3, 1, 4 e 3, 2, 4 e 3, 1, 2, 4 e 3, 2, 1, 4; esses s~ao tambem todos os [3]-caminhos
e [4]-caminhos com extremos 3 e 4.
No grafo representado acima temos d0(3, 4) = 5, d1(3, 4) = 4 e d2(3, 4) = d3(3, 4) = d4(3, 4) = 3.
Tambem, d0(1, 2) = d1(1, 2) = d2(1, 2) = 10, d3(1, 2) = 4 e d4(1, 2) = 3.
Notemos que d0(i, j) e dado por ai,j denido em (2.17).
Suponha que conhecemos os valores de distk(i, j) para algum k > 0 e para todos os pares
(i, j) ∈ V×V. Podemos obter distk+1 a partir de distk da seguinte maneira. Por denic~ao, a [k+1]-
distancia e o comprimento do menor [k + 1]-caminho e a [k]-distancia e o comprimento do menor
[k]-caminho; a diferenca entre esses caminhos e que no primeiro, os [k+ 1]-caminhos, e possvel que
o vertice k+ 1 seja vertice interno e no segundo n~ao, pois [k+ 1] = [k] ∪ k+ 1. Dessa forma,
distk+1(i, j) = mindistk(i, j),distk(i, k+ 1) + distk(k+ 1, j)
. (2.18)
Resumindo, da matriz de adjacencias temos a [0]-distancia e, para todo k ∈ [|V |−1], a partir da [k]-
distancia sabemos determinar a [K+1]-distancia. Repetindo esse procedimento podemos determinar
as [|V |]-distancias, que nada mais e do que a distancia usual.
Escrevendo de outra forma ca:
Algoritmo 12: FloydWarshall(G)
Dado : um grafo G com peso ρ nas arestas.
Devolve: distG(i, j) para todos i, j ∈ V(G).
para cada (i, j) ∈ V2 faca1
dist0(i, j)← ai,j, onde ai,j e como em (2.17);2
para cada k de 1 ate |V | faca3
para cada (i, j) ∈ V2 faca4
distk(i, j)← mindistk−1(i, j),distk−1(i, k) + distk−1(k, j).5
Analise e correcao do algoritmo de Floyd–Warshall. A correc~ao segue de (2.18).
Teorema 17. A complexidade do algoritmo de FloydWarshall com entrada G = (V, E) e
O(|V |3).
Exercıcios
Exerccio 97. Determine disti(j, k) para toda terna (i, j, k) ∈ V3 no grafo da gura 2.6.
42 Caminhos, circuitos e caminhos mnimos
Exerccio 98. A seguinte vers~ao do algoritmo de FloydWarshall funciona corretamente? Justique.
Algoritmo 13: FloydWarshall(G)
Dado : um grafo G com peso ρ nas arestas.
Devolve: distG(i, j) para todos i, j ∈ V(G).
para cada (i, j) ∈ V2 faca1
dist(i, j)← ai,j;2
para cada k de 1 ate |V | faca3
para cada (i, j) ∈ V2 faca4
dist(i, j)← mindist(i, j),dist(i, k) + dist(k, j).5
Exerccio 99. Escreva um algoritmo O(|V |3) que determina a cintura de um grafo G = (V, E).
CAPıTULO 3
CONEXIDADE
Neste captulo, apresentamos a classe dos grafos conexos, grafos com quaisquer dois vertices
ligados por um caminho. Tambem, apresentamos uma medida de conexidade de grafos, abordamos
problemas algortmicos quando for pertinente e por m mostramos um exemplo de como cons-
truir grafos de alta conexidade, ou seja, que tolera um grande numero de remoc~oes sem tornar-se
desconexo e com o numero mnimo de arestas possvel.
3.1 Grafos conexos
Um grafo G e conexo se e n~ao-vazio e quaisquer dois vertices de G s~ao extremos de um caminho
em G.
Dizemos que H e um subgrafo conexo maximal de G se n~ao existe um subgrafo conexo F ⊆ G tal
que H ⊂ F. Os subgrafos conexo maximais de um grafo qualquer s~ao os componentes conexos do
grafo. Por exemplo, no grafo do exemplo 1 temos quatro componentes conexos, a saber, induzidas
pelos conjuntos de vertices 1, 2, 5, 3, 4, 6, 7 e 8.
Uma denic~ao equivalente de componente conexo e a seguinte. A relac~ao binaria sobre V(G)
denida por u ∼G v se, e somente se, existe um caminho com extremos u e v em G e uma relac~ao de
equivalencia. As classes de equivalencia dessa relac~ao s~ao os vertices dos componentes componentes
conexos de G.E facil de ver que se G n~ao-vazio e desconexo ent~ao ha pelo menos dois subconjuntos de vertices
U e W disjuntos tais que E(U,W) = ∅. A recproca dessa armac~ao n~ao vale no caso geral
(justique), mas e valida quando W = U.
Proposicao 18. Um grafo e conexo se e somente se E(U,U) 6= ∅ para todo subconjunto proprio
e n~ao-vazio de vertices U.
Demonstrac~ao. Se G e conexo e U um subconjunto proprio e n~ao-vazio de V(G), para qualquer
u ∈ U e qualquer w ∈ U existe em G um caminho com extremos u e w e pelo menos uma aresta
desse caminho deve estar em E(U,U).
Por outro lado, suponha que E(U,U) 6= ∅ para todo subconjunto proprio e n~ao-vazio U ⊂ V(G).Denimos U(v) como o conjunto de todos os vertices w ∈ V(G) para os quais existe um caminho
com extremos v e w em G e vamos mostrar que U(v) = V(G) o que, claramente, signica que G e
conexo.
Suponha U(v) 6= V(G). De v ∈ U(v) temos que U(v) e n~ao-vazio. Como E(U(v), U(v)
)6= ∅,
existe x ∈ U(v) e x, y ∈ E(U(v), U(v)
)e nesse caso y ∈ U(v) por denic~ao de U(v), contradizendo
x, y ∈ E(U(v), U(v)
). Portanto, U(v) = V(G).
Se G e um grafo e e uma aresta de G, ent~ao denimos o grafo obtido pela remoc~ao de e por
G − e =(V, E \ e
). (3.1)
Proposicao 19. Se G = (V, E) e conexo ent~ao G− e e conexo para toda aresta e que pertence
a algum circuito de G.
Demonstrac~ao. Seja G um grafo conexo, e = v1, v2 uma aresta de G e C = v1, v2, . . . , vk, v1 um
circuito de G ao qual pertence a aresta e. Vamos mostrar que G− e e conexo. Vamos denotar por
C− e o caminho v2, . . . , vk, v1 em G− e.
Sejam u e v dois vertices quaisquer de G e vamos denotar u = u1 e v = um.
Seja P = u1, u2, . . . , um um caminho em G com extremos u e v. Se e 6∈ E(P) ent~ao P ⊆ G − e,
caso contrario e = uj, uj+1, para algum j, e u1, . . . , uj−1, C − e, uj+2, . . . , um e um passeio em
G− e com extremos u e v (veja exerccio 76). Logo G− e e conexo.
44 Conexidade
Se G e um grafo e v um vertice de G, ent~ao denimos o grafo obtido pela remoc~ao de v por
G − v =(V \ v, E \ E(v)
). (3.2)
Um vertice v ∈ V num grafo conexo G = (V, E) e chamado de articulacao (ou vertice de corte)
se a remoc~ao do vertice v e das arestas de E(v) em G resulta num grafo desconexo, isto e, o grafo
G− v e desconexo.
Um grafo sem articulac~oes e chamado de biconexo. Os subgrafos biconexos maximais de um
grafo G qualquer s~ao chamados de componentes biconexos de G.
Exemplo 20. No grafo do diagrama na gura 3.1 s~ao articulac~oes os vertices 1, 3, 7, 9. Os com-
3
5 2
46
7
8
9 10
11 12
13
1
Figura 3.1: 1, 3, 7, 9 s~ao articulac~oes.
ponentes biconexos s~ao os subgrafos induzidos pelos conjuntos de vertices: 1, 13, 1, 2, 3, 4, 5, 6,
3, 7, 7, 8, 9, 10 e 3, 9, 11, 12.
3
7 7
8
9 10
3
9
11 12
13
1
3
5 2
46
1
Figura 3.2: Os seis componentes biconexos do grafo exibido na gura acima.
3.1.1 Articulacoes
Na discuss~ao que segue tratamos do problema computacional: dado G conexo, determinar as
articulac~oes de G. Consideramos um grafo conexo G com pelo menos 3 vertices e usaremos a vers~ao
rotulada da busca em profundidade, o algoritmo 5, para determinar as articulac~oes de um grafo.
Notemos que numa execuc~ao de BP(G,w), como o grafo e conexo, todos os vertices ser~ao visitados.
Baseados em (1.20) estabelecemos a seguinte nomeclatura. Se existe algum inteiro t ∈ N tal
que pai(t)[v] = u ent~ao dizemos que u e ancestral de v ou que v e descendente de u. No caso
particular de pai[u] = v dizemos que u e filho de v. Vamos chamar de patriarca o vertice inicial
de um percurso em profundidade, isso e, o unico vertice v ∈ V que tem pai[v] = nil.
Observac~ao 10. Do exerccio 72 podemos estabelecer as seguintes equivalencias
(a)[chega[v], sai[v]
]∩[chega[u], sai[u]
]= ∅ v n~ao e descendente de u,
nem u e descendente de v
(b)[chega[v], sai[v]
]⊂[chega[u], sai[u]
]v e descendente de u
(c)[chega[v], sai[v]
]⊃[chega[u]sai[u]
]u e descendente de v
e sabemos (proposic~ao 10) que para quaisquer dois vertices distintos u, v ∈ V(G) exatamente uma
das possibilidades acima vale apos a execuc~ao do algoritmo.
Grafos conexos 45
Para facilitar a referencia, reproduzimos abaixo o algoritmo de busca rotulada apresentado na
sec~ao 1.7.2
Algoritmo 14: BP(G,w).
Dado : um grafo G e um vertice w.
Devolve: busca em profundidade em G a partir de w com rotulos chega, sai e pai em cada
vertice.
cont← cont+ 1;1
chega[w]← cont;2
para cada u ∈ N(w) faca3
se chega[u] = 0 entao4
pai[u]← w;5
BP(G,u);6
cont← cont+ 1;7
sai[w]← cont.8
Nas linhas 3 e 4 do algoritmo 14 testamos para cada u ∈ N(w) se chega[u] = 0, ou seja se u n~ao
foi visitado. Se a condic~ao e falsa, ent~ao dizemos que a aresta w,u e uma aresta de retorno.
Em outras palavras, aresta de retorno e toda aresta que n~ao e da forma v, pai[v] apos uma busca
em profundidade como no algoritmo 14.
Exemplo 21. A gura 3.3 a seguir ilustra as denic~oes que acabamos de ver com uma busca em
profundidade no grafo do exemplo 20 dado pela listas de adjacencias ordenadas em ordem crescente
e a ordem em que os vertices s~ao visitados e representada de cima para baixo e da esquerda para a
direita.
1
2
3
4
5
7
6 12
8 10
13
9
11
Figura 3.3: Vis~ao esquematica de uma busca em profundidade no grafo do exemplo 20. O vertice
1 e o patriarca da busca, as arestas tracejadas s~ao arestas de retorno, 2 e ancestral de 11 pois
2 = pai(3)[11] = pai[pai[pai[11]
]]e, reciprocamente, 11 e descendente de 2.
O nosso objetivo e caracterizar, usando uma busca em profundidade, os vertices de um grafo
conexo que s~ao articulac~oes. Antes, vamos provar dois resultados simples. Lembramos que estamos
assumindo G conexo e com pelo menos tres vertices.
Consideremos a execuc~ao de uma busca em profundidade rotulada BP(G,w).
Proposicao 20. Se x, y ∈ E(G) ent~ao ou x e descendente de y ou y e descendente de x.
Demonstrac~ao. Podemos supor x, y aresta de retorno, o outro caso e imediato.
Se chega[x] < chega[y] ent~ao na primeira vez que a aresta x, y e visitada e a partir de y
(corresponde a u = x ew = y na linha 3 do algoritmo 14) e nesse momento x ainda esta na pilha, pois
a aresta x, y ainda n~ao foi visitada a partir de x. Portanto chega[x] < chega[y] < sai[y] < sai[x]
e pela observac~ao 10 y e descendente de x.
Se chega[y] < chega[x] ent~ao deduzimos de maneira analoga que x e descendente de y.
46 Conexidade
Proposicao 21. Se v1 e v2 s~ao lhos de u ent~ao n~ao ha descendente de v1 adjacente a
descendente de v2, para qualquer u ∈ V(G).
Demonstrac~ao. Se v1 e v2 s~ao lhos de u ent~ao v1 n~ao e descendente de v2 nem v2 e de v1, ou
seja,[chega[v1], sai[v1]
]∩[chega[v2], sai[v2]
]= ∅.
Se u e um descendente de v1 ent~ao chega[v1] ≤ chega[u] < sai[u] ≤ sai[v1]. Se w e
um descendente de v2 ent~ao chega[v2] ≤ chega[w] < sai[w] ≤ sai[v2]; logo conclumos que[chega[u], sai[u]
]∩[chega[w], sai[w]
]= ∅ e pelo resultado anterior u,w 6∈ E(G).
O seguinte resultado caracteriza as articulac~oes com relac~ao a uma busca em profundidade. A
partir desta caracterizac~ao escreveremos um algoritmo que determina as articulac~oes de um grafo
conexo.
Teorema 22. Seja G um grafo n~ao-trivial. O vertice u ∈ V(G) e uma articulac~ao se e somente
se numa busca em profundidade
(1) u e patriarca e tem mais de um lho; ou
(2) u n~ao e patriarca mas tem um lho v tal que nenhuma arestas de retorno dos descen-
dentes de v tem como outro extremo um ancestral proprio de u.
Demonstrac~ao. Vamos provar que se vale a armac~ao (1) ou (2) do enunciado para o vertice
u ∈ V(G) ent~ao u e uma articulac~ao.
Suponha que u e patriarca com mais de dois lhos e sejam v1 e v2 dois desses lhos. Como n~ao
ha descendente de v1 adjacente a descendente de v2 todo caminho com extremos v1 e v2 passa por
u, ou seja, o grafo G − u e desconexo pois nele n~ao ha caminho com extremos v1 e v2; assim u e
articulac~ao.
Suponha agora que u n~ao e patriarca e seja w o pai[u]. Seja v0 um lho de u com descendentes
v1, v2, . . . , vk. Pela proposic~ao 21 qualquer caminho com extremos vi (i ∈ 0, 1, . . . , k) e w ou tem
u como vertice interno ou tem uma aresta de retorno vj, x, para algum j ∈ 0, 1, . . . , k e x ancestral
proprio de u. Se tais arestas n~ao existem ent~ao todo caminho com extremos w e um descendente
de v0 passa por u assim em G− u e desconexo.
Agora, vamos supor que u e uma articulac~ao de um grafo G n~ao-trivial e consideremos uma
execuc~ao de BP(G,w). Sejam x e y dois vertices de G que n~ao s~ao extremos de caminho em G−u.
Todo caminho em G com extremos x e y s~ao da forma x, z1, z2, . . . , zk, u, zk+1, . . . , zt, y.
Sabemos que ou (i) x e descendente de y, ou (ii) y e descendente de x ou (iii) nem x e descendente
de y, nem y de x. No caso (i) temos, pelo fato de u ser articulac~ao e pela proposic~ao 21, que u
e ancestral de x e e descendente de y, logo ha um caminho x, z1, z2, . . . , zk, u, zk+1, . . . , zt, y com
nenhuma aresta sendo de retorno. Se houver uma arestas de retorno entre um descendente de zk e
um ancestral de zk+1 ent~ao em G − u havera cominho com extremos x e y. O caso (ii) e analogo,
portanto, n~ao ha tais arestas de retorno.
Resta o caso em que nem x e descendente de y, nem y de x. Notemos que u e um ancestral
comum de x e y. Nesse caso, tome z o ancestral comum de x e y com maior valor de chega[ ]. Se
z = w ent~ao u = w e, portanto, u e patriarca e tem pelo menos 2 lhos. Se u n~ao e patriarca,
consideremos um caminho x, z1, z2, . . . , zk, u, zk+1, . . . , zt, y com todas as arestas com extremos pai-
e-lho. Como todo caminho entre x e y contem u e G−u e desconexo ent~ao zk n~ao tem descendente
adjacente a um ancestral de u ou zk+1 n~ao tem descendente adjacente a um ancestral de u.
Exemplo 22. Considere a representac~ao graca da gura 3.3. O vertice 1 e uma articulac~ao pelo
caso (1) do lema. O vertice 3 cai no caso (2) com v = 7 e 9 cai no caso (2) com v = 10 (note que
v = 11 n~ao serve para classicar 9 no caso (2)).
Pelo teorema 22, para determinar se u ∈ V(G) e uma articulac~ao basta executar um busca em
profundidade a partir de qualquer vertice, testar se o patriarca tem mais de um lho e se todo
vertice tem todo lho com um descendente adjacente a um ancestral. A seguinte func~ao e uma
Grafos conexos 47
busca em profundidade modicada para identicar articulac~oes baseada no teorema 22. O valor
devolvido por esta func~ao com argumento w ∈ V(G) e
m = minchega[x] : x e ancestral de u adjacente a um descendente de u, para todo u lho de w.
(3.3)
Notemos que se u e lho de w e m ≥ chega[w], ent~ao w e articulac~ao pelo teorema 22.
Funcao BP-Art(G,w).
cont← cont+ 1;1
chega[w]← cont;2
min← cont;3
para cada u ∈ N[k] faca4
se chega[u] = 0 entao5
m← BP(u);6
se m < min entao min← m;7
se m ≥ chega[w] entao art[w]← art[w] + 1;8
senao se chega[u] < min entao min← chega[u];9
devolva(min).10
Analise e correcao do algoritmo BP-Art. O algoritmo e, essencialmente, uma busca em
profundidade.
Teorema 23. A complexidade para determinar as articulac~oes de G = (V, E) e O(|V |+ |E|).
Para provar que o algoritmo funciona corretamente, vamos provar que art[w] = 0 se e somente
se w n~ao e uma articulac~ao.
Note que art[w] so e incrementado se vale a condic~aom ≥ chega[w], ondem e o valor retornado
por BP(G,u) quando u e um lho de w, isso signica que para toda aresta x, y, onde y e um
descendente de u e x um ancestral de w vale que chega[x] ≥ chega[w]; pelo teorema 22 isso signica
que w e uma articulac~ao.
Exercıcios
Exerccio 100. Prove que se todos os vertices de G conexo tem grau par ent~ao G n~ao tem aresta
de corte, ou seja, uma aresta cuja remoc~ao resulta num grafo desconexo.
Exerccio 101. Mostre que se ∆(G) ≤ 2 ent~ao os componentes conexos de G ou s~ao caminhos ou
s~ao circuitos.
Exerccio 102. Seja H um subgrafo gerador de G. Mostre que se H e conexo ent~ao G e conexo.
Exerccio 103. Seja G um grafo com n vertices. Considere os graus dos vertices em ordem crescente,
δ(G) = d1 ≤ d2 ≤ · · · ≤ dn = ∆(G). Mostre que se dk ≥ k vale para todo k com 0 < k < n−∆(G),
ent~ao G e conexo.
Exerccio 104. Seja G o grafo denido sobre o conjunto de vertices 0, 1, . . . , n−1 com u, v ∈ E(G)se, e somente se, u− v ≡ ±k mod n.
1. De um condic~ao necessaria e suciente sobre n e k para que G seja conexo.
2. Determine o numero de componentes conexos em func~ao de n e k.
Exerccio 105. Escreva um algoritmo com complexidade O(|V |+ |E|) que determine os componentes
biconexos de um grafo.
Exerccio 106 (Teorema de Brooks, 1941). Prove que se G e conexo, n~ao e completo e n~ao e um
circuito mpar ent~ao
χ(G) ≤ ∆(G).(Dica: induc~ao na ordem do grafo.)
48 Conexidade
3.2 Conexidade de grafos
Dado um subconjunto U ⊂ V(G) denotamos por G−U o subgrafo induzido por V(G) \U. Para
todo k ∈ N, dizemos que um grafo G e k-conexo se
|V(G)| > k e
para todo U ⊂ V(G), se |U| < k ent~ao G−U e conexo.
Claramente, todo grafo n~ao-vazio e 0-conexo. Ainda, todo grafo n~ao-trivial conexo e 1-conexo e
todo grafo biconexo com pelo menos tres vertices e 2-conexo. Alem disso, segue imediatamente da
denic~ao que todo grafo k-conexo tambem e `-conexo para todo natural ` < k.
Exemplo 23. O grafo do diagrama abaixo e 0-conexo, 1-conexo e 2-conexo mas n~ao e 3-conexo
porque a remoc~ao do conjunto de vertices e, d resulta num grafo desconexo.
c
eb
d
a1
2
3 4
5
A conexidade de G e o maior inteiro k para o qual G e k-conexo
κ(G) = maxk ∈ N : G e k-conexo
. (3.4)
No exemplo 23 temos κ(G) = 2. Para o grafo completo com n vertices temos κ(Kn) = n − 1
para todo n > 1.
Analogamente, podemos denir a aresta conexidade de um grafo. Denotamos por G− F o grafo
(V, E \ F). Dizemos que G e k-aresta-conexo se
|V(G)| > 1 e
para todo F ⊂ E(G), se |F| < k ent~ao G− F e conexo.
O grafo do exemplo 23 e 0-aresta-conexo, 1-aresta-conexo, 2-aresta-conexo e 3-aresta-conexo,
mas n~ao e 4-aresta-conexo.
Segue da denic~ao que todo grafo n~ao-trivial e 0-aresta-conexo, todo grafo n~ao-trivial e conexo
e 1-aresta-conexo. Ainda, todo grafo k-aresta-conexo e `-aresta-conexo para todo natural ` < k.
A aresta-conexidade de G e o maior inteiro k para o qual G e k-aresta-conexo.
λ(G) = maxk ∈ N : G e λ(G) = max
k ∈ N : G e k-aresta-conexo
. (3.5)
No exemplo 23 temos λ(G) = 3.
Notemos que o grafo completo com n > 1 vertices n~ao e n-aresta-conexo pois a remoc~ao de
todas as arestas de E(v), para qualquer v, torna esse vertice isolado. De uma maneira mais geral,
temos que λ(G) ≤ δ(G). No exemplo 23 vale que λ(G) < δ(G).
Usando o fato descrito no paragrafo acima no teorema 1, pagina 8, podemos deduzir que o
numero de arestas num grafo e
|E(G)| ≥ 12|V(G)|λ(G), (3.6)
logo, o numero mnimo de arestas num grafo k-aresta-conexo e
|E(G)| ≥ k2|V(G)|. (3.7)
Qual e o menor numero de arestas que um grafo k-conexo pode ter? Veremos que esse numero e
k|V(G)|/2. Antes demonstraremos o seguinte resultado.
Conexidade de grafos 49
Teorema 24. Para todo G com pelo menos 2 vertices
λ(G) ≥ κ(G). (3.8)
Demonstrac~ao. Vamos provar por induc~ao que para todo k ∈ N a seguinte sentenca e verdadeira
para qualquer grafo G com pelo menos 2 vertices:
se λ(G) = k ent~ao κ(G) ≤ k. (3.9)
Primeiro provamos a base da induc~ao. A sentenca vale para k = 0 pois se λ(G) = 0 ent~ao G e
desconexo e, portanto, κ(G) = 0.
Para um k ≥ 1 xo assumimos, por hipotese, que se λ(G) = k − 1 ent~ao κ(G) ≤ k − 1 para
qualquer grafo G com pelo menos 2 vertices.
Fixamos G um grafo qualquer com pelo menos 2 vertices e λ(G) = k. Vamos mostrar que
κ(G) ≤ k.Pela denic~ao de aresta-conexidade sabemos que existe F ⊆ E(G) com |F| = k e G− F desconexo.
Escolha uma aresta qualquer e ∈ F e consideremos o grafo G− e.
Pela escolha de e, no grafo G − e existe F ′ ⊂ E(G − e) tal que |F ′| = k − 1 e (G − e) − F ′ e
desconexo. Ainda, λ(G − e) = k − 1 pois o grafo G − e n~ao pode ter um subconjunto de arestas
de cardinalidade k − 2 cuja remoc~ao desconecta G − e; caso contrario G teria um subconjunto de
arestas de cardinalidade < k cuja remoc~ao o tornaria desconexo.
Pela denic~ao de conexidade ou |V(G− e)| = κ(G− e) + 1 ou existe U ⊂ V(G− e) com κ(G− e)
vertices e (G− e) −U desconexo. Pela hipotese indutiva temos que κ(G− e) ≤ k− 1.No primeiro caso temos |V(G)| = |V(G − e)| ≤ k, portanto κ(G) < k, ou seja, a sentenca (3.9)
acima vale.
No segundo caso vale que, ou G−U e desconexo e temos κ(G) ≤ |U| ≤ k− 1, ou G−U e conexo
e a remoc~ao de e torna G − U desconexo e temos que se e = xy ent~ao G − U − x e desconexo,
portanto κ(G) ≤ |U| + 1 ≤ k. Notemos que G − U − x = K1 n~ao ocorre pois, nesse caso, teramos
|V(G)| = |U|+ 2 = |V(G− e)|+ 1, uma contradic~ao.
Pelo Princpio do Induc~ao Finita a sentenca (3.9) vale para todo k ∈ N e isso prova o teorema.
Da equac~ao 3.6 e do teorema que acabamos de provar tiramos que para todo G com pelo menos
dois vertices
|E(G)| ≥ 12|V(G)|κ(G). (3.10)
Portanto, o numero mnimo de arestas num grafo k-conexo e
|E(G)| ≥ k2|V(G)|.
Observac~ao 11. Algoritmos ecientes para determinar a conexidade s~ao baseados no teorema de
Menger (veja exerccio 118) e tecnicas de uxo em redes (sec~ao 6.4).
Exercıcios
Exerccio 107. Determine κ(G) e λ(G) nos casos Pk, Ck, Kk, k-cubo (denido no exerccio 86), e
Km,n.
Exerccio 108. De uma cota inferior para o grau medio de um grafo k-conexo com n vertices.
Exerccio 109. E verdade que se G e k-aresta-conexo ent~ao |E(U,U)| ≥ k para todo U ⊂ V(G)
n~ao-vazio?
Exerccio 110. Prove que se G e 3-regular ent~ao κ(G) = λ(G).
Exerccio 111. Prove que todo grafo k-conexo (k ≥ 2) com pelo menos 2k vertices contem um
circuito de comprimento maior ou igual a 2k.
Exerccio 112. Prove que todo grafo 2-conexo minimal contem um vertice de grau 2.
50 Conexidade
Exerccio 113. Prove que se δ(G) ≥ |V(G)|− 2 ent~ao κ(G) = δ(G).
Exerccio 114. Prove que se δ(G) ≥ |V(G)|/2 ent~ao λ(G) = δ(G).
Exerccio 115. Prove ou de um contra-exemplo: dado k ≥ 1, se G e k-conexo ent~ao para todo
U ⊆ V(G) com |U| > k o subgrafo G[U] e k-conexo.
Exerccio 116. Dado um grafo G qualquer, n~ao necessariamente conexo, os blocos do grafo G s~ao:
1. os subgrafos 2-conexo maximais de G,
2. as arestas de corte e
3. os vertices de grau zero.
A partir de G construmos o grafo de blocos de G, denotado por BG da seguinte forma: BG tem
um vertice para cada bloco de G e um vertice para cada articulac~ao dos componentes conexos de
G. As arestas s~ao dadas pelos pares vb, onde v corresponde a um vertice de corte de G e b um
bloco de G, de forma que \v ∈ b", isto e, o vertice de corte (articulac~ao) em G correspondente a v
pertence ao bloco de G que corresponde a b. A gura abaixo mostra um grafo e o grafo de blocos
correspondente.
x
y y
x
(a) (b)
Figura 3.4: (a) Um grafo com articulac~oes x e y e (b) seu grafo de blocos.
Prove que
(a) cada aresta de G pertence a um unico bloco,
(b) G e a uni~ao de seus blocos,
(c) dois blocos distintos de G tem no maximo um vertice em comum,
(d) se x ∈ V(G) e um vertice que pertence a dois blocos de G ent~ao x e um vertice de corte.
Exerccio 117. Descreva um algoritmo que determina os blocos de um grafo. Qual a complexidade
do algoritmo?
Exerccio 118 (Teorema de Menger, 1927). Prove que G e k-conexo (k ≥ 1) se e somente se para
quaisquer u, v ∈ V(G) existem k caminhos disjuntos nas arestas que ligam u a v.
Exerccio 119. Vale a vers~ao do Teorema de Menger para k-aresta-conexidade?
3.2.1 Construcao de grafos k-conexos minimais
Nessa sec~ao vamos mostrar como construir grafos de uma dada conexidade e com o menor
numero possvel de arestas. Dados k ≥ 2 e n > k vamos construir o grafo Hn,k = (V, E) sobre
V =0, 1, . . . , n− 1
com ⌈
k|V(G)|
2
⌉arestas. O conjunto de arestas de Hn,k depende da paridade de k:
1. Se k e par, digamos k = 2r, ent~ao
E =i, j : − r ≤ j− i ≤ r com as operac~oes modulo n
.
Conexidade de grafos 51
2. Se k e mpar, digamos k = 2r+ 1, ent~ao
(2.1) Se n e par,
E = E(Hn,k−1) ∪i, i+ (n/2) : 1 ≤ i ≤ n/2
.
(2.2) Se n e mpar,
E = E(Hn,k−1) ∪0, (n− 1)/2, 0, (n+ 1)/2
∪i, i+ (n+ 1)/2 : 1 ≤ i < (n− 1)/2
.
Para determinar |E(Hn,k)|, no caso (1) as arestas s~ao dadas pelo equac~ao (1), onde k = 2r. O grau
do vertice i e o numero de inteiros modulo n no intervalo [i− r, i+ r], que corresponde ao proprio
i, ou seja, 2r. Assim, 2|E(Hn,k)| = nk pelo Teorema 1. No outro caso, deixamos a vericac~ao para
o leitor.
Lema 25. O grafo Hn,k e k-conexo.
Demonstrac~ao. Nesta demonstrac~ao as operac~oes aritmeticas nas quais os operandos s~ao vertices
s~ao feitas modulo n.
Para mostrar que esse grafo e k-conexo, k = 2r, suponhamos que exista U ⊂ V(Hn,k) com
|U| < 2r e Hn,k − U desconexo. Tome dois vertices i e j em componentes distintas de Hn,k − U e
considere as sequencias de vertices S = (i, i + 1, i + 2, . . . , j − 1, j) e T = (j, j + 1, j + 2, . . . , i − 1, i),
onde as adic~oes s~ao modulo n. Desde que |U| < 2r temos que |U ∩ S| < r ou |U ∩ T | < r. Vamos
assumir que |U ∩ S| < r, o outro caso e analogo. Com isso, podemos deduzir que existe em S \ U
uma subsequencia P = i0, . . . , it de vertices distintos tais que i0 = i, it = j e |i` − i`+1| ≤ r (mod
n), logo i` e i`+1 s~ao adjacentes para todo 0 ≤ ` < t. De fato, considere a sequencia de vertices
i, i + r, i + 2r, . . . , i + tr em S, onde t e o menor natural tal que i + (t − 1)r < j ≤ i + tr. Como
|U| < r podemos escolher i` tal que i+ (`− 1)r < i` ≤ i+ `r.Tal sequencia P e um caminho com extremos i e j, o que contradiz o fato deles estarem em
componentes distintas.
Agora, suponha k = 2r + 1 com n par e que exista U ⊂ V(Hn,k) com |U| ≤ 2r e Hn,k − U
desconexo. Tome dois vertices i e j em componentes distintas de Hn,k−U e considere as sequencias
de vertices S e T como acima. Se |U ∩ S| < r ou |U ∩ T | < r ent~ao temos um caminho de i ate j por
deduc~ao analoga ao caso anterior. Vamos assumir que |U ∩ S| = r e que |U ∩ T | = r.Pra n~ao haver uma sequencia como a P denida acima, e preciso que os r vertices de U em S
sejam vertices consecutivos i+ s+ 1, i+ s+ 2, . . . , i+ s+ r. Analogamente, os r vertices de U em T
devem ser consecutivos, digamos j+t+1, j+t+2, . . . , j+t+r. Nesse caso, i e um vertice do caminho
Q = j+t+r+1, j+t+r+2, . . . , i+s e j e um vertice do caminho R = i+s+r+1, i+s+r+2, . . . , j+t.
Resta notar que deve haver uma aresta da forma v, v + (n/2) com v em R e v + (n/2) em Q,
contradizendo o fato de i e j pertencerem a componentes conexos distintos.
Finalmente, o caso n mpar e k mpar e deixado como exerccio para o leitor.
Exemplo 24. Abaixo temos, respectivamente, os diagramas dos grafos H8,4, H8,5 e H9,5.
0
1
45
6
7
8
2
3
0
1
2
3
4
7
6
5
0
1
2
3
4
7
6
5
52 Conexidade
3.3 Grafos eulerianos e grafos hamiltonianos
Em 1796 Euler resolveu o problema conhecido como as sete pontes de Konigsberg no que
e considerando o primeiro resultado em Teoria dos Grafos. O problema e decidir se e possvel
atravessar cada uma das pontes uma unica vez e retornar ao ponto de partida (veja a gura na
pagina 5). Em outras palavras, dado um grafo queremos saber se existe um passeio fechado onde
toda aresta ocorre exatamente uma vez. Grafos que admitem tal passeio s~ao ditos eulerianos.
Analogamente, podemos considerar o caso de decidir se um grafo com pelo menos tres vertices
contem um circuito gerador. Grafos que admitem uma resposta positiva s~ao ditos hamiltonianos.
Neste captulo apresentamos essas famlias de grafos e veremos que os eulerianos s~ao facilmente ca-
racterizados por uma propriedade que pode ser testada ecientemente, enquanto que n~ao e conhecida
uma boa caracterizac~ao de grafos hamiltonianos.
3.3.1 Grafos eulerianos
E possvel desenhar a gura abaixo sem tirar o lapis do papel e sem repetir nenhum traco?
Vamos reformular essa pergunta na terminologia de Teoria dos Grafos. Dizemos que num grafo
G = (V, E) uma sequencia alternada verticearestavertice que n~ao repete arestas
v0e1v1 . . . vk−1ekvk, (3.11)
com ei = vi−1, vi ∈ E, para todo i ∈ 1, 2, . . . , k, e ei 6= ej para todo i 6= j, e chamada de trilha.
Se em (3.11) temos v0 = vk, ent~ao dizemos que a trilha e uma trilha fechada. Uma trilha que
passa por todas as arestas do grafo e chamada de trilha euleriana e uma trilha fechada que passa
por todas as arestas do grafo e chamada de trilha euleriana fechada. Um grafo que contenha
uma trilha euleriana fechada e dito grafo euleriano.
Observac~ao 12. Num grafo a sequencia dada em (3.11) pode ser representado por
v0v1 . . . vk−1vk,
com vi−1, vi ∈ E. No entanto, tudo o que e dito nesta sec~ao vale tambem para multigrafos e, nesse
sentido, vieivi+1 e dirente de vifivi+1 para ei e fi arestas distintas com extremos vi e vi+1.
Exemplo 25. O seguinte diagrama representa o grafo que modela o problema dado no comeco da
sec~ao
1
2
3 4
5 6
a
b
ef
g
h
i
dc
Figura 3.5: Exemplo: 1a2b3c4d2 e 4d2b3c4e5f3 s~ao trilhas no grafo.
Grafos eulerianos e grafos hamiltonianos 53
Teorema 26 (Teorema de Euler, 1735). Um grafo conexo e euleriano se, e somente se, todo
vertice tem grau par.
Demonstrac~ao. Se um grafo conexo e euleriano, ent~ao todo vertice ocorre numa trilha euleriana
fechada T ; um vertice que ocorre k vezes na trilha T tem grau 2k.
Por outro lado, suponha que um grafo conexo tem todos os seus vertice de grau par. Seja
T = v0e1v1 . . . v`−1e`v` uma trilha com o maior numero possvel de arestas, com isso a trilha
contem todas as arestas cujos extremos s~ao os vertices v0 e v`. Como todos os vertices tem grau
par v0 = v`.
Agora, suponha que e e uma aresta que n~ao aparece na trilha. Note que podemos assumir e = uvipara algum vi ∈ T , pois o grafo e conexo. Mas, isso implica que ueviei+1 . . . e`v`e1v1 . . . ei−1vi e
uma trilha com mais arestas que T . Portanto, T passa por todas as arestas do grafo.
Exercıcios
Exerccio 120. Mostre que se G tem no maximo dois vertices de grau mpar ent~ao G contem uma
trilha euleriana.
Exerccio 121. Mostre que se G e euleriano ent~ao LG (veja exerccio 17) e euleriano.
Exerccio 122. Um grafo euleriano pode ter uma aresta de corte?
Exerccio 123. Prove que um grafo conexo e euleriano se pode ser particionado em circuitos aresta-
disjuntos.
Exerccio 124. O algoritmo de Fleury, de 1883, descobre uma trilha euleriana fechada se o grafo
dado for euleriano.
Algoritmo 16: Fleury(G)
Dado : um grafo euleriano G.
Devolve: um trilha euleriana fechada.
S← ∅;1
escolha u ∈ V(G);2
enquanto E(G) 6= ∅ faca3
insira u no nal de S;4
escolha e = u,w ∈ E(G) e, se for possvel, de forma que G− e tenha o mesmo numero de5
componentes conexos que G;
u← w;6
G← G− e.7
devolva S.8
Prove que se G e euleriano ent~ao a trilha denida pela sequencia vertices adjacentes S =
(u1, u2, . . . , u`) construda pelo algoritmo e euleriana. Determine a complexidade do algoritmo.
3.3.2 Grafos hamiltonianos
Um circuito C ⊆ G e um circuito hamiltoniano em G se V(C) = V(G). Um grafo que contem
circuito hamiltoniano e chamado grafo hamiltoniano.
Exemplo 26. Um grafo que pode ser representado pelo seguinte diagrama e chamado de dodecaedro.
O dodecaedro e um grafo hamiltoniano, em particular, foi o grafo que deu origem ao termo.
Uma condic~ao necessaria para um grafo ser hamiltoniano e que a remoc~ao de um subconjunto
de vertices resulta num numero limitado de componentes conexos.
Proposicao 27. Se G e hamiltoniano, ent~ao o numero de componentes conexos de G − S e
no maximo |S| para todo S ⊂ V(G) n~ao-vazio.
54 Conexidade
Demonstrac~ao. Basta notar que o numero de componentes de G − S e no maximo o numero de
componentes de C− S que e no maximo |S| para todo circuito hamiltoniano C ⊆ G.
Vejamos um contra-exemplo para a recproca do resultado acima. O grafo de Petersen, mostrado
na gura abaixo, n~ao e hamiltoniano. Pode-se vericar caso-a-caso que a remoc~ao de qualquer
subconjunto proprio e n~ao-vazio de vertices S, o numero de componentes do grafo obtido e sempre
menor ou igual a |S|.
3
1
4
89
10 7
6
25
Figura 3.6: Grafo de Petersen.
Uma condic~ao suciente para um grafo ser hamiltoniano e o seguinte resultado.
Teorema 28 (Teorema de Dirac, 1952). Para todo grafo G = (V, E) com n ≥ 3 vertices, se
δ(G) ≥ n/2 ent~ao G e hamiltoniano.
Demonstrac~ao. Seja P = v0, . . . , vm o maior caminho em G e dena os conjuntos
A =vi ∈ V(P) : v0, vi+1 ∈ E
e B =
vj ∈ V(P) : v0, vj ∈ E
. (3.12)
Observamos que A e B s~ao subconjuntos de v0, v1, . . . vm−1 com pelo menos n/2 > (m− 1)/2
vertices e pelo Princpio da Casa dos Pombos A∩B 6= ∅. Escolha vk ∈ A∩B e considere o circuito
v0 v1 v2 vk vk+1 vmvm−1
C = v0, vk+1, . . . , vm, vk, . . . , v0.
Se C n~ao e hamiltoniano ent~ao existem u ∈ V(G)−V(C) e vj ∈ V(C) tais que u, vj ∈ E(G). Re-escrevendo o circuito C acima como u0 = vj, u1, . . . , um, u0 ent~ao temos o caminho u, u0, u1, . . . , umcom uma aresta a mais que P, absurdo. Logo C e hamiltoniano.
Claramente, nem todo grafo hamiltoniano tem grau mnimo alto, como contra-exemplo para a
recproca do resultado anterior basta considerar qualquer circuito com pelo menos 5 vertices, que e
hamiltoniano e 2-regular.
Grafos hamiltonianos n~ao s~ao, ate o momento, caracterizados por uma propriedade n~ao-trivial
que possa ser vericada ecientemente; decidir se um grafo e hamiltoniano e um problema NP-
completo.
Grafos eulerianos e grafos hamiltonianos 55
Exercıcios
Exerccio 125. Mostre que se G n~ao e 2-conexo ent~ao G n~ao e hamiltoniano.
Exerccio 126. Prove que se G e bipartido com bipartic~ao V(G) = A ∪ B onde |A| 6= |B|, ent~ao G
n~ao e hamiltoniano.
Exerccio 127. Mostre que o n-cubo e hamiltoniano para todo n ≥ 2.Exerccio 128. Um caminho hamiltoniano em G e um caminho que passa por todos os vertices
de G. Mostre que se G contem um caminho hamiltoniano ent~ao o numero de componentes conexos
de G− S e no maximo |S|+ 1, para todo subconjunto proprio de vertices S.
Exerccio 129. Prove que se G e tal que todo par de vertices u, v n~ao-adjacentes vale d(u)+d(v) ≥|V(G)|− 1, ent~ao G contem um caminho hamiltoniano.
Exerccio 130. Prove: d(u) + d(v) ≥ |V(G)| para todo par u, v de vertices n~ao adjacentes, ent~ao G
hamiltoniano se e somente se G+ uv hamiltoniano.
Exerccio 131. Mostre que se G e um grafo euleriano ent~ao LG e hamiltoniano. De um exemplo
onde a recproca n~ao vale.
Exerccio 132. De um exemplo de grafo com n vertices, grau mnimo bn/2c e n~ao-hamiltoniano,
para todo n ≥ 3.
56 Conexidade
CAPıTULO 4
ARVORES E FLORESTAS
Este captulo apresenta a classe dos grafos que s~ao conexos e, em certo sentido, minimais. Da
equac~ao (3.10), na pagina 47, podemos deduzir que um grafo de conexidade 1 sobre o conjunto de
vertices V tem pelo menos d|V |/2e arestas. N~ao e uma tarefa difcil nos convencermos de que grafos
com conexidade 1 e esse numero mnimo de arestas n~ao existem para |V |.3. Grafos conexos e com
o menor numero possvel de arestas s~ao estudados nesse captulo.
Apresentamos tambem o problema da arvore geradora de custo mnimo: dado um grafo conexo
com pesos nas arestas, determinar um um subgrafo gerador conexo minimal e, ainda mais, de custo
total mnimo. Este problema e bastante conhecido e estudado ha bastante tempo; apresentaremos
dois algoritmos para o problema: o algoritmo de Kruskal, proposto em 1956 por Joseph Kruskal, e
o algoritmo de Prim, de 1957 e devido a Robert Prim (o mesmo algoritmo foi inventado um tempo
antes, em 1930, pelo matematico Tcheco Vojtech Jarnk). O primeiro algoritmo para esse problema
de que se tem notcia e o algoritmo de Otakar Bor _uvka de 1926.
4.1 Arvores, definicao e caracterizacao
Uma floresta e um grafo sem circuitos. Os componentes conexos de uma oresta s~ao arvores,
ou seja, uma arvore e um grafo conexo e sem circuitos.
Notemos que o grau mnimo de toda arvore com pelo menos tres vertices e 1; isso porque se o
grau mnimo fosse pelo menos 2 ent~ao a proposic~ao 11 garante que o grafo teria circuito. Chamamos
de folha todo vertice de grau 1 numa arvore.
Antes de enunciar e provar uma caracterizac~ao vamos vamos denir mais uma operac~ao em grafo.
Sejam G um grafo e x, y ∈ V(G). Denotamos por G + xy o grafo
G+ xy =(V(G), E(G) ∪
x, y
).
Teorema 29. As seguintes armac~oes s~ao equivalentes para todo grafo G = (V, E):
(1) G e arvore;
(2) para quaisquer x, y ∈ V existe um unico caminho em G com extremos x e y;
(3) G e conexo minimal: G e conexo e G− e e desconexo, para qualquer e ∈ E;
(4) G e acclico maximal: G e acclico e G + xy contem circuito, para quaisquer x, y ∈ Vn~ao adjacentes em G.
Demonstrac~ao. Para G trivial o teorema vale trivialmente. Se G tem ordem 2 ent~ao G = K2 e a
vericac~ao e facil, deixa-mo-la para o leitor. Vamos supor que G tem pelo menos 3 vertices e vamos
mostrar (1)⇒(2)⇒(3)⇒(4)⇒(1).
Que (1)⇒ (2): Seja G uma arvore. Como G e conexo, existe um caminho P = x, x1, x2, . . . , xn, y.
Suponha que exista outro caminho Q = x, y1, y2, . . . , ym, y, Q 6= P. Dena x0 = y0 = x, xn+1 =
ym+1 = y e os ndices
p = mini : i ≥ 0 e xi+1 6= yi+1, eq = minj : j > p e xj = y` para algum ` > p.
Essesndices est~ao bem denidos, como os caminhos s~ao distintos 0 ≤ p < minm,n e p < q ≤ n+1.Agora, xp, xp+1, . . . , xq, y`−1, y`−2, . . . , yp e um circuito em G, uma contradic~ao. Assim, o caminho
com extremos x e y e unico.
Que (2)⇒ (3): Seja G tal que (2) vale. Por hipotese G e conexo. Para toda aresta e = x, y ∈ Etemos que P = x, y e o unico caminho com extremos x e y, portanto, G− e e desconexo.
58 Arvores e Florestas
Que (3) ⇒ (4): Seja G conexo minimal. Se G contem circuito, ent~ao para qualquer e ∈ E(G)que pertenca a um circuito temos que G−e e conexo (proposic~ao 19), uma contradic~ao. Agora, seja
x, y ∈ V n~ao adjacentes em G; como G e conexo existe um caminho, digamos P = x, v1, . . . , vk, y,
com extremos x e y. Em G+ xy temos o circuito x, v1, . . . , vk, y, x.
Que (4) ⇒ (1): Seja G um grafo acclico maximal. Como G e acclico so precisamos mostrar
que e conexo. Observamos que se n~ao existe caminho com extremos x e y, ent~ao x, y 6∈ E(G) logoG+ xy n~ao contem circuito, uma contradic~ao.
Dessa forma, ca estabelecida a equivalencia das proposic~oes.
Como consequencia do teorema 29 temos o seguinte corolario.
Corolario 30. Uma arvore com n vertices e um grafo conexo com o menor numero possvel
de arestas dentre todos os grafos conexos com n vertices.
O numero de arestas de caracteriza arvores. Por um lado temos o seguinte resultado.
Lema 31. Toda arvore com n vertices tem n− 1 arestas.
Demonstrac~ao. Vamos provar por induc~ao em n ≥ 1 que a seguinte armac~ao vale: se um grafo
com n vertices e uma arvore ent~ao o numero de arestas e n − 1. Se o grafo e trivial, isto e
n = 1, ent~ao o numero de arestas e 0. Dado n ≥ 2, vamos assumir que toda arvore com n − 1
vertices tem n− 2 arestas e seja G uma arvore com n vertices. Tome v ∈ V(G) uma folha de G. O
grafo G− v e uma arvore (justique) com n− 1 vertices e pela hipotese indutiva |E(G− v)| = n− 2.
Como |E(v)| = 1 e |E(G− v)| = |E(G) \ E(v)|, temos que |E(G)| = n− 1. Portanto, pelo Princpio de
Induc~ao Finita, a armac~ao vale para todo n ≥ 1.
Antes de provar a recproca desse resultado, introduziremos alguns conceitos.
Se o subgrafo gerador T ⊆ G e uma arvore ent~ao chamamos T de arvore geradora de G.
Todo grafo conexo tem uma arvore geradora: Seja G um grafo conexo e seja T ⊆ G um subgrafo
gerador de G, conexo e com o menor numero de arestas possvel. Se T contem circuito ent~ao para
qualquer aresta e de um circuito T − e e conexo e tem menos arestas que T , uma contradic~ao.
Desse fato, podemos concluir que a recproca do lema 31: suponha que G e conexo, com n
vertices e n− 1 arestas. Seja T ⊆ G uma arvore geradora de G. Como acabamos de mostrar T tem
n− 1 arestas, logo T = G. Decorre dessa igualdade que G e uma arvore.
Teorema 32. Um grafo com n vertices e uma arvore se, e somente se, e conexo e o numero
de arestas e n− 1.
Um algoritmo que recebe um grafo conexo e determina uma arvore geradora do grafo conexo
e facil e rapido e ja sabemos como fazer: e o subgrafo induzido pelo conjunto de arestas M =v, pai[v] : v ∈ V(G) e pai[v] 6= nil
, onde o vetor pai[ ] e determinado pela execuc~ao do algoritmo
5(veja os exerccios 69 e 84).
Exemplo 27. Um grafo conexo e uma arvore geradora determinada por uma busca em profundidade
BP(G, 1), algoritmo 5 s~ao mostrados na gura 4.1 abaixo.
G:
13
3
5 1 2
46
7 9 10
11 12
8
T :
1
13
2
3
4
5
9
11
12
7
108
6
Figura 4.1: T e a arvore geradora de G denida pelo vetor pai de uma busca em profundidade,
algoritmo 5.
Arvores geradoras de custo mnimo em grafos com pesos nas arestas 59
Exercıcios
Exerccio 133. Determine o numero de arestas de uma oresta com n vertices e com k componentes
conexos, em func~ao de n e k.
Exerccio 134. Desenhe todas as arvores n~ao-isomorfas com 5 vertices e todas as arvores n~ao-
isomorfas com 7 vertices e com grau maximo pelo menos 4.
Exerccio 135. Mostre que toda arvore T tem pelo menos ∆(T) folhas.
Exerccio 136. Prove que o conjunto de arestas pai[v], v denido por uma busca em profundidade
rotulada induz uma arvore.
Exerccio 137. Seja G um grafo. Mostre que as seguintes armac~oes s~ao equivalentes:
(a) G e conexo e |E(G)| = |V(G)|− 1;
(b) |E(G)| = |V(G)|− 1 e G n~ao contem circuito.
(c) G e uma arvore;
Exerccio 138. Considere uma oresta F com n vertices e m arestas.
(a) Qual e o numero maximo de vertices num componente conexo de F?
(b) Mostre que ha pelo menos maxn− 2m, 0 vertices de grau zero.
(c) Mostre que se m < n/2 ent~ao resta pelo menos um vertice de grau zero.
Exerccio 139. Seja T uma arvore, u e v dois vertices n~ao adjacentes em T e e ∈ E(T) uma aresta
do circuito em T + uv. Mostre que
T + uv − e =(V(T), E(T) ∪
u, v
\ e
)e uma arvore.
Dizemos que essa arvore foi obtida por uma operacao elementar a partir da arvore T .
Exerccio 140. Sejam T1, T2 ⊂ G arvores geradoras distintas de um grafo conexo G. Mostre que T2pode ser obtida a partir de T1 atraves de uma sequencia de operac~oes elementares.
Exerccio 141. Prove que se uma aresta e de corte (veja exerccio 100) num grafo G ent~ao ela
pertence a todas as arvores geradoras de G.
Exerccio 142. Seja T uma arvore de ordem t. Mostre que qualquer grafo com grau mnimo pelo
menos t− 1 contem um subgrafo isomorfo a T .
Exerccio 143. Mostre que se G e um grafo conexo ent~ao o grafo de blocos BG (exerccio 116) e
uma arvore.
Exerccio 144. Seja G um grafo conexo com n vertices e m arestas, m ≥ n. Se T ⊂ G e uma arvore
geradora de G ent~ao o numero de arestas de G que n~ao est~ao em T e m− n+ 1. Denotaremos por
e1, e2, . . . , em−n+1 tais arestas em E(G) \ E(T). Em T + ei temos um circuito que denotamos por
Ci, para todo 1 ≤ i ≤ m−n+ 1. Chamaremos C1, C2, . . . , Cm−n+1 de circuitos fundamentais de
G com respeito a T . Denimos 0 · Ci = ∅ e 1 · Ci = E(Ci). Mostre que para todo circuito C ⊂ Gexiste uma sequencia (b1, b2, . . . , bm−n+1) ∈ 0, 1m−n+1 tal que E(C) e dado por
b1 · C1 ⊕ b2 · C2 ⊕ · · · ⊕ bm−n+1 · Cm−n+1,
ou seja, todo circuito e combinac~ao linear de circuitos fundamentais. Dena um espaco vetorial a
partir das informac~oes acima.
4.2 Arvores geradoras de custo mınimo em grafos com pesosnas arestas
Dado um grafo conexo com pesos nas arestas G = (V, E, ρ), onde ρ : E → R, denimos o custo
de um subgrafo H ⊂ G como
c(H) =∑
e∈E(H)
ρ(e).
60 Arvores e Florestas
O problema no qual estamos interessados a partir de agora e: qual e o custo do subgrafo gerador
conexo de G \mais barato"? Em outras palavras, queremos determinar S ⊆ E(G) que induz uma
arvore geradora de G e tal que
c(G[S]) = minc(T) : T e arvore geradora de G
.
Uma arvore geradora de G de custo mnimo tambem e chamada de arvore geradora mınima
do grafo G.
A seguir apresentamos os algoritmos de JarnkPrim e Kruskal para o problema de determinar
uma arvore geradora mnima. Os algoritmos de JarnkPrim e Kruskal s~ao algoritmos gulosos, que
e uma tecnica de projeto de algoritmos para resolver problemas de otimizac~ao, esses algoritmos
baseam-se na escolha que parece ser a melhor no momento (otimo local) e terminam com a soluc~ao
otima (otimo global).
4.2.1 Algoritmo de Jarnık–Prim para arvore geradora mınima
O algoritmo de JarnkPrim recebe um grafo conexo G = (V, E, ρ) e devolve S ⊆ E tal que G[S]
e uma arvore geradora mnima de G. O algoritmo parte de um conjunto unitario, digamos U = v
para algum v ∈ V, e a cada rodada o algoritmo acrescenta a U o vertice de U que e extremo da
aresta de menor custo em E(U,U), ate que U = V. No nal, as arestas escolhidas induzem uma
arvore geradora mnima.
Algoritmo 17: JarnkPrim(G)
Dado : um grafo conexo G com pesos nas arestas.
Devolve: arvore geradora de custo mnimo.
escolha v ∈ V(G);1
U← v;2
S← ∅;3
enquanto U 6= V(G) faca4
escolha u,w ∈ E(U,U) de peso mnimo no corte;5
insira u,w em S;6
v← u,w ∩U;7
insira v em U;8
devolva (V, S).9
Notemos que esse algoritmo e uma ligeira modicac~ao do algoritmo 3 (pela proposic~ao 18 os
lacos desses dois algoritmos tem a mesma condic~ao) e, como sabemos, S induz uma arvore geradora
de G. Entretanto, n~ao sabemos se tal arvore e mnima.
Analise e correcao do algoritmo de Jarnık–Prim. Como no correc~ao do algoritmo de Dijks-
tra, usaremos a tecnica do invariante do laco.
Teorema 33. Para k ∈ N, apos k iterac~oes do enquanto na linha 4 vale que (U, S) e uma
subarvore de uma arvore geradora mnima de G.
Demonstrac~ao. Pela construc~ao do algoritmo, o par (U, S) e um grafo. Denote por Sk e Uk os
conjuntos S e U mantidos pelo algoritmo apos a k-esima iterac~ao do laco na linha 4. A prova e por
induc~ao em k.
Para k = 0 a armac~ao no enunciado vale pois S0 = ∅ e U0 = v e (U0, S0) e subarvore de toda
arvore geradora mnima de G.
Suponha que (Uk−1, Sk−1) e uma subarvore da arvore geradora mnima Tmin. Sejam w ∈ V(G)e u,w ∈ E(G) tais que Uk = Uk−1 ∪ w e Sk = Sk−1 ∪
u,w
. Vamos mostrar que (Uk, Sk) e
uma subarvore de alguma arvore geradora mnima de G.
Que (Uk, Sk) e uma arvore deixamos para a vericac~ao do leitor. Se u,w ∈ E(Tmin) ent~ao Tmin
contem (Uk, Sk), logo podemos supor que u,w 6∈ E(Tmin).
Arvores geradoras de custo mnimo em grafos com pesos nas arestas 61
Pelo teorema 29 o grafo Tmin + uw contem um circuito. Esse circuito tem uma aresta e ∈ETmin(Uk−1, Uk−1) pois u ∈ Uk−1 e w ∈ Uk−1, logo o unico caminho em Tmin com extremos u e w
deve conter uma aresta desse corte, portanto Tmin+uw− e e arvore geradora de G. Pela escolha do
algoritmo na linha 5 ρ(u,w) ≤ ρ(e) e como Tmin tem custo mnimo Tmin + uw − e e uma arvore
geradora de custo mnimo que contem Tk. O teorema segue do Princpio da Induc~ao Finita.
Como a cada rodada do laco um vertice e inserido em U, que comeca com um vertice, o laco
sera executado |V | − 1 vezes, apos o que U = V, portanto (U, S) e arvore geradora mnima de G.
Com isso terminamos a prova de correc~ao do algoritmo de JarnkPrim e passamos a estudar a
complexidade desse algoritmo.
A complexidade de tempo do algoritmo de JarnkPrim depende da implementac~ao do passo
5 do algoritmo. Se ordenamos as arestas o custo e O(|E| log |E|) (veja [7]) e cada busca na linha 5
gasta O(|E|). Assim o custo total e O(|E| log |E|) +O(|V ||E|) = O(|V ||E|). Tomando um pouco mais
de cuidado podemos melhorar o tempo do algoritmo signicativamente. Agora, vamos mostrar uma
implementac~ao do algoritmo de JarnkPrim de complexidade O(|E| log |V |). Vejamos como ca
usando uma la de prioridades implementada por uma heap binaria. O algoritmo usa dois vetores
indexados por V e uma la de prioridades:
chave[ ] em cada instante da execuc~ao do algoritmo chave[v] armazena o peso da aresta de menor
peso em E(U,U) ∩ E(v);
pai[ ] as arestas v, pai[v] s~ao as arestas escolhidas pelo algoritmo;
Q la de prioridades indexada por U e com chave chave[ ] | quanto menor o valor de chave maior
a prioridade.
O algoritmo ca assim:
escolha v ∈ V(G);para cada u ∈ V(G) facachave[u]←∞;
pai[u]← nil;chave[v]← 0;
U← ∅;construa uma la de prioridades Q indexada por V(G) e com prioridades chave[ ];
enquanto U 6= ∅ faca
u← extrai mnimo de U;
para cada t ∈ N(u) faca
se t ∈ U e ρ(u, t) < chave[t] entaochave[t]← ρ(u, t);
pai[t]← u.
As 7 primeiras linhas s~ao executadas em tempo O(|V |), incluindo-se a o tempo para construir a
la de prioridades. A analise agora segue como exatamente como no caso do algoritmo de Dijkstra,
resultando em O ((|V |+ |E|) log |V |) = O(|E| log |V |), pois o grafo e conexo.
Teorema 34. A complexidade do algoritmo JarnkPrim(G) e O(|E(G)| log |V(G)|).
4.2.2 Algoritmo de Kruskal para arvore geradora mınima
A ideia do algoritmo de Kruskal tambem e bastante simples, a cada passo escolhemos a aresta
mais barata dentre as que ainda n~ao foram escolhidas, desde que ela n~ao forme circuito com as
62 Arvores e Florestas
arestas ja escolhidas:
Algoritmo 18: Kruskal(G)
Dado : um grafo conexo G com pesos nas arestas.
Devolve: arvore geradora de custo mnimo.
S← ∅;1
F← la das arestas em ordem n~ao-decrescente de peso;2
para cada e ∈ F faca3
se S ∪ e n~ao induz circuito em G entao4
insira e em S;5
devolva (V, S).6
Analise e correcao do algoritmo de Kruskal. Vamos provar que o algoritmo de Kruskal
determina uma arvore geradora de custo mnimo de um grafo conexo e com pesos nas arestas.
Teorema 35. O grafo (V, S) devolvido por Kruskal(G) e uma arvore geradora mnima de G.
Demonstrac~ao. Dado G conexo e com pesos nas arestas, sejam S o conjunto construdo pelo algo-
ritmo e T uma arvore geradora mnima de G com o maior numero possvel de arestas em comum
com S. Vamos mostrar que E(T) = S.
Suponha S \ E(T) 6= ∅ e dena m = minj : ej ∈ S \ E(T), onde o mnimo e com relac~ao a
sequencia (e1, e2, . . . , em) em que as arestas foram inseridas no conjunto S pelo algoritmo.
Pelo teorema 29 T + em contem um circuito pois em /∈ E(T) e nesse circuito deve existir uma
aresta f que n~ao esta em S porque G[S] e acclico. O conjunto de arestas F = e1, . . . , em−1 ∪ f
esta em T , portanto, F n~ao induz circuito, mas como f n~ao foi escolhida pelo algoritmo de Kruskal
tem-se ρ(f) ≥ ρ(em).
Logo c(T − f+ em) ≤ c(T) e como T e de custo mnimo tambem T − f+ em e de custo mnimo e,
ainda, com mais arestas em comum com S que T , contrariando a escolha de T , portanto S\E(T) = ∅,ou seja S ⊆ E(T). Para concluir, E(T) \ S = ∅ pois, dado que S ⊆ E(T), qualquer e ∈ E(T) satisfaza condic~ao da linha 4 do algoritmo.
Notemos que enquanto o conjunto S evolui de ∅ ate denir uma arvore geradora ele sempre dene
uma sub oresta de G, ou seja, uma colec~ao de subconjuntos disjuntos de vertices (os componentes
conexos) e o teste na linha 4 acima verica se a aresta e = x, y n~ao liga vertices do mesmo conjunto
(caso contrario, teremos um circuito) e nesse caso, na linha 5, une o conjunto onde esta o vertice
x com o conjunto do vertice y. Assim, precisamos de estruturas de dados que, dinamicamente,
representem e manipulem conjuntos disjuntos de modo eciente. Estruturas como essa s~ao conhe-
cidas na literatura como estruturas para uni~ao-e-busca (union-nd) ou estruturas de dados para
conjuntos disjuntos (veja apendice A.2.2). Essas estruturas mantem dinamicamente uma famlia
de subconjuntos disjuntos com um elemento de cada subconjunto eleito como o representante do
subconjunto e temos as operac~oes
faz(x) cria o conjunto unitario x, com representante x;
busca(x) devolve o representante do conjunto ao qual x pertence;
uni~ao(x, y) substitui os conjuntos que contem x e y pela uni~ao desses conjuntos (e determina um
representante para essa uni~ao).
Dentre as estruturas de dados mais ecientes para implementar conjuntos disjuntos, chamamos
a atenc~ao para uma delas: a representac~ao por oresta com as heursticas uni~ao por rank e busca
com compress~ao de caminhos (veja A.2.3, pagina 95). Essa representac~ao com as heursticas
mencionadas tem um excelente desempenho assintotico.
Arvores geradoras de custo mnimo em grafos com pesos nas arestas 63
Denotamos por lg∗(n) o numero de vezes que temos que iterar a func~ao lg ate que o valor obtido
seja menor ou igual a 1, por exemplo, lg∗ 216 = 4. Estimativas apontam que o numero de atomos
no universo observavel e 1080 e lg∗ 1080 = 4.
O seguinte resultado e demonstrado no apendice, teorema 66 na sec~ao A.2.3.
Teorema 36. A complexidade de m operac~oes faz/busca/uni~ao, das quais as n primeiras
s~ao faz, onde n e o numero de elementos do conjunto universo, e O((m+ n) lg∗(n)).
Reescrevendo o algoritmo de Kruskal com as considerac~oes feitas acima sobre estruturas de dados
para conjuntos disjuntos
S← ∅;F← la das arestas em ordem n~ao-decrescente de peso;
para cada v ∈ V(G) faca faz(v);
para cada u, v ∈ F faca
se busca(u) 6= busca(v) entaoinsira u, v em S;
uni~ao(u, v);devolva (V, S).
Nesse caso, o numero de operac~oes faz, busca e uni~ao no algoritmos de Kruskal e menor
que 2(|E| + |V |). A complexidade de tempo do algoritmo de Kruskal e O((|E| + |V |) lg∗ |V |) para as
operac~oes (teorema 36) mais O(|E| log |E|) para a ordenac~ao das arestas; resultando
Corolario 37. A complexidade de Kruskal(G) e O(|E| log |E|).
Exercıcios
Exerccio 145. Seja G um grafo conexo com pesos na arestas. Prove que se e e uma aresta de peso
mnimo em G ent~ao e pertence a alguma arvore geradora mnima de G.
Exerccio 146. Seja G um grafo conexo com pesos na arestas. Prove que se e e uma aresta de
peso maximo em G e pertence a um circuito de G ent~ao existe uma arvore geradora mnima de
(V(G), E(G) \ e) que tambem e uma arvore geradora mnima de G. Mostre que o mesmo vale para
toda aresta de peso maximo de todo circuito de G.
Exerccio 147. Seja G um grafo conexo com pesos na arestas. Prove que para qualquer U ( V(G)n~ao-vazio, a aresta de menor custo em E(U,U) tem que pertencer a toda arvore geradora de G.
Exerccio 148. Seja T ⊂ G uma arvore geradora de um grafo G com pesos nas arestas. Mostre que
T e uma arvore geradora mnima se e somente se para toda e ∈ E(G) \ E(T), o unico circuito C de
T + e e tal que todas as arestas de C custam n~ao mais que ρ(e).
Exerccio 149. Mostre que se para todo corte em G existe uma unica aresta de custo mnimo no
corte, ent~ao a arvore geradora de custo mnimo de G e unica. A recproca dessa armac~ao vale?
Justique.
Exerccio 150. Seja G um grafo conexo com pesos positivos nas arestas. Para toda arvore geradora
mnima T e todo caminho P ⊂ T , P e um caminho mnimo em G?
Exerccio 151. Mostre que para toda arvore geradora mnima T ⊂ G existe uma ordenac~ao nas
arestas de G tal que T e a arvore devolvida pelo algoritmo de Kruskal.
Exerccio 152. Suponha que todos os pesos das arestas de G s~ao positivos. Mostre que qualquer
subconjunto de arestas que induz um subgrafo conexo e tem peso total mnimo e uma arvore. De
um exemplo com pesos n~ao-positivos onde a conclus~ao n~ao vale.
Exerccio 153. Considere a seguinte estrategia generica para computar uma arvore geradora de
custo mnimo. Seja G = (V, E, ρ) um grafo conexo com pesos nas arestas. Dado S ⊂ E(G), dizemos
64 Arvores e Florestas
que uma aresta de u, v ∈ E(G) e boa para S se S ∪u, v
⊂ E(T) para alguma arvore geradora
mnima T de G.
Algoritmo 19: AGM(G)
Dado : um grafo conexo G com pesos nas arestas.
Devolve: arvore geradora de custo mnimo.
S← ∅;1
enquanto G[S] n~ao e arvore geradora faca2
escolha uma aresta f boa para S em E(G) \ S;3
insira f em S;4
devolva (V, S).5
(a) Primeiro, suponha que sempre existe pelo menos uma aresta boa pra ser escolhida em
cada iterac~ao do enquanto e que um oraculo entrega essa aresta para algoritmo sempre
que a linha 3 e executada. Prove que AGM(G) constroi uma arvore geradora mnima
de G. (Dica: determine e prove um invariante para o laco.)
(b) Agora, vamos provar que sempre ha uma aresta boa pra ser escolhida pelo oraculo.
Prove que se T e uma arvore geradora mnima de G e S ⊂ E(T) ent~ao para todo
U ⊂ V(G) tal que o corte E(U,U) n~ao contem arestas de S, uma aresta u, v de custo
mnimo no corte E(U,U) e boa para S. (Dica: dados G, S, T como no enunciado, tome
U e e ∈ E(U,U) como enunciado e considere 2 casos, se e ∈ E(T) e se e 6∈ E(T).)(c) Por m, use o resultado do exerccio acima para dar uma prova da correc~ao dos algoritmos
de JarnkPrim e Kruskal, isto e prove que esses algoritmos sempre escolhem arestas boas.
CAPıTULO 5
EMPARELHAMENTOS
Emparelhamento em um grafo nada mais e do que um conjunto independente de arestas; e
um dos topicos mais estudados da Teoria dos Grafos devido a ampla variedade de aplicac~oes (uma
referencia que aborda profundamente esse tema e [21]). Os primeiros estudos conhecidos s~ao de
G. Monge de 1784 e o caso de grafos bipartidos teve seus fundamentos estabelecidoso por Frobenius
e por Konig, por volta de 1915. Neste captulo o conceito de emparelhamento e apresentado na
primeira sec~ao e na segunda sec~ao a enfase e dada ao caso especial de emparelhamentos em grafos
bipartidos. Por m, tratamos de aspectos algortmicos em grafos bipatidos.
5.1 Emparelhamento
Num grafo G = (V, E), dizemos que M ⊆ E e um emparelhamento se as arestas de M s~ao
duas-a-duas n~ao-adjacentes, ou seja, e ∩ f = ∅ para quaisquer e, f ∈ M. De modo equivalente,
chamamos M de emparelhamento se G[M] e um subgrafo 1-regular.
Exemplo 28. Considere o grafo dado pelo diagrama da gura 5.1 abaixo. O conjunto M =2, 4, 5, 6
e um emparelhamento; note que n~ao ha arestas do emparelhamento com extremo
nos vertices 1 e 3.
1
2
3 4
5 6
Figura 5.1: M =2, 4, 5, 6
e um emparelhamento no grafo representado acima.
Seja G um grafo eM um emparelhamento em G. Quando um vertice v ∈ V(G) pertence a alguma
aresta e ∈ M, dizemos que v e coberto por M. Dessa forma, pela denic~ao de emparelhamento,
quando v e coberto por M existe uma unica aresta e ∈ E(v) ∩M. Se todo elemento de V(G) e
coberto por alguma aresta de M, ent~ao M e chamado de emparelhamento perfeito em G.
Ha grafos que n~ao admitem emparelhamento perfeito como, por exemplo, os circuitos de compri-
mento mpar; de fato, qualquer emparelhamento em C` tem no maximo b`/2c arestas, logo circuitosde comprimento par admitem emparelhamento perfeito, mas os de comprimento mpar n~ao. No
exemplo da gura 5.1 o emparelhamento1, 2, 4, 5, 3, 6
e perfeito, assim como o emparelha-
mento1, 2, 3, 5, 4, 6
.
Um emparelhamento em G com o maior numero possvel de arestas e chamado de emparelha-
mento maximo, isto e, um emparelhamento com
µ(G) = max|M| : M e emparelhamento em G
(5.1)
arestas.
Exemplo 29. No caso dos circuitos C` e facil ver que µ(C`) = b`/2c. O mesmo vale para grafos
completos µ(Kn) = bn/2c. No caso de caminhos, µ(P`) = b`/2c para todo ` > 0.
66 Emparelhamentos
No estudo de emparelhamentos em grafos surge um tipo especial de caminho, onde as arestas
alternam entre aresta do emparelhamento e aresta fora do emparelhamento. Um caminho P =
x1, x2, . . . , xk, para k ≥ 1, em G cujas arestas alternam entre as arestas de E(G) \M e as arestas de
M isto e, xi, xi+1 6∈M se i e mpar e
xi, xi+1 ∈M se i e par,
para todo i ∈ 1, 2, . . . , k− 1, e chamado de M-alternante.
Se os extremos de um caminho M-alternante n~ao s~ao cobertos por M ent~ao chamamos esse
caminho de M-aumentante. Como o nome sugere, a existencia de um caminho M-aumentante P
em G signica que podemos obter um emparelhamento em G com mais arestas que M.
Exemplo 30. Na gura 5.1 temos M =2, 4, 5, 6
e o caminho M-aumentante P com E(P) =
1, 2, 2, 4, 4, 5, 5, 6, 6, 3. A diferenca simetrica desses conjuntos e(
2, 4, 5, 6∪1, 2, 2, 4, 4, 5, 5, 6, 6, 3
)\(
2, 4, 5, 6∩1, 2, 2, 4, 4, 5, 5, 6, 6, 3
)=1, 2, 4, 5, 6, 3
que e um emparelhamento com uma aresta a mais que M.
Proposicao 38. Sejam G um grafo, M um emparelhamento em G e P um caminho M-
aumentante. A diferenca simetrica M4E(P) = (M∪ E(P)) \ (M∩ E(P)) e um emparelhamento
em G com uma aresta a mais que M.
Demonstrac~ao. Sejam G, M e P como no enunciado. De P e M-aumentante
|M4E(P)| = |(M ∪ E(P)) \ (M ∩ E(P))|=
∣∣(M \ (M ∩ E(P)))∪(E(P) \ (M ∩ E(P))
)∣∣= |M|− |M ∩ E(P)|+ |E(P)|− |M ∩ E(P)|= |M|− |M ∩ E(P)|+ |M ∩ E(P)|+ 1= |M|+ 1.
Resta provar que M4E(P) e emparelhamento. Suponha que n~ao, ent~ao existem duas arestas de
M4E(P) adjacentes, digamos que e, f ∈M4E(P) com e∩f = x. Dessa forma, x deve ser um vertice
interno em P, portanto, deve estar coberto por uma aresta g ∈ M, logo x ∈ e ∩ g e ambas arestas
est~ao em M, absurdo.
O seguinte teorema e uma caracterizac~ao de emparelhamento maximo em func~ao dos caminhos
aumentantes. Esse resultado e fundamental no projeto de um algoritmo eciente que determina
emparelhamentos maximos; mais adiante veremos esse algoritmo para grafos bipartidos.
Teorema 39 (Teorema de Berge, 1957). Um emparelhamento M em G e maximo se, e somente
se, G n~ao contem caminho M-aumentante.
Demonstrac~ao. Vamos mostrar que se um emparelhamento n~ao e maximo ent~ao ha um caminho
aumentante. A recproca dessa armac~ao e a proposic~ao acima.
Seja M um emparelhamento que n~ao e maximo e M∗ um emparelhamento maximo. Considere
o subgrafo induzido pelas arestas dos dois emparelhamentos H = G[M ∪M∗]. Como ∆(H) ≤ 2 oscomponentes conexos de H s~ao circuitos e caminhos (exerccio 101).
Os circuitos tem que ser de comprimento par, por denic~ao de emparelhamento. Se todos
os caminhos tiverem comprimento par ent~ao teremos |M| = |M∗|, logo existe um caminho P de
comprimento mpar e com mais arestas de M∗ o que implica que os extremos do caminho n~ao s~ao
cobertos por M. Esse caminho e M-aumentante em G.
Emparelhamentos e coberturas em grafos bipartidos 67
Exercıcios
Exerccio 154. Prove que uma arvore qualquer tem no maximo um emparelhamento perfeito.
Exerccio 155. Considere um grafo G de n vertices. Mostre que um emparelhamento em G tem no
maximo n/2 arestas.
Exerccio 156. Mostre que o k-cubo admite emparelhamento perfeito, para todo k ≥ 2.Exerccio 157. Duas pessoas jogam um jogo sobre um grafo G alternadamente selecionando vertices
distintos v0, v1, v2, . . . tais que, para i > 0, vi e adjacente a vi−1. O ultimo jogador que conseguir
selecionar um vertice vence o jogo.
Mostre que o primeiro jogador tem uma estrategia para vencer o jogo se e somente se o grafo G
n~ao tem um emparelhamento perfeito.
Exerccio 158. Mostre que µ(G) = α(LG) (veja a denic~ao de LG no exerccio 17).
Exerccio 159. Prove que seM e emparelhamento em G ent~ao existe um emparelhamento maximo
que cobre todos os vertices cobertos por M.
Exerccio 160 (Teorema de Tutte, 1947). Denotemos ci(G) o numero de componentes conexos do
grafo G com um numero mpar de vertices. Mostre que se G tem um emparelhamento perfeito se,
e somente se, ci(G− S) ≤ |S| para todo conjunto S de vertices.
5.2 Emparelhamentos e coberturas em grafos bipartidos
Por toda esta sec~ao adotaremos as seguintes convenc~oes: as partes de vertices independentes de
um grafo bipartido G s~ao denotadas por A e B e escrevemos G = (A∪B, E), tambem, convencionamos
que caminhos M-alternante tem um extremo descoberto em A.
Uma cobertura por vertices em um grafoG (n~ao necessariamente bipartido) e um subconjunto
U ⊆ V(G) tal que e ∩U 6= ∅ para toda aresta e ∈ E, ou seja, toda aresta de G encontra U.
Exemplo 31. No exemplo da gura abaixo temos o diagrama de um grafo bipartido, as arestas
em destaque denem um emparelhamento M. O subconjunto de vertices a1, a2, b3, b4 e uma
cobertura pois todas as arestas do grafo tem pelo menos um desses vertices como extremo.
a5a4a3a2a1
b4b3b2b1
Uma cobertura mınima e uma cobertura com o menor numero possvel de vertices que e
denotado por ν(G),
ν(G) = min|U| : U e cobertura por vertices em G
. (5.2)
Teorema 40 (Teorema de Konig, 1931). Num grafo bipartido G = (A ∪ B, E) o tamanho de um
emparelhamento maximo e igual ao tamanho de uma cobertura mnima, ou seja
µ(G) = ν(G). (5.3)
Demonstrac~ao. Para qualquer cobertura U e qualquer emparelhamentoM vale que toda aresta de
M tem que ter pelo menos um extremo em U, portanto |M| ≤ |U|. Em particular,
µ(G) ≤ ν(G). (5.4)
68 Emparelhamentos
Agora, considere M um emparelhamento maximo em G e vamos construir uma cobertura C ⊆V(G) da seguinte maneira: para cada aresta a, b ∈ M, onde a ∈ A e b ∈ B, escolhemos b para
C se b e extremo de algum caminho M-alternante, caso contrario, escolhemos a. Note que dessa
forma temos |C| = |M| = µ(G).
Vamos mostrar que C e uma cobertura. Considere uma aresta qualquer a, b ∈ E(G), ondea ∈ A e b ∈ B, e vamos mostrar que essa aresta encontra C. Se a, b ∈M ent~ao a aresta encontra
C. Vamos supor que a, b n~ao e aresta deM. ComoM e maximo, ou a ou b ou ambos s~ao cobertos
por M, caso contrario teramos um caminho M-aumentante.
Se M n~ao cobre a ent~ao b pertence ao um caminho M-alternante P = a, b e como b e coberto
por M, nesse caso, b ∈ C.Vamos supor que M cobre a e a, b ′ ∈ M para algum b ′ ∈ B, b ′ 6= b. Se a ∈ C ent~ao n~ao ha
o que provar. Agora, se a 6∈ C ent~ao b ′ ∈ C, mas isso signica que b ′ esta no extremo de algum
caminho M-alternante que denotamos por P. Se b esta em P ent~ao b e extremo de um caminho
M-alternante e com isso b ∈ C. Caso contrario, tambem havera um caminho M-alternante com
extremo b: ou P, a, b no caso a 6∈ V(P), ou P ′, b caso a ∈ V(P), onde P ′ denota um subcaminho
alternante de P com um extremo em a. Em ambos os casos teremos b ∈ C pois, comoM e maximo,
n~ao pode haver caminho M-aumentante em G. Em todos os casos a aresta a, b encontra C,
portanto, C e cobertura. Logo |C| ≥ ν(G) e
µ(G) ≥ ν(G). (5.5)
Das equac~oes (5.4) e (5.5) conclumos que ν(G) = µ(G).
Observac~ao 13 (Cobertura em grafos n~ao-bipartidos). O teorema de Konig n~ao vale para grafo
n~ao-bipartido, como mostra o K3, por exemplo, nele µ(K3) = 1 enquanto que ν(K3) = 2. Computar
a cobertura mnima em grafos n~ao-bipartidos e um problema NP-difcil (exerccio 175) enquanto
que µ pode ser computado em tempo polinomial (veja [13]).
O seguinte resultado da uma condic~ao necessaria e suciente para que exista um emparelhamento
que cobre umas das partes de um grafo bipartido.
Teorema 41 (Teorema de Hall, 1935). Em todo grafo bipartido G = (A ∪ B, E) existe um
emparelhamento que cobre A se, e somente se,
|N(S)| ≥ |S| para todo S ⊆ A. (5.6)
Demonstrac~ao. Sejam G = (A ∪ B, E) um grafo bipartido, M um emparelhamento que cobre A e
S ⊆ A. Para cada x ∈ S denote por vx o vertice de B tal que x, vx ∈M. Certamente, vx ∈ N(S).
Ainda, se x ∈ S e y ∈ S com x 6= y ent~ao vx 6= vy, logo |N(S)| ≥ |S|.
Agora, suponha que |N(S)| ≥ |S| para todo S ⊆ A e seja U uma cobertura mnima em G.
Denimos A ′ = A ∩U, B ′ = B ∩U, A ′′ = A \A ′ e B ′′ = B \ B ′.
Se n~ao existe um emparelhamento que cobre A ent~ao do teorema 40 deduzimos |U| < |A|. Como
|U| = |A ′|+ |B ′| e |A| = |A ′|+ |A ′′|, se |U| < |A| ent~ao |B ′| < |A ′′|.
Ainda, n~ao ha arestas de A ′′ para B ′′, pois elas n~ao estariam cobertas por U, ou sejaN(A ′′) ⊆ B ′.Portanto
|N(A ′′)| ≤ |B ′| < |A ′′|, (5.7)
contrariando a hipotese.
Essa demonstrac~ao e bastante simples pois todo o trabalho ja foi feito no Teorema de Konig.
Vejamos uma demonstrac~ao que n~ao depende de outros resultados.
Demonstrac~ao alternativa do teorema de Hall. Vamos provar por induc~ao em |A| que se |N(S)| ≥|S| para todo S ⊆ A ent~ao existe um emparelhamento que cobre A.
Se |A| = 1 ent~ao |N(A)| ≥ 1, portanto, existe um emparelhamento que cobre A. Seja G =
(A ∪ B, E) um grafo bipartido que satisfaz (5.6) e suponha que todo grafo bipartido (A ′ ∪ B ′, E)
Emparelhamentos e coberturas em grafos bipartidos 69
com |A ′| < |A| que satisfaz a condic~ao de Hall (5.6) tem um emparelhamento que cobre A ′. A
demonstrac~ao segue em dois casos.
Caso 1: |NG(S)| > |S| para todo S ⊂ A n~ao-vazio. Escolha uma aresta a, b ∈ E e considere o
grafo bipartido G ′ = G− a− b sobre os vertices A ′ = A \ a e B ′ = B \ b. Nesse caso, para cada
S ⊆ A ′ ⊂ A vale que |NG ′(S)| ≥ |S| (justique) e pela hipotese indutiva conclumos que existe M
que cobre A ′. Portanto M ∪a, b
cobre A.
Caso 2: |N(S)| = |S| para algum S ⊂ A n~ao-vazio. O grafo bipartido induzido H = G[S ∪N(S)]
satisfaz a condic~ao de Hall (os vizinhos de S em H s~ao os mesmo vizinhos em G) e pela hipotese
indutiva podemos concluir que existe um emparelhamento M em H que cobre S. Agora, considere
o subgrafo bipartido induzido J = G[S ∪NG(S)] e suponha que exista X ⊆ S tal que no grafo J vale
|NJ(X)| < |X|. Teremos no grafo G
|NG(S ∪ X)| = |NH(S) ∪NJ(X)| = |NH(S)|+ |NJ(X)| < |S|+ |X|
contrariando a hipotese de G satisfazer a condic~ao de Hall. Assim |NJ(X)| ≥ |X| para todo X ⊆S e, pela hipotese indutiva, existe um emparelhamento M ′ em J que cobre S. Para concluir a
demonstrac~ao e suciente observar que M ∪M ′ e um emparelhamento em G que cobre A.
Corolario 42 (Forma defectiva do teorema de Hall). Em todo grafo bipartido G = (A ∪ B, E)existe um emparelhamento que cobre A a menos de d vertices se, e somente se,
|N(S)| ≥ |S|− d para todo S ⊆ A. (5.8)
Exercıcios
Exerccio 161. Prove que se G e bipartido ent~ao existe um emparelhamento que cobre todos os
vertices de grau ∆(G).
Exerccio 162. Prove que se G e bipartido e regular ent~ao G tem emparelhamento perfeito.
Exerccio 163. Seja G = (A ∪ B, E) um grafo bipartido com |A| = |B| = n. Mostre que se n~ao
existe um emparelhamento perfeito em G ent~ao existe um subconjunto S com |S| ≤ dn/2e tal que|N(S)| = |S|− 1 e ou S ⊂ A ou S ⊂ B.(Dica: considere um conjunto T minimal violando a condic~ao
de Hall, dada pela equac~ao (5.6).)
Exerccio 164. Prove o corolario 42. (Dica: Adicione d vertices novos a B e faca-os adjacentes a
todos os vertices de A.)
Exerccio 165. Seja G = (A ∪ B, E) um grafo bipartido e A1, A2 uma partic~ao de A e B1, B2
uma partic~ao de B. Mostre que se N(A1) ⊆ B1 ent~ao N(B2) ⊆ A2 e B1 ∪A2 e uma cobertura.
Exerccio 166. Seja G = (A ∪ B, E) um grafo bipartido e M um emparelhamento em G. Seja
U ⊂ V(G) o conjunto dos vertices cobertos porM eW o conjunto dos vertices de todos os caminhos
M-alternantes que tem um dos extremos em A \U. Prove que (B ∩W) ∪ (A \W) e uma cobertura
em G.
Exerccio 167. Prove que todo emparelhamento maximo em G = (A ∪ B, E) tem cardinalidade
minU⊆A
|A|− |U|+ |N(U)|.
Exerccio 168. O permanente de uma matriz quadrada M = M(u, v), onde (u, v) ∈ A × B, e onumero
perm(M) =∑π
∏u
M(u, π(u)),
onde a soma se estende a todas as bijec~oes π : A→ B.
Seja G = (A ∪ B, E) um grafo bipartido tal que |A| = |B|. Seja M a matriz indexada por A× Be denida por M(u, v) = 1 se u, v e uma aresta de G e M(u, v) = 0 caso contrario. Mostre que o
permanente de M e igual ao numero de emparelhamentos perfeitos em G.
70 Emparelhamentos
Exerccio 169. Na primeira prova que apresentamos do teorema de Hall deduzimos o resultado
do teorema de Konig. Esses teoremas s~ao, de fato, equivalentes. Demonstre o teorema de Konig
(µ > ν) a partir do teorema de Hall.
Exerccio 170. Prove que o teorema de Hall e equivalente ao teorema de Menger (exerccio 118,
pagina 48).
5.3 Algoritmo de Edmonds
O algoritmo abaixo recebe um grafo bipartido G = (A∪B, E) e devolve um emparelhamento que
cobre A ou um subconjunto S ⊆ A tal que |N(S)| < |S| cuja existencia e garantida pelo teorema de
Hall.
A ideia do algoritmo e construir caminhos alternantes a partir de um vertice n~ao-coberto em
A. Por exemplo, no grafo da gura abaixo, o algoritmo comeca pelo vertice a1 n~ao-coberto por
M. O proximo passo e escolher um vizinho de a1. Se existir algum vizinho n~ao coberto, ent~ao
achamos um caminho aumentante, caso contrario uma aresta de M tem extremo nesse vizinho e
temos um caminho alternante, no exemplo a1, b1, a3. O proximo passo e continuar a busca a partir
de um vizinho dos vertices da forma ai ja escolhidos. Notemos, entretanto, que basta buscar tais
vizinhos dentre os vertices ainda n~ao escolhidos, no nosso exemplo, apos o estagio representado pela
gura (e) abaixo n~ao ha necessidade de considerar a aresta a3, b5 pois o novo caminho alternante
denido por essa aresta seria redundante para nossos propositos. No estagio dado pela gura (f)
chegamos a um caminho aumentante.
a5a4a3a2a1
b2b1 b3 b4
a6
b5 b6
G :
a1a1
b4b3b1
a3 a4 a2
b6b5
a6a6
b5
a3 a4 a2
b4b3b1
a1
b4b3b1
a3 a4 a2
(e) (f)(d)
a1
b3
a4a3
b1
a1
(a)
a1
b1
a3
(b) (c)
Quando o algoritmo descobre um caminho aumentante, usa-o para obter um emparelhamento
com mais arestas e recomeca o processo. Caso contrario, teremos construdo caminhos alternantes
que comecam num vertice descoberto e todos terminam num vertice coberto. Os vertices desses
caminhos denem um conjunto que viola a condic~ao de Hall. Por exemplo, na gura abaixo o
algoritmo comeca pelo vertice n~ao-coberto a4. Esse vertice tem os vizinhos b2 e b3 que est~ao
cobertos pelas arestas a1b2 e a3b3 respectivamente. O vertice a1 ja tem todos os seus vizinhos
escolhidos, assim como a3, e n~ao se pode mais estender os caminhos. Nesse caso N(a1, a3, a4) =
b1, b2 e a1, a3, a4 e um obstaculo para um emparelhamento cobrir A.
Essa ideia esta formalizada na seguinte prova do teorema de Hall.
Terceira demonstrac~ao do Teorema de Hall. Sejam G = (A ∪ B, E) um grafo bipartido tal que
|N(S)| ≥ |S| para todo S ⊆ A e M um emparelhamento maximo em G. Suponha que M n~ao cobre
Algoritmo de Edmonds 71
a4
(a)
b3
a4
b2
a1 a3
(c)
a5a4a3a2a1
b2b1 b3 b4 b5
G :
a4
b2
a1
(b)
A e seja u ∈ A n~ao coberto por M.
Denote por C o subconjunto de A ∪ B formado por todos os vertices alcancaveis a partir de u
por caminho M-alternante. Tome S = C ∩A e T = C ∩ B.Certamente, T ⊆ N(S). Agora, se existe x ∈ S com um vizinho fora de T , digamos b ∈ B \ T .
Como b 6∈ T , o vertice b n~ao e coberto porM logo u e b s~ao extremos de um caminhoM-aumentante,
contrariando o fato de M ser maximo, portanto, T = N(S). Como T e S − u s~ao cobertos por M
(justique), temos |T | = |S| − 1, logo |N(S)| = |S| − 1 < |S| o que contraria a hipotese sobre G, logo
M cobre A.
N~ao e difcil extrair um algoritmo dessa demonstrac~ao, esse algoritmo pode ser escrito da seguinte
maneira.
Algoritmo 20: Edmonds(A,B, E)
Dado : um grafo bipartido G = (A ∪ B, E).Devolve: emparelhamento que cobre A ou um obstaculo de Hall S ⊆ A.
comece com M vazio;1
se existe u ∈ A n~ao coberto por M entao2
(S, T)← (u,∅
);3
senao devolva(M);4
se N(S) = T entao devolva(S);5
senao escolha b ∈ N(S) \ T ;6
se existe a ∈ V \ S tal que a, b ∈M entao7
insira a em S;8
insira b em T ;9
volte para 5;10
senao11
seja P o caminho M-aumentante de u ate b;12
atribua a M o emparelhamento M4E(P);13
volte para 2.14
Analise e correcao do algoritmo de Edmonds. A correc~ao do algoritmo segue facilmente da
terceira prova do teorema de Hall. O tempo para a busca de um caminhoM-aumentante eO(|V |+|E|)
(uma busca) no pior caso. Fazendo uma busca pra cada vertice resulta em O(|V |(|V |+ |E|)).
Exercıcios
Exerccio 171. Refaca os exerccios 2 e 23.
Exerccio 172. Uma escola secundaria abriu vagas para contratac~ao de 6 docentes para as seguintes
areas: Matematica, Qumica, Fsica, Biologia, Psicologia e Ecologia. Para que um(a) candidato(a)
se inscreva ele(a) deve informar a area em que se graduou e as areas correlatas em que se sente a
vontade para lecionar. A escola recebeu seis inscric~oes para estas posic~oes, da seguinte maneira:
72 Emparelhamentos
Candidato Areas
Matem. Qumica Fsica Biol. Psicol. Ecol.
Antonio × ×Bernardo × × × ×Cassia × × ×Debora × × × ×Evandro × ×Fernanda × ×
Modique o algoritmo acima para que determine o maior numero de professores que a escola
pode contratar.
Exerccio 173. Modique o algoritmo Edmonds(A,B, E) para que ele devolva um emparelhamento
maximo.
Exerccio 174. Faca uma analise detalhada da complexidade do algoritmo de Edmonds.
Exerccio 175. Como foi dito na observac~ao 2, pagina 12, determinar α(G) e um problema NP-
difcil. Suponha que exista um algoritmo que computa ν(G) em tempo polinomial para qualquer
grafo G. Mostre como computar α(G) em tempo polinomial.
Exerccio 176. Escreva um algoritmo polinomial para computar α(G) quando G e bipartido.
Exerccio 177. Escreva um algoritmo que, dado G, determine um emparelhamento maximal em
G, isto e, emparelhamentoM tal que n~ao exista um emparelhamentoM ′ tal queM 6⊂M ′. Use essealgoritmo para determinar uma cobertura S tal que |S| ≤ 2ν(G).Exerccio 178. Seja G = (V, E, ρ) um grafo com pesos n~ao negativos nas arestas. O peso de um
emparelhamento M em G e
p(M) =∑e∈M
ρ(e).
Dena
νρ(G) = maxp(M) : M e emparelhamento em G
o peso de um emparelhamento de peso maximo em G. Usando a ideia do Kruskal, escrevemos o
seguinte algoritmo
Algoritmo 21: Emparelhamento quase maximo(G)
Dado : um grafo G com pesos n~ao-negativos nas arestas.
Devolve: um emparelhamento em G.
M← ∅;1
F← la das arestas em ordem n~ao-crescente de peso;2
para cada e ∈ F faca3
se M ∪ e e um emparelhamento em G entao insira e em M;4
devolva M.5
Prove que a resposta do algoritmo satisfaz p(M) ≥ νρ(G)/2.
CAPıTULO 6
GRAFOS DIRIGIDOS
Neste captulo trabalharemos com grafos dirigidos. Em alguns situac~oes, como calcular distancia,
o caso dirigido e uma simples generalizac~ao do caso n~ao-dirigido, em outras situac~oes, como conexi-
dade, o problema e outro. Formalmente, um grafo dirigido e um par (V, E) onde V e um conjunto
nito (vertices) e E ⊂ V × V com a restric~ao de (v, v) 6∈ E para todo v ∈ V.Dizemos que a aresta (v, u) ∈ E sai de v e chega em u. Tambem, denimos os seguintes
conjuntos para cada v ∈ V
E−(v) = (v, u) ∈ V × V : (v, u) ∈ E e N−(v) = u ∈ V : (v, u) ∈ E; (6.1)
E+(v) = (u, v) ∈ V × V : (u, v) ∈ E e N+(v) = u ∈ V : (u, v) ∈ E. (6.2)
Denimos o grau de saıda de v ∈ V e o grau de entrada de v ∈ V, respectivamente, por
d−(v) = |N−(v)| e d+(v) = |N+(v)|. (6.3)
O grafo subjacente ao grafo dirigido G e o grafo
SG =(V(G),
⋃u, v : (u, v) ∈ E
)Neste captulo expomos alguns topicos em grafos dirigidos, para mais sobre o assunto veja [1].
6.1 Representacao computacional e Percurso
Como zemos antes, no caso n~ao dirigido (sec~ao 1.5.1), assumiremos que nos problemas com-
putacionais os vertices de G s~ao 1, 2, . . . , |V(G)| (caso contrario construmos um isomorsmo) e
uma lista de adjacencias dirigida e um vetor N[ ] de listas ligadas, a lista N[i] contem os vizinhos
N−(i) do vertice i e cada no dessa lista e composto por uma variavel que armazena um vertice e
um ponteiro que aponta para o proximo no da lista. No caso de matriz, a matriz de adjacencias e
dada por ai,j = 1 se e so se (i, j) e aresta.
6
1
4
5
2
3
G:
N:
5 5
1 2 3 4 5 6
2 3 5 2 3
3
4
3
1
Figura 6.1: Diagrama de um grafo dirigido e uma representac~ao por lista de adjacencias.
Uma busca em profundidade rotulada, algoritmo 5 na pagina 27, num grafo dirigido resulta numa
classicac~ao das arestas em quatro tipos, ao inves dos dois tipos que ocorrem no caso n~ao-dirigido.
Usaremos a terminologia da sec~ao 3.1.1, se existe algum inteiro t ∈ N tal que pai(t)[v] = u ent~ao
dizemos que u e ancestral de v ou que v e descendente de u. No caso particular de pai[u] = v
dizemos que u e filho de v.
Apos uma busca em profundidade rotulada as arestas s~ao classicadas em
74 Grafos Dirigidos
1. aresta pailho s~ao as arestas da forma (v, pai[v]);
2. aresta de retorno ascendente s~ao as arestas (u, v) tais que v e um ancestral de u (veja a
sec~ao 3.1.1), nesse caso [chega[u], sai[u]] ⊂ [chega[v], sai[v]];
3. aresta de retorno descendente s~ao as arestas (u, v) tais que v e um descendente de u com
pai[v] 6= u, nesse caso [chega[v], sai[v]] ⊂ [chega[u], sai[u]]; e
4. aresta transversal s~ao as outras arestas, da forma (u, v) tais que chega[v] < sai[v] <
chega[u] < sai[u].
Exemplo 32. A gura abaixo esquematiza uma busca em profundidade rotulada no grafo dirigido
do exemplo 6.1,
Legenda nas arestas:
pailho
retorno ascendente
retorno descendente
transveral
1
5
3
2 4
6
Figura 6.2: Busca em profundidade rotulada.
Um caminho orientado e uma sequencia de vertices distintos P = x1, x2, . . . , xk tal que
(xi, xi+1) ∈ E(P) para todo i ∈ 1, 2, . . . , k − 1. Nesse caso, dizemos que P e um caminho ori-
entado de x1 para xk e usamos a notac~ao (x1 → xk)-caminho. Um circuito orientado e uma
x1 x2 x3
Figura 6.3: Representac~ao de um caminho orientado com 3 vertices.
sequencia de vertices distintos, a menos do primeiro e do ultimo, C = x1, x2, . . . , xk, x1 tal que
(xi, xi+1) ∈ E(C) para todo i ∈ 1, 2, . . . , k− 1, e (xk, x1) ∈ E(C)
x1 x2 x3 x4 x5
Figura 6.4: Diagrama de um circuito orientado com 5 vertices.
Exercıcios
Exerccio 179 (Fecho transitivo). Se D = (V, E) e um grafo dirigido ent~ao o fecho transitivo de
D e o grafo D∗ = (V, E∗) onde
E∗ = (i, j) ∈ V × V : existe um (i→ j)-caminho em D.
Escreva um algoritmo de tempo O(|V |3) para determinar o fecho transitivo de um grafo dirigido.
Exerccio 180 (Ordenacao topologica). Dado um grafo orientado G que n~ao contem circuito
orientado, determinar uma ordenac~ao v1 ≺ v2 ≺ · · · ≺ vn de V(G), onde u ≺ v se (u, v) ∈ E(G).Essa ordenac~ao e chamada de ordenac~ao topologica dos vertices de G.
Caminhos mnimos em grafos dirigidos com pesos nas arestas 75
1 4 3 7 8 5 2 6
1 2
3 4 5
7 8
6
Figura 6.5: Um grafo orientado e uma ordenac~ao topologica de seus vertices: 1 ≺ 4 ≺ 3 ≺ 7 ≺ 8 ≺5 ≺ 2 ≺ 6.
(a) Prove que G admite uma ordenac~ao topologica se e somente se G n~ao contem circuito
orientado.
(b)Prove que G n~ao tem circuito orientado se e somente se em qualquer busca em profun-
didade n~ao ocorre aresta de retorno ascendente.
(c) Escreva um algoritmo de tempo O(|V |+ |E|) para determinar uma ordenac~ao topologica
de um grafo orientado sem circuito orientado.
(d) Prove que o algoritmo esta correto.
6.2 Caminhos mınimos em grafos dirigidos com pesos nasarestas
Alem da orientac~ao nas arestas, os grafos desta sec~ao tem peso nas arestas, ou seja, esses grafos
s~ao denidos por uma tripla (V, E, ρ) com ρ : E → R. O comprimento de um caminho orientado
P = x1, x2, . . . , xk e denido, naturalmente, como a soma dos pesos (comprimentos) das arestas
nesse caminho
c(P) =
k−1∑i=1
ρ(xi, xi+1),
e a distancia entre dois vertices e o comprimento do menor caminho orientado que os liga,
dist(u, v) = minc(P) : P e um (u→ v)-caminho
quando existe algum caminho, caso contrario convencionamos que dist(u, v) = ∞. Um (u →v)-caminho de comprimento dist(u, v) e chamado de caminho mınimo.
Exemplo 33. O seguinte diagrama representa um grafo dirigido com pesos nas arestas
4
3
1
4
3
2
10
3
1
a
b
c
d
e
f
Figura 6.6: Diagrama de um grafo dirigido com peso nas arestas. Note que dist(c, e) 6= dist(e, c),
dist(a, f) = 10.
Observac~ao 14. Num grafo dirigido G podemos ter
dist(u, v) 6= dist(v, u)
76 Grafos Dirigidos
e vale a seguinte forma da desigualdade triangular, para todo (v, u) ∈ E(G)
dist(s, u) ≤ dist(s, v) + ρ(v, u) (6.4)
onde, como anteriormente, x ≤∞ e x+∞ =∞ para qualquer x ∈ R ∪ ∞.
N~ao e difcil provar que o algoritmo de Dijkstra, pagina 35, resolve o seguinte problema computa-
cional: dado G dirigido e com pesos positivos nas arestas representado por uma lista de adjacencias
como foi denida na sec~ao 6.1 acima e dado s ∈ V(G), determinar dist(s, v) para todo v ∈ V(G).No que segue veremos um algoritmo que funciona no caso em que podem haver arestas com peso
negativo (veja exerccio 91), desde que o grafo n~ao contenha um circuito orientado onde a soma dos
pesos nas arestas seja negativa.
6.2.1 Algoritmo de Bellman–Ford
Seja G um grafo dirigido com pesos nas arestas que podem ser negativos. Um circuito cir-
cuito negativo C em G e um circuito orientado onde a soma dos pesos das arestas e negativo.
Notemos que num circuito negativo podemos car dando voltas e a cada volta os comprimentos
diminuem, assim uma tentativa ingenua de projetar um algoritmo para computar distancias em G
poderia facilmente entrar em um laco para sempre.
O algoritmo de BellmanFord recebe um grafo dirigido com pesos G = (V, E, ρ), onde ρ pode
assumir valores negativos e um vertice s, devolve um valor booleano indicando a n~ao-existencia em
G de um circuito negativo e um (s→ v)-caminho para algum v ∈ V(C). No caso do valor devolvidoser verdadeiro, o algoritmo computou corretamente as distancias dist(s, v) para todo v ∈ V.
A ideia do algoritmo e a seguinte. Seja v um vertice de G e
P = s, v1, . . . , vk−1, v
um (s → v)-caminho mnimo com k arestas. Claramente, temos k ≤ |V | − 1. A ideia principal e
repetir |V |− 1 vezes a vers~ao dirigida do algoritmo Relaxac~ao(u,w), pagina 35, para cada aresta
para cada (u,w) ∈ E(G) faca Relaxac~ao(u,w).
onde
Algoritmo 22: Relaxac~ao(u,w)
se d[w] > d[u] + ρ(u,w) entao d[w]← d[u] + ρ(u,w).1
assim, na primeira rodada de relaxac~oes em E(G) temos que distG(s, v1) esta determinado; na
segunda, distG(s, v2) esta determinado (veja o lema 14, que tambem vale no caso dirigido). Na
k-esima rodada distG(s, v) esta determinado (veja exerccio 183 a seguir). Como qualquer caminho
tem no maximo |V |− 1 arestas, no nal das repetic~oes as distancias estar~ao determinadas.
Para detectar um circuito negativo basta testar se ha alguma aresta (u,w) ∈ E(G) tal que
d[w] > d[u] + ρ(u,w) depois das |V |− 1 repetic~oes do trecho de algoritmo dado acima.
Algoritmo 23: BellmanFord(G, s)
Dado : um grafo G com pesos ρ nas arestas e um vertice s ∈ V(G).Devolve: verdadeiro no caso em que distG(s, v), para todo v ∈ V(G), foi corretamente
calculado, e falso caso G tenha um circuito negativo alcancavel a partir de s.
para cada v ∈ V faca d[v]←∞;1
d[s]← 0;2
cont← 1;3
enquanto cont ≤ |V |− 1 faca4
para cada (u,w) ∈ E(G) faca Relaxac~ao(u,w);5
cont← cont+ 1;6
para cada (u,w) ∈ E(G) faca7
se d[w] > d[u] + ρ(u,w) entao devolva(falso);8
devolva(verdadeiro).9
Caminhos mnimos em grafos dirigidos com pesos nas arestas 77
Analise e correcao do algoritmo de Bellman–Ford. O resultado a seguir prova que o al-
goritmo devolve corretamente o valor booleano prometido: verdadeiro se n~ao ha circuito negativo
alcancavel por s e falso caso contrario, indicando que os valores d[v] calculados n~ao valem. A prova
de que o algoritmo computa corretamente as distancias e deixada para o leitor no exerccio 183.
Lema 43. BellmanFord(G) devolve verdadeiro se G n~ao contem circuito negativo e devolve
falso caso contrario.
Demonstrac~ao. Seja C = v0, v1, . . . , vk, v0 um circuito de peso negativo, isto e,
ρ(vk, v0) +
k∑i=1
ρ(vi−1, vi) < 0,
e tal que existe (s → v0)-caminho dirigido em G. Suponha que o algoritmo devolve verdadeiro.
Ent~ao d[vi] ≤ d[vi−1] + ρ(vi−1, vi) para todo i ∈ 1, 2, . . . , k e somando para toda aresta de C
k∑i=1
d[vi] ≤k∑i=1
(d[vi−1] + ρ(vi−1, vi)
)=⇒
k∑i=1
d[vi] −
k∑i=1
d[vi−1] ≤k∑i=1
ρ(vi−1, vi) =⇒k∑i=1
ρ(vi−1, vi) ≥ d[vk] − d[v0] ≥ 0
contradizendo o fato de C ter peso negativo.
Quando n~ao ha circuito negativo, apos o termino, para cada (u,w) ∈ E temos
d[w] = distG(s,w) ≤ distG(s, u) + ρ(u,w) = d[u] + ρ(u,w),
portanto o algoritmo devolve verdadeiro.
Para a complexidade, notemos que o tempo dos lacos aninhados nas linhas 4 e 5 predomina e
resulta em O(|V ||E|).
Exercıcios
Exerccio 181. Suponha que v1, v2, . . . , vk e um caminho orientado de comprimento mnimo de v1para vk num grafo dirigido G com pesos nas arestas. Prove que vi, . . . , vj e um caminho mnimo de
vi para vj em G para quaisquer i, j com 1 ≤ i < j ≤ k.Exerccio 182. Prove a desigualdade (6.4).
Exerccio 183 (Correc~ao do algoritmo de BellmanFord). Seja G um grafo dirigido com pesos nas
arestas. Suponha as inicializac~oes das tres primeiras linhas do algoritmo de BellmanFord. Prove
que independente do numero de vezes que a Relaxac~ao foi executado, sempre valem:
(b) d[v] ≥ distG(s, v) para todo v ∈ V(G), e uma vez que vale a igualdade o valor de d[v]
n~ao muda apos qualquer execuc~ao de Relaxac~ao;
(c) se distG(s, v) =∞ ent~ao d[v] =∞;
(d) se s, . . . , u,w e um (s→ w)-caminho mnimo e d[u] = distG(s, u) ent~ao Relaxac~ao(u,w)
resulta em d[w] = distG(s,w);
(e) seja s = v0, v1, v2, . . . , vk−1, vk = w um caminho mnimo. Se ocorrem as relaxac~oes
em (v0, v1), (v1, v2),. . . , (vk−1, vk), nessa ordem e com possveis outras relaxac~oes inter-
mediarias, ent~ao teremos no nal da sequencia d[w] = distG(s,w).
78 Grafos Dirigidos
Exerccio 184. Modique o algoritmo de BellmanFord para que resulte d[v] = −∞ para todo
vertice v tal que o (s→ v)-caminho mnimo encontra um circuito negativo.
Exerccio 185. Suponha que existe um algoritmo A(G,u, v) que determina em tempo polinomial
um (u→ v)-caminho mnimo no grafo dirigido com pesos reais nas arestas G. Mostre como usar esse
algoritmo para determinar se G tem um circuito (orientado) hamiltoniano em tempo polinomial.
(Dica: atribua peso −1 a todas as arestas do grafo e compute A(G,u, v) para todo (v, u) ∈ E(G).)Observamos que o problema de determinar se um grafo e hamiltoniano e NP-completo, portanto
a existencia de uma algoritmo A como acima estabelece que P=NP.
6.3 Componentes fortemente conexos
Um componente fortemente conexo W num grafo dirigido G e um subconjunto de vertices
maximal com respeito a seguinte propriedade: para quaisquer u, v ∈ W existem um (u → v)-
caminho orientado e um (v→ u)-caminho orientado, ambos contidos em G[W].
Exemplo 34. O diagrama abaixo mostra um grafo dirigido, cada um dos quatro crculos identica
um componente fortemente conexo do grafo.
1
3
5
12
14
13
7
10
9
8 6
2
4
11
Dado um grafo dirigido G, queremos computar os componentes fortemente conexos de G. Pra
isso, denimos os seguintes dois grafos construdos a partir do grafo dirigido G
grafo transposto: denotado por GT e o grafo dirigido obtido invertendo-se o sentido das arestas
em E(G): GT =(V(G), (u, v) ∈ V × V : (v, u) ∈ E(G)
).
grafo das componentes: denotado por G∗ e o grafo orientado com um vertice para cada com-
ponente fortemente conexo de G e (c1, c2) e uma aresta em G∗ se, e somente se, existe uma
aresta que sai de um vertice de c1 e chega num vertice de c2 (veja gura 6.7(a) abaixo).
Observac~ao 15. Os grafos G e GT tem os mesmos componentes fortemente conexos. De fato, se u
e v est~ao no mesmo componente W de G ent~ao o (u→ v)-caminho em G com todos os vertices em
W e um (v→ u)-caminho em GT com todos os vertices em W e, analogamente, o (v→ u)-caminho
em G e um (v→ u)-caminho em GT, portanto, u e v est~ao no componente W de GT.
Observac~ao 16. O grafo G∗ dos componentes fortemente conexos de G n~ao contem circuito orien-
tado. De fato, dados v, v ′ ∈ ci e u, u ′ ∈ cj, para i 6= j, se existe (u → v)-caminho em G ent~ao n~ao
pode existir (v ′ → u ′)-caminho em G, caso contrario esses vertices estariam no mesmo componente
fortemente conexo. Com isso, temos que G∗ admite ordenac~ao topologica.
Exemplo 35. Na gura abaixo mostramos (a) o grafo dos componentes fortemente conexos do grafo
dirigido mostrado no exemplo 34 e tambem (b) uma ordenac~ao topologica dos vertices do grafo das
componentes.
Componentes fortemente conexos 79
(a) (b)
4
11
1
741117
Figura 6.7: (a) Grafo dos componentes fortemente conexos do grafo do exemplo 34, 1 = 1, 2, 3, 4 =
4, 5, 6, 7 = 7, 8, 9, 10 e 11 = 11, 12, 13, 14. (b) Ordenac~ao topologica do grafo das componentes.
Agora, vamos descrever um algoritmo que, dado um grafo dirigido G, determina os componentes
fortemente conexos de G. Em linhas gerais, a estrategia para computar os componentes fortemente
conexos de um grafo dirigido G e
Algoritmo 24: CFC(G)
BP(G): busca em profundidade rotulada em G para determinar sai[v] para todo v ∈ V(G);1
Compute GT;2
BP(GT): busca em profundidade em GT com o laco principal modicado para escolher os3
vertices em ordem decrescente dos valores de sai[ ] computado no passo 1;
Devolva cada arvore da segunda busca como um componente fortemente conexo de G.4
No que segue sempre que nos referirmos aos valores de chega[ ] e sai[ ] trata-se do conteudo
desses vetores apos a primeira busca em profundidade. Os seguintes resultados ajudam a entender
o funcionamento do algoritmo. As demonstrac~oes ser~ao deixadas como exerccio.
Lema 44. Sejam W e W ′ dois componentes fortemente conexos de G. Suponha que existe
uma aresta (u, v) ∈ E(G) tal que u ∈W e v ∈W ′. Ent~ao
maxu∈W
sai[u] > maxv∈W ′
sai[v].
Ideia da demonstrac~ao. Se a busca em profundidade rotulada chega no componente W antes de
chegar no componente W ′, ent~ao todos os vertices de W ′ s~ao descendentes do primeiro vertice
visitado em W, o valor de sai[ ] desse vertice e maior que o valor de sai[ ] de todo vertice de W ′.
Se a busca em profundidade chega primeiro num vertice deW ′, ent~ao todos os vertices deW ′ ser~ao
visitados antes de qualquer visita a um vertice de W, portanto os valores de sai[ ] dos vertices em
W s~ao maiores que os valores de sai[ ] dos vertices de W ′.
Corolario 45. Sejam W e W ′ dois componentes fortemente conexos de G. Suponha que existe
uma aresta (u, v) ∈ E(GT) tal que u ∈W e v ∈W ′. Ent~ao
maxu∈W
sai[u] < maxv∈W ′
sai[v].
Demonstrac~ao. Imediato da denic~ao de GT e do resultado acima pois G e GT tem os mesmos
componentes conexos.
A busca em profundidade do passo 3 comeca no componente fortemente conexo W que tem o
vertice k ∈ V(G) com maxv sai[v]. Essa busca visita todos os vertices de W. Pelo corolario 45
somente esses vertices ser~ao visitados, pois n~ao ha arestas de W para W ′ com maxv∈W ′ sai[v] <
maxv∈W sai[v], para qualquer outro componente fortemente conexo W ′ em G. Na segunda rodada
do laco interno da busca em profundidade, o vertice u e tal que sai[u] = maxsai[v] : v ∈ V(G)−W
e, novamente pelo corolario 45, os vertices das componentes W ′′ tais que maxv∈W ′′ sai[v] < sai[u]
n~ao s~ao visitados; os unicos vertices fora do componente fortemente conexo de u que poderiam ser
visitados s~ao os da componente W, mas que ja est~ao visitados ; e assim por diante.
80 Grafos Dirigidos
Analise e correcao do algoritmo CFC. Para facilitar a prova de que o algoritmo funciona
corretamente vamos, primeiro, dar uma vers~ao mais detalhada do algoritmo.
O algoritmo CFC(G) descrito a seguir faz uma busca em profundidade em G e depois uma busca
em profundidade em GT onde os vertices s~ao visitados respeitando a ordenac~ao descrita acima.
Em seguida mostramos que o algoritmo CFC( ) funciona corretamente. Lembramos que sai[ ]
refere-se aos valores computados na primeira chamada da busca em profundidade.
O seguinte algoritmo usa o vetor cfc[ ] para identicar, no nal da execuc~ao, os componentes
fortemente conexos de G.
A busca em profundidade utilizada ca da seguinte forma
Algoritmo 25: BP(G, v, cc)
Dado : um grafo dirigido G.
Devolve: busca em profundidade rotulada modicada.
cfc[v]← cc;1
chega[v]← cont;2
cont← cont+ 1;3
para cada u ∈ N−(v) faca4
se chega[u] = 0 entao BP(G,u, cc);5
sai[v]← cont;6
cont← cont+ 1.7
onde o parametro cc rotula os vertices de acordo com o componente fortemente conexo ao qual ele
pertence, e o algoritmo CFC ca
Algoritmo 26: CFC(G)
Dado : um grafo dirigido G.
Devolve: componentes fortemente conexos.
/* Busca em profundidade rotulada em G para computar sai[ ] */
para cada k ∈ V(G) faca1
sai[k]← 0;2
chega[k]← 0;3
para cada k ∈ V(G) faca4
se chega[k] = 0 entao BP(G, k, 0);5
/* Ordene os vertices por ordem decrescente de sai[ ] */
L← lista ordenada de V(G) por ordem decrescente de sai[ ];6
/* Determine o grafo transposto */
compute GT;7
/* Busca em profundidade em GT para determinar os componentes */
/* Os vertices n~ao-visitados s~ao escolhidos de acordo com a ordem em L */
cont← 0;8
c← 0;9
para cada k ∈ V(G) faca10
sai[k]← 0;11
chega[k]← 0;12
para cada k ∈ L faca13
se chega[k] = 0 entao14
c← c+ 1;15
BP(GT, k, c);16
Agora, damos uma prova de que o algoritmo CFC esta correto.
Teorema 46. O algoritmo CFC(G) computa corretamente os componentes fortemente conexos
do grafo dirigido G.
Demonstrac~ao. Vamos provar que, para todo n ∈ N, apos a n-esima rodada do laco na linha 13
Componentes fortemente conexos 81
que: Se C = m ent~ao Wi = v : cfc[v] = i para i ∈ 1, 2, . . . ,m s~ao m componentes conexos de
G.
Para n = 0, antes da primeira rodada, a armac~ao acima vale pois cfc[v] = 0 para todo v ∈ V(G).Suponha que apos a n-esima rodada do laco na linha 13 temos c = m e Wi = v : cfc[v] = i para
i ∈ 1, 2, . . . ,m s~ao m componentes fortemente conexos de G. Consideremos a rodada n + 1. Se
o teste na linha 14 e falso ent~ao c = m e apos a rodada n + 1 temos os mesmos m componentes
fortemente conexos de G. Vamos supor que o teste foi positivo, dessa forma c = m+ 1 e temos que
provar que Wi = v : cfc[v] = i, 1 ≤ i ≤ m+ 1, s~ao m+ 1 componentes fortemente conexos de G.
Apos a atribuic~ao c = m + 1 na linha 15, temos uma chamada da busca em profundidade
BP(GT, k,m+ 1), que faz cfc[k] = m+ 1 e os vertices n~ao-visitados, alcancaveis a partir de k, ser~ao
descendentes de k no nal da busca e ter~ao cfc[ ] = m+ 1 na medida em que forem visitados. Seja
Wm+1 o componente fortemente conexo que contem k; como k ∈ L vale que
sai[k] = maxv∈Wm+1
sai[v] > maxu∈V\
⋃m+1i=1
Wi
sai[u], (6.5)
portanto, pelo corolario 45, n~ao ha aresta (u, v) ∈Wm+1×(V \⋃m+1i=1 Wi
)em GT. Como os vertices
de⋃mi=1Wi ja foram visitados (o teste da linha 14 falha) os valores de cfc[ ] desses vertices n~ao
s~ao alterados por BP(GT, k,m+ 1). Assim, nenhum vertice fora de Wm+1 sera descendente de k no
nal de BP(GT, k,m+ 1).
Observemos que se G e dado pela sua matriz de adjacencias A, ent~ao a matriz transposta AT
representa o grafo transposto GT, dessa forma obtemos uma representac~ao implcita de GT em tempo
constante no sentido de que AT(i, j) = A(j, i). Se G e dado por uma lista de adjacencias ent~ao a
lista de adjacencias de GT pode ser computada em tempo O(|V |+ |E|) (verique).
A linha 2 tem custo O(|V |), o laco na linha 4 tem custo total O(|V | + |E|), a ordenac~ao custa
O(|V | log |V |), o grafo GT pode ser computado em tempo O(|V | + |E|), a linha 8 tem custo O(1), a
10 O(|V |) e o laco na linha 13 tem custo O(|V |+ |E|).
Teorema 47. CFC(G) tem complexidade O(|V | log |V |+ |E|).
Exercıcios
Exerccio 186. Demonstre o lema 44.
Exerccio 187. Mostre que o algoritmo 24 pode ser implementado com complexidade O(|V |+ |E|).
Exerccio 188. Se ao inves de usarmos uma busca em profundidade em GT por ordem decrescente de
sai[ ] no algoritmo 26 usarmos uma busca em profundidade em G por ordem crescente de chega[ ]
o algoritmo determinaria os componentes fortemente conexos do grafo?
Exerccio 189. Se ao inves de usarmos uma busca em profundidade em GT por ordem decrescente
de sai[ ] no algoritmo 26 usarmos uma busca em profundidade em G por ordem crescente de sai[ ]
o algoritmo determinaria os componentes fortemente conexos do grafo?
Exerccio 190. Seja G um grafo dirigido e u e w vertices de G.
(a) Escrevemos u w se existe (u → w)-caminho em G. Prove que e uma relac~ao
simetrica e transitiva em V(G).
(b) Escrevemos u! w se existem (u → w)- e (w → u)-caminhos em G. Prove que! e
uma relac~ao de equivalencia em V(G). Nesse caso, quem s~ao as classes de equivalencia?
Exerccio 191. Escreva um algoritmo para determinar se um grafo dirigido G e semiconexo: para
u, v ∈ V(G) ou u v ou v u. Determine a complexidade do algoritmo.
Exerccio 192. Escreva um algoritmo de complexidade O(|V | + |E|) para computar o grafo G∗ dos
componentes fortemente conexos de G.
Exerccio 193. Escreva um algoritmo de complexidade O(|V |+ |E|) para determinar o grafo trans-
posto de um grafo dado por uma lista de adjacencias.
82 Grafos Dirigidos
6.4 Fluxo em redes
Vamos chamar de rede uma quadrupla N = (G, c, s, t) onde G = (V, E) e um grafo dirigido, c e
uma func~ao c : E→ R+ que atribui uma capacidade c(e), para cada aresta e s e t s~ao vertice de G
tais que d+(s) = d−(t) = 0. Um s-t fluxo, ou simplesmente uxo, em N e uma func~ao f : E → Rtal que
1. para cada e ∈ E vale 0 ≤ f(e) ≤ c(e);
2. para cada v ∈ V \ s, t temos∑e∈E−(v) f(e) =
∑e∈E+(v) f(e).
A primeira restric~ao diz que o uxo por uma aresta n~ao pode exceder a capacidade dessa aresta,
a segunda diz que em qualquer vertice diferente de s e de t o uxo que \sai" e igual a uxo que
\entra" no vertice. Com isso, e facil intuir que o uxo que \sai" de s e igual ao que \entra" em t.
Proposicao 48. Se N e uma rede e f um uxo, ent~ao∑e∈E−(s)
f(e) =∑
e∈E+(t)
f(e). (6.6)
Demonstrac~ao. Notemos que∑e∈E(G)
f(e) =∑
e∈E−(s)
f(e) +∑v 6=s,t
∑e∈E−(v)
f(e)
e que ∑e∈E(G)
f(e) =∑
e∈E+(t)
f(e) +∑v 6=s,t
∑e∈E+(v)
f(e),
portanto ∑e∈E−(s)
f(e) =∑
e∈E+(t)
f(e).
A quantidade na equac~ao (6.6) e o valor do fluxo e e denotada por val(f)
val(f) =∑
e∈E−(s)
f(e). (6.7)
O problema que estamos interessados aqui e formulado da seguinte maneira: Dado uma rede
N = (G, c, s, t), determinar um s-t uxo f de valor maximo, isto e, tal que val(f) ≥ val(g) para todo
uxo g na rede N.
Como seria esperado, uxo e corte em redes s~ao conceitos estreitamente relacionados; em um
grafo dirigido G um corte separa os vertices s e t, ou simplesmente s-t corte, e um conjunto
de arestas
E(S, S) =(u, v) ∈ E(G) : u ∈ S e v ∈ S
tal que s ∈ S e t ∈ S
e a capacidade do corte e
c(S) = C(S, S) =∑
e∈E(S,S)
c(e); (6.8)
e o fluxo no corte e
f(S) = f(S, S) =∑
e∈E(S,S)
f(e) −∑
e∈E(S,S)
f(e). (6.9)
Segue imediatamente da denic~ao de uxo que f(S) ≤ c(S) para todo s-t corte S e, mais que isso,
vale a desigualdade val(f) ≤ c(S). De fato,
val(f) =∑v∈S
∑e∈E−(v)
f(e) −∑
e∈E+(v)
f(e)
Fluxo em redes 83
mas cada aresta e = (x, y) ∈ S× S contribui duas vezes na soma, quando v = x contribui com f(e)
e quando v = y contribui com −f(e), logo essas contribuic~oes se cancelam e camos com
val(f) =∑v∈S
∑e∈E−(v)∩S×S
f(e) −∑
e∈E+(v)∩S×S
f(e)
= f(S). (6.10)
Proposicao 49. Para todo s-t uxo f e todo s-t corte S vale val(f) ≤ c(S), em particular
maxval(f) : f e um s-t uxo
≤ min
c(S) : S e um s-t corte
. (6.11)
Demonstrac~ao. Para todo s-t corte S, temos por (6.10) val(f) = f(S) e pela denic~ao de uxo (item
1) o uxo em cada aresta e limitado pela capacidade da aresta, logo f(S) ≤ c(S), donde segue a
desigualdade.
Um s-t corte mınimo e um s-t corte S de capacidade c(S) ≤ c(S ′) para todo s-t corte S ′ (ladodireito de (6.11)).
Corolario 50. Para todo s-t uxo f e todo s-t corte S, se val(f) = c(S) ent~ao f e um uxo
maximo e S um corte mnimo.
Demonstrac~ao. Sejam f∗ um s-t uxo maximo e S∗ um s-t corte mnimo. Ent~ao
val(f) ≤ val(f∗) ≤ c(S∗) ≤ c(S).
De val(f) = c(S) vale a igualdade nas equac~oes acima.
O principal resultado desta sec~ao e que a capacidade de um corte mnimo e um limitante inferior
para o uxo maximo.
Sejam N = (G, c, s, t) uma rede, P ⊂ SG um caminho com extremos s e t no grafo subjacente
ao grafo dirigido G e f um s-t uxo na rede N. Digamos que P = x0, x1, . . . , xm−1, xm com x0 = s
e xm = t. Dizemos que P e f-aumentante se para cada xi, xi+1 ∈ E(P) temos
1. e = (xi, xi+1) ∈ E(G) e f(e) < c(e), nesse caso dizemos que e e uma aresta direta de P, ou
2. e = (xi+1, xi) ∈ E(G) e f(e) > 0, nesse caso dizemos que e e uma aresta reversa de P.
Se P e f-aumentante e denimos
ε1 = minc(e) − f(e) : e e uma aresta direta de P (6.12)
ε2 = minf(e) : e e uma aresta reversa de P (6.13)
δ = minε1, ε2. (6.14)
e denimos g : E→ R por
g(e) =
f(e) + δ se e e direta
f(e) − δ se e e reversa
f(e) caso contrario,
(6.15)
ent~ao g e um uxo (verique) com val(g) = val(f)+δ, δ > 0, portanto f n~ao e maximo. A recproca
desse resultado, ou seja, se n~ao existe caminho f-aumentante ent~ao f e maximo, tambem vale. Antes
de demonstrarmos esse resultado, vejamos um exemplo para ilustrar o papel das arestas reversas
num caminho aumentante; nos caminhos com somente arestas diretas a ideia e clara pois podemos
aumentar o uxo em cada uma das arestas no caminho do mesmo montante que ainda temos um
uxo.
Exemplo 36. Consideremos a rede representada no diagrama da gura 6.8 abaixo onde os numeros
denem as capacidades das arestas.
O unico caminho aumentante nessa rede e o caminho s, b, c, a, t e (c, a) e uma aresta reversa.
A aresta (a, c) pode transferir duas unidades de uxo para (b, c) e podemos aumentar o valor do
uxo. O uxo obtido atraves desse caminho esta representado na gura 6.9 abaixo.
84 Grafos Dirigidos
a
t
cb
s4/2
4/4
1/1 3/34/4
5/2
3/1
Figura 6.8: Uma rede. Os numeros representam as capacidades e os uxos nas arestas na foma c/f.
a
t
cb
s
4/4
1/14/44/4
3/3
3/1
5/4
Figura 6.9: Uma rede. O uxo agora tem maior valor com respeito ao uxo anterior.
Teorema 51 (Ford e Fulkerson, 1956). Um s-t uxo f numa rede N = (G, c, s, t) e maximo se
e somente se n~ao ha caminho f-aumentante em N.
Demonstrac~ao. Ja vericamos acima que se existe caminho f-aumentante ent~ao f n~ao e maximo.
Agora, suponhamos que n~ao exista caminho f-aumentante com extremos s e t.
Denimos S como o conjunto dos vertices v (incluindo s) para os quais ha um caminho de
f-aumentante com extremos s e v.
Cada aresta e do s-t corte E(S, S) deve estar saturada, isto e, f(e) = c(e), caso contrario teramos
um caminho aumentante ate o extremo de e em S, e para cada aresta d ∈ E(S, S) vale f(d) = 0 (pelomesmo motivo da saturac~ao), logo f(S) = c(S) e como val(f) = f(S) (equac~ao (6.10)) pelo corolario
50 f deve ser maximo.
Teorema 52 (Ford e Fulkerson, 1956). Se N = (G, c, s, t) e uma rede onde c(e) ∈ Z para todo
e ∈ E(G), ent~ao existe um uxo maximo f tal que f(e) ∈ Z para todo e ∈ E(G). Ademais
val(f) = c(S) para algum S ⊂ V(G).
Demonstrac~ao. Seja N uma rede e tome f0(e) = 0 para toda aresta e. Se f0 n~ao e maximo ent~ao
existe um caminho f0-aumentante tal que δ em (6.14) e um inteiro maior que 0. Tome f1 = g,
par g denida em (6.15) com f = f0. Claramente, f1 assume valores inteiros. Continuando dessa
maneira teremos uma sequencia de uxos inteiros f0, f1, f2, . . . com valores inteiros e estritamente
crescente. Como o valor e limitado pela capacidade de qualquer corte, essa sequencia e nita,
digamos f0, f1, f2, . . . fn.
Seja S o conjunto dos vertices v (incluindo s) para os quais ha um caminho de fn−1-aumentante
com extremos s e v, como descrito na demonstrac~ao do teorema 51. Dessa forma val(fn) = c(S) e
pelo corolario 50 val(fn) e maximo e c(S) e mnimo.
Se as capacidade s~ao racionais ent~ao podemos recair no teorema acima multiplicando as capaci-
dades pelo seu denominador comum. No caso geral, n~ao demostraremos mas vale o seguinte.
Teorema 53 (Ford e Fulkerson, 1956). O valor maximo de um uxo numa rede N e igual a
capacidade mnima de um corte em N.
Fluxo em redes 85
Esses resultados d~ao origem ao seguinte algoritmo.
Algoritmo 27: FordFulkerson(G, c, s, t)
Dado : uma rede (G, c, s, t).
Devolve: Um uxo de valor maximo.
para cada (u, v) ∈ E(G) faca f(u, v)← 0;1
enquanto existe caminho f-aumentante faca2
escolha um caminho f-aumentante;3
determine δ como em (6.14);4
dena g como em (6.15);5
f← g;6
devolva(f).7
Se as capacidades das arestas s~ao inteiras ent~ao esse algoritmo termina em tempo O(val(f∗)|E|),
onde f∗ denota o uxo maximo e seu valor e um limitante para o numero de iterac~oes do laco. Se
as capacidades n~ao s~ao racionais o algoritmo pode n~ao terminar (veja pagina 21 de [12]) ou ainda
n~ao convergir para a soluc~ao. Note que o algoritmo n~ao e polinomial no tamanho da entrada (veja
a observac~ao 7).
Exemplo 37. Esse e, talvez, o exemplo mais simples da situac~ao em que o algoritmo de Ford
Fulkerson falha, foi descoberto em 1993 por Uri Zwick [29]. Considere a rede representada na gura
abaixo. O uxo maximo nessa rede e 2x+ 1, onde x e um inteiro sucientemente grande. Se o algo-
ts
a
b
c
d
x
x
x
x
x
1
1
ϕx
Figura 6.10: Exemplo de uma rede onde o algoritmo n~ao converge, ϕ =√5−12
.
ritmo escolhe o caminho aumentante s, c, b, t, as capacidades residuais das arestas (a, b), (c, b), (cd)s~ao,
respectivamente, ϕ, 0, 1. Apos 4n + 1 aumentos as capacidades residuais s~ao, respectivamente,
ϕ2n−1, 0, ϕ2n−2 e quando o numero de aumentos cresce o valor do uxo converge para 1+2∑i≥1ϕ
i =
4+√5.
Em 1972, Edmonds e Karp analisaram a seguinte vers~ao para o algoritmo de Ford e Fulkerson.
Seja f um uxo em N = (G, c, s, t) e dena o grafo residual como o grafo dirigido
Rf =(V(G), e ∈ E(G) : cf(e) > 0
),
onde cf(e) = c(e) − f(e). Considere o algoritmo de FordFulkerson com a linha 3 implementada de
modo que o caminho escolhido e o s→ t caminho em Gf com o menor numero de arestas, ou seja
com distSRf(s, t) arestas; isso pode ser feito por uma busca em largura.
Agora, vamos determinar uma cota superior para o numero de aumentos feitos com essa es-
trategia.
Seja (fi)i≥0 ma sequencia de uxos em N = (G, c, s, t) com fi+1 denido a partir de fi atraves
de um caminho fi-aumentante de acordo com (6.15), para todo i ≥ 0.
86 Grafos Dirigidos
Proposicao 54. Para todo vertice v 6= s, t,
distSGfi+1(s, v) ≥ distSGfi
(s, v)
Demonstrac~ao. Suponha que a armac~ao e falsa e seja k o menor natural para o qual existe um
vertice v tal que distSGfk+1(s, v) < distSGfk
(s, v). Seja P = s, u1, . . . , u`, v o caminho mnimo em
SGfk+1, de modo que
distSGfk+1(s, v) = distSGfk+1
(s, u`) + 1. (6.16)
Pela escolha de v
distSGfk+1(s, u`) ≥ distSGfk
(s, u`), (6.17)
portanto, distSGfk+1(s, v) ≥ distSGfk
(s, u`) + 1.
A demonstrac~ao agora segue em dois casos, dependendo se a aresta u`, v ∈ E(P) e uma aresta
direta ou uma aresta reversa. Vamos supor que e uma aresta direta, o outro caso segue de deduc~ao
analoga.
Primeiro, notemos que se (u`, v) ∈ E(Gfk) ent~ao distSGfk(s, v) ≤ distSGfk
(s, u`) + 1 pela desi-
gualdade triangular; por (6.17) e (6.16) deduzimos que distSGfk(s, v) ≤ distSGfk+1
(s, v), contrari-
ando a hipotese assumida sobre v.
Agora, se (u`, v) ∈ E(Gfk+1) e (u`, v) 6∈ E(Gfk) ent~ao a aresta u`, v ∈ E(P) e uma aresta reversa
no caminho aumentante de Gfk ; como esse caminho e mnimo, distSGfk(s, u`) = distSGfk
(s, v) + 1
e como distSGfk+1(s, v) ≥ distSGfk
(s, u`) + 1, segue que distSGfk+1(s, v) ≥ distSGfk
(s, u`) + 2, uma
contradic~ao.
Teorema 55 (Edmonds e Karp, 1972). Com a estrategia acima, FordFulkerson realiza O(|V ||E|)
aumentos.
Demonstrac~ao. Cada vez que um aumento e feito, pelo menos uma aresta no caminho aumentante
utilizado e crtica, no sentido de que essa aresta limita o aumento no uxo, ou seja, e determinante
de δ em (6.14). Seja (i, j) uma aresta crtica no caminho fk-aumentante. Suponha que a proxima
vez que (i, j) apareca com uma aresta crtica seja no caminho f`-aumentante, para ` > k. Nessa
segunda ocorrencia sera com o sentido oposto ao da primeira ocorrencia.
Suponha que (i, j) e uma aresta direta no caminho fk-aumentante e uma aresta reversa no
caminho f`-aumentante. Assim, distSGfk(s, j) = distSGfk
(s, i)+1 e distSGf`(s, i) = distSGf`
(s, j)+1.
Como distSGfk(s, j) ≤ distSGf`
(s, j) temos que distSGf`(s, i) = distSGf`
(s, j)+1 ≥ distSGfk(s, j)+
1 = distSGfk(s, i) + 2, ou seja, na segunda ocorrencia da aresta como uma aresta crtica o caminho
mnimo e duas arestas mais longo, pelo menos, que na primeira ocorrencia.
Nenhum caminho de aumento tem mais que |V | − 1 arestas, logo nenhuma aresta pode ser
crtica mais que |V |/2 vezes; como s~ao no maximo |E| arestas nos grafos residuais, temos no maximo
O(|V ||E|) aumentos.
Corolario 56. O algoritmo FordFulkerson com a estrategia de escolher o caminho aumentante
com o menor numero de arestas em cada rodada, determina a uxo maximo numa rede em
tempo O(|V ||E|2), onde |V | e o numero de vertices e |E| o numero de arestas na rede.
Demonstrac~ao. O passo 3 feito por uma busca em largura tem complexidade O(|E|), com os
O(|V ||E|) aumentos do teorema acima, resulta O(|V ||E|2).
Exercıcios
Exerccio 194. Prove que para quaisquer S, T ⊂ V(G) vale que f(S) = f(T). Derive desse fato que
se val(f) = c(S) ent~ao f e maximo e S e mnimo.
Exerccio 195. Seja f um uxo que n~ao e maximo numa rede. Seja g a func~ao dada em (6.15).
prove que g e um uxo na mesma rede.
Fluxo em redes 87
Exerccio 196. Use o teorema do uxo maximocorte mnimo para derivar o teorema de Menger:
Seja N = (G, c, s, t) com c constante igual a 1. Ent~ao
o valor de um uxo maximo em N e igual ao numero maximo de (s → t)-caminhos arestas
disjuntos em G.
a capacidade de um corte mnimo e igual ao numero mnimo de arestas cujas remoc~ao destroi
todos os (s→ t)-caminhos de G.
88 Grafos Dirigidos
CAPıTULO A
ALGORITMOS E ESTRUTURAS DE DADOS
A.1 Algoritmos
A.1.1 Correcao de algoritmos
Um algoritmo esta correto se a sada esta correta para toda entrada. A prova da correc~ao do
algoritmo tem duas partes: provar que a resposta esta correta se o algoritmo terminar, provar que
o algoritmo termina.
A seguir, p e q denotam proposic~oes logicas. Um algoritmo, ou trecho de algoritmo, S esta
parcialmente correto com respeito a pre-condicao p e a pos-condicao q se sempre que p for
verdadeiro para os valores de entrada de S e S terminar, ent~ao q e verdadeiro para os valores de
sada de S.
Usamos a notac~ao pSq para dizer que S esta parcialmente correto com respeito a pre-
condic~ao p e a pos-condic~ao q.
Exemplo Por exemplo, se p e a proposic~ao x = 1 e q e a proposic~ao z = 3 e S e o trecho
ent~ao, pSq. De fato, suponha p. Apos a execuc~ao de S, y = 2 e z = 1+ 2 pois de p temos x = 1.
y← 2;
z← x+ y;
Portanto, z = 3.
Argumentos validos para correcao parcial de algoritmos.
1. Composic~ao
pS1q e qS2r⇒ pS1;S2r
2. Condicional
(a) No caso fse condic~ao entao Sg o argumento e((p e condic~ao)Sq e (p e n~ao(condic~ao))⇒ q
)=⇒
pse condic~ao entao Sq
(b) No caso fse condic~ao entao S1 senao S2g o argumento e((p e condic~ao)S1q e (p e n~ao(condic~ao))S2q
)=⇒
pse condic~ao entao S1 senao S2q
3. Lacos No caso fenquanto condic~ao faca Sg o argumento e
(p e condic~ao)Sp
=⇒penquanto condic~ao faca S(n~ao(condic~ao) e p)
A proposic~ao (p e condic~ao)Sp e o invariante do laco. Provar que uma proposic~ao e
invariante de laco precisa de induc~ao nita.
90 Algoritmos e Estruturas de dados
Algoritmo 28: multiplica(m,n : inteiros)
Dado : m e n inteiros
Devolve: m · n/* p : m e n inteiros */
se n < 0 entao a← −n; senao a← n;
/* q : p e a = |n| */
k← 0;
x← 0;
/* r : q e k = 0 e x = 0 */
enquanto k < a faca
/* (invariante do laco) x = mk e k ≤ a */
x← x+m;
k← k+ 1;/* s : x = ma e a = |n| */
se n < 0 entao produto← −x; senao produto← x;
/* t : produto = mn */
Exemplo. Seja S o algoritmo 28.
Sejam p e q as proposic~oes (logicas) descritas no algoritmo e R o trecho de algoritmo
R : se n < 0 entao a← −n; senao a← n.
Vamos provar
pRq. (A.1)
Assuma m ∈ Z e n ∈ Z. Se m ∈ Z e n ∈ Z e n < 0 ent~ao apos R terminar temos a = −n. Se n < 0
ent~ao |n| = −n portanto a = |n|, portanto
(m ∈ Z e n ∈ Z e n < 0)R(a = |n|). (A.2)
Agora, se m ∈ Z e n ∈ Z e n~ao(n < 0) ent~ao apos R terminar temos a = n. Se vale n~ao(n < 0)
ent~ao |n| = n portanto a = |n|. Portanto,
(m ∈ Z e n ∈ Z e n~ao(n < 0))R(a = |n|). (A.3)
De (A.2), (A.3) e do argumento 2(b) temos (A.1), e, portanto, pRq.
Agora, considere o trecho
T : k← 0; x← 0
e vamos provar
qT r
para q e r descritos no algoritmo. Apos k← 0; x← 0 vale k = 0 e x = 0, portanto
qk← 0; x← 0(q e k = 0 e x = 0) (A.4)
para qualquer proposic~ao verdadeira q, em particular quando
q : m ∈ Z e n ∈ Z e a = |n|
e verdadeira, logo qT r.
Assumamos r, isto e, que vele q e k = 0 e x = 0. Se k < a (a condic~ao do laco) ent~ao o invariante
x = mk e k ≤ a
Algoritmos 91
e verdadeiro antes da primeira rodada do laco pois 0 = m0 e 0 ≤ |n|. Assuma
x = mk e k ≤ a e k < a
antes de uma execuc~ao do trecho
U : x← x+m; k← k+ 1;
Considere uma execuc~ao de U e denote por x ′ e k ′ os valores das variaveis x e k antes dessa
execuc~ao. Ent~ao, por hipotese
x ′ = mk ′ e k ′ ≤ a
e (condic~ao do laco) k ′ < a; apos a execuc~ao de U teremos x = x ′ +m e k = k ′ + 1. Agora,
Se x = x ′ +m e x ′ = mk ′, ent~ao x = (mk ′) +m = m(k ′ + 1).
Se k = k ′ + 1 x = m(k ′ + 1) ent~ao x = mk.
Se k ′ < a ent~ao k ′ + 1 ≤ a.
Portanto, apos a execuc~ao de U o invariante e verdadeiro, ou seja,
(x = mk e k ≤ a e k < a)U(x = mk e k ≤ a)
e do argumento para lacos, temos
(x = mk e k ≤ a)enquanto k < a faca U(x = mk)
ainda, n~ao(k < a) e x = mk e k ≤ a equivale a x = mk e k = a. Portanto,
renquanto k < a faca U(x = ma)
logo renquanto k < a faca Us, onde s : x = ma e a = |n|.
Finalmente, assumamos a proposic~ao s, denotemos por Q o trecho de algoritmo
se n < 0 entao produto← −x; senao produto← x
e vamos provar t, isto e, que produto = mn. Porem,
Se s, ent~ao x = m|n|.
Se x = m|n| e n < 0 ent~ao apos Q, produto = −x.
Se produto = −x e x = m|n| e n < 0 ent~ao produto = −m|n| = −m(−n) = mn.
Portanto t. Agora,
se x = ma e a = |n|, ent~ao x = m|n|.
Se x = m|n| e n~ao(n < 0) ent~ao apos Q, produto = x.
Se produto = x e x = m|n| e n~ao(n < 0) ent~ao produto = m|n| = mn.
Portanto, pelo argumento 2.(b) para condicionais
(x = ma e a = |n|)Q(produto = mn).
Resumindo, provamos
1. pse n < 0 entao a← −n; senao a← nq;
2. qk← 0; x← 0r;
92 Algoritmos e Estruturas de dados
3. renquanto k < a faca c← x+m; k← k+ 1; s;
4. sse n < 0 entao produto← −x; senao produto← xt;
De 1 e 2 temos
pse n < 0 entao a← −n; senao a← n;k← 0; x← 0r. (A.5)
pela regra da composic~ao. De 3 e 4 temos, por composic~ao novamente
r enquanto k < a faca c← x+m; k← k+ 1; ;
se n < 0 entao produto← −x;
senao produto← x t.
que junto com (A.5) e mais a regra da composic~ao resulta que
(m ∈ Z e n ∈ Z)S(produto = mn).
Mais Invariante de laco. Consideremos o seguinte algoritmo:
Algoritmo 29: fat(n)
Dado : n natural
Devolve: n!
i← 1;
f← 1;
enquanto i < n facaf← f ∗ (i+ 1);i← i+ 1;
devolva f.
Vamos provar que a seguinte proposic~ao e um invariante do laco na terceira linha do algoritmo
i ≥ 1 e i ≤ n e f = i! (A.6)
Antes, porem, notemos que o invariante e a negac~ao da condic~ao do laco resulta que quando o laco
termina temos i ≥ 1 e i ≤ n e f = i! e n~ao(i < n), ou seja, i = n e f = n!, provando a correc~ao
parcial do algoritmo.
Vamos provar que a proposic~ao (A.6) e verdadeira independente do numero de vezes que o laco
e executado. A prova e por induc~ao no numero de iterac~oes do enquanto.
Suponhamos que a condic~ao do laco vale, ou seja, i < n. Antes da primeira iterac~ao (A.6) e
verdadeiro pois i = f = 1! = 1.
Suponhamos que i < n e que i ≥ 1 e i ≤ n e f = i!. Apos a execuc~ao de f← f ∗ (i+ 1) e apos aexecuc~ao de i← i+ 1 temos que para o novo valor de i, i ≥ 1 e i ≤ n e f = i!.
Exercıcios
Exerccio 197. Prove que o seguinte programa esta parcialmente correto.
Exerccio 198. Escreva o argumento para outros comandos de laco como o para cada.
A.2 Estruturas de Dados
A.2.1 Heap
Uma arvore binaria T e ou a arvore vazia, denotada ∅ (por abuso de notac~ao) e que n~ao
possui vertices, ou e uma terna T = (r, E,D) em que r e um vertice chamado raiz de T , e E e D s~ao
Estruturas de Dados 93
Algoritmo 30: Divis~ao inteira(a, d)
Dado : a natural e d natural positivo
Devolve: inteiros q e r tais que a = dq+ r e 0 ≤ r < d
r← a;
q← 0;
enquanto r ≥ d facar← r− d;
q← q+ 1;devolva q, r.
arvores binarias disjuntas e que n~ao contem r, chamadas subarvore esquerda e subarvore direita,
respectivamente. A raiz de E, dado que E 6= ∅, e chamada lho esquerdo de r e a raiz de D, dado
que D 6= ∅, e chamada lho direito de r. Nos casos (f,∅,∅) chamamos f de folha, e os vertices
n~ao-folha s~ao ditos vertices internos.
Heap e uma estrutura de dados com representac~ao em um vetor V de uma arvore binaria quase-
completa, isto e, uma arvore binaria com altura d na qual todas as folhas est~ao no nvel d ou d− 1,
e se um no n na arvore tem algum descendente direito no nvel d, ent~ao todos os descendentes
esquerdos de n que forem folhas est~ao tambem no nvel d. Dado um heap V e um ndice i, os
altura
3
5
4
10
7
9
8
1 2 6
V:
1 2 3 4 5 6 7 8 9 10
10 9 5 8 7 4 3 1 2 6
Figura A.1: Exemplo de uma heap
ndices no vetor do pai, lho esquerdo e lho direito s~ao dados por:
pai(i) = bi/2c
esq(i) = 2i
dir(i) = 2i+ 1
Cada no tem associado um conteudo que satisfaz apenas um dos seguintes itens, chamado propri-
edade da heap:
max-heap: V [pai(i)] ≥ V[i];
min-heap: V [pai(i)] ≤ V[i].
Exerccio 199. Prove que a altura de uma arvore binaria quase-completa de n e blog2(n)c.
A seguir daremos alguns algoritmos para heap e neles usamos tamHeap(V) para o ndice do
maior elemento em V que esta preenchido com elementos do heap; tam(V) e o tamanho do vetor.
Exerccio 200. Mostre que para uma heap de tamanho n a complexidade de tempo de FazHeap e
O(logn).
Observemos que todos os elementos com ndice maior que btamHeap(V)c s~ao folhas, portanto,
a iterac~ao so precisa tratar os elementos armazenados nos ndices menores que esee.
94 Algoritmos e Estruturas de dados
Algoritmo 31: FazHeap(V, i)
Dado : dados um vetor V e um ndice i de modo que as subarvores esquerda e direita do
elemento i ja satisfazem a propriedade (max) heap
Devolve: V com subarvore de raiz i satisfazendo a propriedade de heap
se (esq(i) ≤ tamHeap(V) e V [esq(i)] > V[i]) entaomaior← esq(i);
senaomaior← i;
se (dir(i) ≤ tamHeap(V) e V [dir(i)] > V[maior]) entaomaior← dir(i);
se maior 6= i entaotroca o conteudo de V [i] com V [maior];
FazHeap(V,maior).
Algoritmo 32: constroiheap(V)
Dado : vetor V
Devolve: V que satisfaz a propriedade de (max) heap
tamHeap(V) = tam(V);
para i de btamHeap(V)c ate 1 facaFazHeap(V, i).
Exerccio 201. Prove que a complexidade de tempo de constroiheap para n elementos e O(n).
Exerccio 202. Use o constroiheap para projetoar um algoritmo de ordenac~ao e analise a comple-
xidade desse algoritmo.
Uma das aplicac~os para o heap e a implementac~ao de uma la de prioridades: uma estrutura
para manter um conjunto de elementos S, cada um com um valor associado, chamado de chave.
Deve prover as seguintes operac~oes:
insere(S, x): insere o elemento x em S;
maximo(S): retorna o elemento de S de maior chave;
extraiMax(S): remove e retorna o elemento de S com maior chave.
Algoritmo 33: max(V)
devolva V [1].
A.2.2 Estruturas de dados para representar conjuntos disjuntos
Nessa sec~ao veremos estruturas para implementar as operac~oes faz, busca e uni~ao utilizadas
no algoritmo de Kruskal. Para efeito de comparac~ao entre diferentes estruturas de dados para
representar conjuntos disjuntos, as analises de desempenho dessas operac~oes s~ao realizadas em
termos do numero de operac~oes faz, busca e uni~ao; doravante denotamos por m a quantidade
de tais operac~oes, e com a hipotese de que as n primeiras operac~oes s~ao faz. Isso porque as
vezes o tempo de pior caso de uma operac~ao e uma super-estimativa para o custo da maioria das
operac~oes.
A.2.3 Estruturas de dados para representacao de conjuntos disjuntos
O problema e representar dinamicamente uma famlia S de conjuntos disjuntos C = C1, C2, . . . , Ck
sobre um universo U de modo que cada conjunto e identicado por um representante que e um
Estruturas de Dados 95
Algoritmo 34: extraiMax(V)
se tamHeap(V) ≥ 1 entaomax← V [1];
troca o conteudo de V[1] como o de V [tamHeap(V)];
tamHeap(V)← tamHeap(V) − 1;
FazHeap(V, 1);
devolva max.
Algoritmo 35: insere(A, k)
tamHeap(V)← tamHeap(V) + 1;
i← tamHeap(V);
V [i]← k;
enquanto i > 1 e V[pai(i)] < A[i] facatroca o conteudo de V[pai(i)] com o de V [i];
i← pai(i);
elemento do proprio conjunto e que n~ao tem nenhuma outra propriedade especial, o importante e
que, dado que o conjunto n~ao mudou, toda vez que se pergunta pelo representante a resposta deve
ser a mesma. Para as nossas aplicac~oes podemos assumir que U = 1, 2, . . . , n.
Essas estruturas devem comportar as operac~oes faz, busca e uni~ao sobre C:
faz(x) cria o conjunto unitario Ck+1 = x em C
busca(x) devolve o representante do conjunto ao qual x pertence;
uni~ao(x, y) substitui em C os conjuntos que contem x e y pela uni~ao desses dois conjuntos; se
x ∈ Cx e y ∈ Cy ent~ao uni~ao(x, y) remove os conjuntos Cx e Cy de C e acrescenta Cx ∪ Cya C, alem disso escolhe-se um representante para Cx ∪ Cy.
Representacao usando vetor Usamos um vetor C indexado por U e a ideia e que dois elementos
do conjunto universo x e y est~ao no mesmo conjunto se e somente se as posic~oes x e y do vetor
tem o mesmo conteudo, assim Ck = x ∈ U : C[x] = k. Escolhemos como representante do conjunto
o menor elemento. Dessa forma, os algoritmos para as operac~oes faz, busca e uni~ao cam da
seguinte forma
Algoritmo 36: faz(x)
C[x]← x.1
Teorema 57. O tempo gasto com m operac~oes num universo com n elementos e O(mn).
Observamos que o tempo de pior caso n~ao esta superestimado como mostra a seguinte sequencia
de operac~oes: faz(1), faz(2) . . . faz(n),
uni~ao(2, 1) 1 atualizac~ao no vetor C
uni~ao(3, 2) 2 atualizac~oes no vetor C
uni~ao(4, 3) 3 atualizac~oes no vetor C
uni~ao(5, 4) 4 atualizac~oes no vetor C
......
uni~ao(n,n− 1) n− 1 atualizac~oes no vetor C
cujo custo e Θ(nm).
96 Algoritmos e Estruturas de dados
Algoritmo 37: busca(x))
devolva(C[x]).1
Algoritmo 38: uni~ao(x, y)
k← minbusca(x), busca(y);1
para cada i de 1 ate n faca2
se C[i] = C[x] ou C[i] = C[y] entao3
C[i]← k;4
Corolario 58. A da complexidade do algoritmo Kruskal(G) quando usamos vetor para repre-
sentar e manipular conjuntos disjuntos e O(|V(G)||E(G)|) para qualquer grafo conexo G com
pesos nas arestas.
Demonstrac~ao. Vimos que o tempo do Kruskal e O(|E| log |E|) mais o tempo gasto com as O(|E|)
operac~oes, pelo teorema acima tempo O(|V ||E|).
Representacao usando listas ligadas Cada conjunto e dado por uma lista ligada. A cada
elemento do universo esta associado um no com os atributos prox que aponta para o proximo
elemento da lista e rep que aponta para o representante do conjunto.
a b c d e f g h i
V:
Figura A.2: Representac~ao com listas ligadas dos subconjuntos c, d, e, a e b, f, g, h do universo
a, b, c, d, e, f, g, h, i .
As func~oes faz e busca operam ligeiramente diferente da que vimos:
faz(x) cria um novo no apontado por x;
busca(x) devolve um ponteiro para o representante do unico conjunto ao qual x pertence;
uni~ao(x, y) une os conjuntos que contem x e y concatenando-se as listas e atualizando-se os pon-
teiros rep de todos elementos de uma das listas.
Uma busca (busca(x)) e feita em tempo constante e o custo de uma uni~ao (uni~ao(x, y)) e
basicamente o custo das atualizac~oes. Dessa forma, a complexidade de tempo das operac~oes nessa
representac~ao e da mesma ordem de grandeza da representac~ao por vetor. Adotando a seguinte
heurstica, a complexidade melhora substancialmente:
(‡) Atualizar sempre a menor lista: pressupondo um atributo `[C] que armazena o numero
de elementos de C, numa uni~ao de duas listas adicionamos a menor lista no nal da maior
lista.
Para um elemento x do universo, a primeira vez que rep[x] e atualizado resulta numa lista de
tamanho 2. A segunda vez que rep[x] e atualizado resulta numa lista de tamanho 4 e assim por
diante. Logo, o numero de atualizac~oes que rep[ ] de um elemento qualquer e atualizado e lgn.
Proposicao 59. Supondo a heurstica (‡) se o representante de x muda k vezes, ent~ao o
tamanho da lista que contem x e pelo menos 2k.
Estruturas de Dados 97
Demonstrac~ao. A prova e por induc~ao em k ∈ N que vale: se o representante de x muda k vezes,
ent~ao o tamanho da lista que contem x e pelo menos 2k, para qualquer elemento x do universo.
Para k = 0, x e o unico elemento na lista dele e portanto temos a base da induc~ao. Para k ≥ 1assumimos que se k− 1 atualizac~oes foram feitas ent~ao a lista de x tem tamanho pelo menos 2k−1.
Na proxima atualizac~ao do representante de x ocorre numa uni~ao com uma lista que tem pelo
menos o mesmo numero de elementos da lista de x, resultando numa lista com pelo menos 2 ·2k−1 =2k elementos. O resultado segue do Princpio da Induc~ao Finita.
Corolario 60. O representante de um elemento qualquer do universo muda no maximo blgncvezes.
Teorema 61. O tempo para m operac~oes num universo com n elementos e O(m+ n logn).
Demonstrac~ao. As operac~oes faz e busca custam O(m) e cada um dos n elementos tem rep[ ]
atualizado O(logn) vezes.
Corolario 62. A complexidade do algoritmo de Kruskal sobre um grafo conexo G quando
usamos listas ligadas para representar e manipular conjuntos disjuntos e O(|E(G)| log |V(G)|).
Demonstrac~ao. S~ao O(|E|) operac~oes que custam O(|E| + |V | log |V |) instruc~oes mais o tempo de
ordenac~ao O(|E| lg |E|), que resulta na complexidade O((|V | + |E|) log |V |) = O(|E| log |V |), pois G e
conexo.
Representacao por floresta A ideia e que cada subconjunto seja representado por uma arvore
de modo que cada elemento do subconjunto seja representado por um no da arvore. Nessa arvore
cada no n~ao-raiz aponta para um pai e a raiz e o representante (gura A.3); o pai da raiz e ela
mesma. Dessa forma, faz cria em tempo constante uma nova arvore que contem somente a raiz,
uni~ao e feita em tempo constante mudando-se o pai de uma das razes (gura A.4) e busca, que
tem tempo dependente da profundidade do elemento na arvore, retorna um ponteiro para uma raiz.
d e
c
a f
b
g
h
Figura A.3: Uma representac~ao com arvores dos subconjuntos c, d, e, a e b, f, g, h.
f
b
g
hd e
c
Figura A.4: Resultado de uni~ao(e, f).
Claramente, essa estrutura pode ser muito ruim se a arvore formada for uma lista linear en-
tretanto, com algumas heursticas bastante simples o resultado nal melhora substancialmente.
Comecamos com a seguinte heurstica para uni~ao de dois subconjuntos, onde tamanho de uma
arvore e o numero de nos
Uniao por tamanho: arvore de menor tamanho e colocada como sub-arvore da arvore de
maior tamanho.
98 Algoritmos e Estruturas de dados
Denimos a altura de uma arvore como a maior distancia de um no ate a raiz e temos a
seguinte relac~ao entre tamanho e altura resultantes de uma sequencia de uni~oes com a heurstica de
uni~ao por tamanho.
Proposicao 63. Usando uni~ao por tamanho, o numero de nos de cada arvore e pelo menos
2h, onde h e a altura da arvore.
Demonstrac~ao. Vamos denotar por t(x) o numero de nos na arvore que contem x e por h(x) a
altura da arvore que contem x. Vamos provar a proposic~ao por induc~ao no numero de uni~oes: para
todo k ∈ N, apos k uni~oes t(x) ≥ 2h(x) para todo x.
Com 0 uni~oes estamos na congurac~ao inicial, ou seja, t(x) = 1 e h(x) = 0 para todo x, ou
seja, a base da induc~ao e verdadeira. Para k ≥ 1, vamos assumir que apos k − 1 uni~oes temos
t(x) ≥ 2h(x), para todo x. Se a k-esima uni~ao e uni~ao(x, y) ent~ao t(z) ≥ 2h(z) para todo z com
busca(z) 6∈ busca(x), busca(y), ou seja, a relac~ao entre tamanho e altura n~ao muda para as
arvores que n~ao est~ao envolvidas na uni~ao. Vamos denotar por t ′ e h ′ o tamanho e a altura da
arvore resultante da uni~ao e t(x), t(y), h(x) e h(y) os tamanhos e as alturas antes da k-esima uni~ao.
Podemos assumir, sem perda de generalidade, que h(x) ≥ h(y) e dessa forma na uni~ao teremos que
o pai de y e x.
Com essa notac~ao h ′ = maxh(x), h(y)+1. A demonstrac~ao segue em dois casos: (i) se h ′ = h(x)
ent~ao t ′ = t(x) + t(y) ≥ t(x) e pela hipotese de induc~ao t(x) ≥ 2h(x), logo t ′ ≥ 2h′; (ii) se
h ′ = h(y) + 1 ent~ao t ′ = t(x) + t(y) ≥ 2t(y) e pela hipotese de induc~ao t(y) ≥ 2h(y), logo
t ′ ≥ 2 · 2h(y) = 2h′. Em ambos os casos temos que apos k uni~oes t(x) ≥ 2h(x) para todo x. A
proposic~ao segue pelo Princpio da Induc~ao Finita.
Corolario 64. O tempo de m operac~oes num universo de tamanho n e O(m logn+ n).
Demonstrac~ao. Cada faz e feito em tempo O(1) e cada uni~ao em tempo O(1), resultando em
O(n). Cada busca e feito em tempo O(logn) resultando em O(m logn).
Assumimos que cada no x tem um atributo t[x] que armazena o numero de elementos na arvore
enraizada em x os algoritmos cam da seguinte forma
Algoritmo 39: faz(x)
pai[x]← x;1
t[x]← 1.2
Algoritmo 40: busca(x)
enquanto x 6= pai[x] faca x← pai[x];1
devolva(pai[x]).2
Para descrever a uni~ao, usaremos o procedimento link a seguir.
Algoritmo 41: link(x, y)
t[x]← t[x] + t[y];1
pai[y]← x.2
Como o tempo das operac~oes busca s~ao proporcionais a altura parece ser mais natural uma
heurstica que leva em conta a altura e n~ao o tamanho da arvore.
Uniao por altura: usamos a altura, ao inves do tamanho pendurando a arvore mais baixa
na raiz da arvore mais alta.
Com essa heurstica a proposic~ao 63 continua valendo, e consequentemente o corolario. Os
algoritmos para faz, busca e uni~ao s~ao os algoritmos 39, 40 e 42 com t trocado por h, que e
Estruturas de Dados 99
Algoritmo 42: uni~ao(x, y)
se t[busca(x)] ≥ t[busca(y)] entao link(busca(x), busca(y));1
senao link(busca(y), busca(x)).2
iniciado com 0. Em link so precisamos atualizar h se as arvore envolvidas na uni~ao tem a mesma
altura,
Algoritmo 43: link(x, y)
se h[x] = h[y] entao h[x]← h[x] + 1;1
pai[y]← x.2
Comparando os tempos obtidos para lista ligada e arvores
O(m+ n logn)×O(m logn+ n)
usando em ambas representac~oes uni~ao por tamanho, conclumos que ha situac~oes onde o uso de
arvores e pior. Esse fato remete-nos a uma proxima heurstica.
Busca com compressao de caminhos e uniao por rank: quando fazemos um busca(x)
aproveitamos o percurso de x ate a raiz da arvore e desviamos os ponteiros pai[y], de todo
y nesse caminho, para a raiz; na uni~ao penduramos a arvore de menor rank na raiz da de
maior rank.
Exemplo 38. Esquema de uma busca com compress~ao de caminhos.
b
d
c
d c
b
busca(d)
Notemos que se estivermos usando uni~ao por altura, a compress~ao de caminhos modica a
altura da arvore e a atualizac~ao custa muito caro, portanto n~ao a atualizamos e usamos h como
uma estimativa superior para a altura, que chamaremos de rank.
O algoritmo para busca com compress~ao de caminhos ca
Algoritmo 44: busca(x)
se x 6= pai[x] entao pai[x]← busca(pai[x]);1
devolva(pai[x]).2
Essa duas heursticas juntas, a uni~ao por rank e a compress~ao de caminhos e bastante eciente.
O proximo resultado, sobre a complexidade de m operac~oes num universo de tamanho n, envolve
uma func~ao α(m,n) que cresce muito vagarosamente; na pratica podemos assumir que α = 4. N~ao
demonstraremos esse teorema (veja [7]), o resultado que mostraremos a seguir e um pouco menos
preciso.
Teorema 65 (Tarjan, 1975). O tempo gasto com m operac~oes num universo de tamanho n e
O(mα(m,n)).
100 Algoritmos e Estruturas de dados
Observac~ao 17. A func~ao α(m,n) e uma func~ao que cresce muito vagarosamente. A func~ao de
Ackermann, dada por
A(m,k) =
2k se m = 1,
A(m− 1, 2) se m > 1 e k = 1,
A(m− 1,A(m,k− 1) caso contrario,
e conhecida por crescer muito rapidamente, por exemplo uau = A(4, 1) ∼ 1080 (maior que o numero
estimado de atomos no universo observavel), e
α(m,n) = mini : A(i, bm/nc) > lg(n)
.
Para efeitos praticos podemos assumir α < 5.
Por exemplo
n α(n,n)
0 2 0
3 1
4 7 2
8 2047 3
2048 uau 4
Suponha uma sequencia qualquer de t operac~oes das quais as n primeiras s~ao faz. Particionamos
os elementos de U de acordo com o rank nal do no associado: o Grupo 0 tem os elementos de
rank 0 e 1; o Grupo 1 tem os elementos de rank 2; de um modo geral para k > 2 o Grupo k tem
os elementos de rank em (k, 2k].
O rank dos elementos satisfazem as seguintes propriedades:
(i) quando um no deixa de ser raiz o seu rank n~ao muda nas proximas operac~oes;
(ii) rank[x] < rank[p[x]] para todo x ∈ U que n~ao e raiz;
(iii) na sub-arvore enraizada em x se a altura e h ent~ao o numero de elementos e pelo menos 2h;
(iv) o numero de nos de rank no intervalo (k, 2k] e no maximo n/2k;
(v) o numero de Grupos e lg∗(n), onde lg∗(n) e o numero de vezes que temos que iterar lg ate
que o valor obtido seja menor ou igual a 1, por exemplo, lg∗ 216 = 4.
O custo total das t operac~oes e limitado superiormente pelo custo de m ≤ 2t operac~oes busca.Vamos rastrear uma dessas operac~oes. Num busca(x) os apontadores p[y] no caminho de x ate a
raiz ser~ao redirecionados para a raiz. Classicamos esses apontadores em 2 tipos:
1. Tipo 1 s~ao os apontadores nos nos y tais que p[y] esta num grupo diferente de y, ou y e raiz,
e
2. Tipo 2 s~ao os apontadores dos nos que est~ao no mesmo grupo do pai.
As m operac~oes redirecionam no maximo lg∗(n) apontadores do Tipo 1. Um apontador do Tipo
2 de um no em (k, 2k] e redirecionado no maximo 2k pois por (ii) a cada redirecionamento de p[y]
o apontador apontara para um no de rank maior (para y que n~ao e raiz ou lho de raiz) que o rank
do pai previo, a partir da por (i) o apontador sera sempre do Tipo 1; como s~ao no maximo n/2k
nos o custo e no maximolg∗(n)∑i=0
n
2k2 = O(n lg∗(n)).
Com isso provamos
Teorema 66. O tempo gasto com m operac~oes num universo com n elementos e O((m +
n) lg∗(n)).
Estruturas de Dados 101
Exercıcios
Exerccio 203. Demonstre as tres propriedades de rank enunciadas acima.
102 Algoritmos e Estruturas de dados
Referencias Bibliograficas
[1] Jrgen Bang-Jensen and Gregory Gutin. Digraphs. Springer Monographs in Mathematics.
Springer-Verlag London Ltd., London, 2001. Theory, algorithms and applications.
[2] Nicolas Barnier and Pascal Brisset. Graph coloring for air trac ow management. Annals of
Operations Research, 130:163178, 2004.
[3] Bela Bollobas. Extremal graph theory. Academic Press Inc. [Harcourt Brace Jovanovich
Publishers], London, 1978.
[4] Preston Briggs, Keith D. Cooper, and Linda Torczon. Improvements to graph coloring register
allocation. ACM Trans. Program. Lang. Syst., 16(3):428455, 1994.
[5] A. A. Canutescu, A. A. Shelenkov, and R. L. Dunbrack. A graph-theory algorithm for rapid
protein side-chain prediction. Protein Science, 12(9):2001 2014, 2009.
[6] Don Coppersmith and Shmuel Winograd. Matrix multiplication via arithmetic progressions.
J. Symbolic Comput., 9(3):251280, 1990.
[7] Thomas H. Cormen, Charles E. Leiserson, and Ronald L. Rivest. Introduction to algorithms.
The MIT Electrical Engineering and Computer Science Series. MIT Press, Cambridge, MA,
1990.
[8] D. de Werra. An introduction to timetabling. European Journal of Operational Research,
19(2):151 162, 1985.
[9] Reinhard Diestel. Graph theory. Springer-Verlag, New York, second edition, 2000.
[10] Irit Dinur. The PCP theorem by gap amplication (extended abstract). In STOC'06: Pro-
ceedings of the 38th Annual ACM Symposium on Theory of Computing, pages 241250,
New York, 2006. ACM.
[11] I. G. Enting. The combinatorics of algebraic graph theory in theoretical physics. In Combina-
torial mathematics (Proc. Internat. Conf. Combinatorial Theory, Australian Nat. Univ.,
Canberra, 1977), volume 686 of Lecture Notes in Math., pages 148156. Springer, Berlin,
1978.
[12] L. R. Ford, Jr. and D. R. Fulkerson. Flows in networks. Princeton University Press, Princeton,
N.J., 1962.
[13] Zvi Galil. Ecient algorithms for nding maximum matching in graphs. ACM Comput. Surv.,
18(1):2338, 1986.
[14] A. Gamst. Some lower bounds for a class of frequency assignment problems. Vehicular Tech-
nology, IEEE Transactions on, 35(1):8 14, feb. 1986.
[15] Michael R. Garey and David S. Johnson. Computers and intractability. W. H. Freeman and
Co., San Francisco, Calif., 1979. A guide to the theory of NP-completeness, A Series of Books
in the Mathematical Sciences.
[16] Oded Goldreich, Russell Impagliazzo, Leonid Levin, Ramarathnam Venkatesan, and David
Zuckerman. Security preserving amplication of hardness. In 31st Annual Symposium on
Foundations of Computer Science, Vol. I, II (St. Louis, MO, 1990), pages 318326. IEEE
Comput. Soc. Press, Los Alamitos, CA, 1990.
[17] Rajiv Gupta, Mary Lou Soa, and Denise Ombres. Ecient register allocation via coloring
using clique separators. ACM Trans. Program. Lang. Syst., 16(3):370386, 1994.
104 REFERENCIAS BIBLIOGRAFICAS
[18] Russell Impagliazzo and Avi Wigderson. P = BPP if E requires exponential circuits: deran-
domizing the XOR lemma. In STOC '97 (El Paso, TX), pages 220229 (electronic). ACM,
New York, 1999.
[19] The Clay Mathematics Institute. Millennium Problems. http://www.claymath.org/
millennium, May 2000. Acesso em 03/2008.
[20] N. J. Kalton and James W. Roberts. Uniformly exhaustive submeasures and nearly additive
set functions. Trans. Amer. Math. Soc., 278(2):803816, 1983.
[21] L. Lovasz and M. D. Plummer. Matching theory, volume 121 of North-Holland Mathematics
Studies. North-Holland Publishing Co., Amsterdam, 1986. Annals of Discrete Mathematics,
29.
[22] Alexander Lubotzky and Igor Pak. The product replacement algorithm and Kazhdan's property
(T). J. Amer. Math. Soc., 14(2):347363 (electronic), 2001.
[23] O. Mason and M. Verwoerd. Graph theory and networks in biology. Systems Biology, IET,
1(2):89 119, mar. 2007.
[24] Eleanor M. Mitchell, Peter J. Artymiuk, David W. Rice, and Peter Willett. Use of techniques
derived from graph theory to compare secondary structure motifs in proteins. Journal of
Molecular Biology, 212(1):151 166, 1990.
[25] Michael Sipser and Daniel A. Spielman. Expander codes. IEEE Trans. Inform. Theory, 42(6,
part 1):17101722, 1996.
[26] Nenad Trinajstic. Chemical graph theory. Mathematical Chemistry Series. CRC Press, Boca
Raton, FL, second edition, 1992.
[27] Alasdair Urquhart. Hard examples for resolution. J. ACM, 34(1):209219, 1987.
[28] Leslie G. Valiant. On non-linear lower bounds in computational complexity. In Seventh Annual
ACM Symposium on Theory of Computing (Albuquerque, N. M., 1975), pages 4553.
Assoc. Comput. Mach., New York, 1975.
[29] Uri Zwick. The smallest networks on which the Ford-Fulkerson maximum ow procedure may
fail to terminate. Theoret. Comput. Sci., 148(1):165170, 1995.
INDICE REMISSIVO 105
Indice Remissivo
(x1 → xk)-caminho, 74
M-alternante, 66
M-aumentante, 66
busca, 96, 99
f-aumentante, 83
faz, 96, 99
k-aresta-conexo, 48
k-clique, 13
k-conexo, 48
k-conjunto-independente, 13
k-cubo, 34
s-t corte, 82
s-t uxo, 82
uni~ao, 96, 99
arvore, 57
geradora, 58
geradora mnima, 60
arvore binaria, 92
Heap, 93
busca, 62, 100
faz, 62
uni~ao, 62
adjacentes, 9
algoritmo
BellmanFord, 76
de Edmonds, 71
de FloydWarshall, 41
de BellmanFord, 76
de Dijkstra, 37
de Fleury, 53
de JarnkPrim, 60
de Kruskal, 61
Dijkstra, 36
ancestral, 44, 73
aresta, 9
aresta de corte, 47
aresta de retorno, 45
aresta-conexidade, 48
aresta-transitivo, 20
arestas adjacentes, 9
articulac~ao, 44
automorsmo, 20
biconexo, 44
blocos, 50
Busca
em Largura, 28
em Profundidade, 28
caminho, 31
hamiltoniano, 55
mnimo, 75
orientado, 74
caminho mnimo, 35
capacidade do corte, 82
cintura, 33
circuito, 32
mpar, 33
hamiltoniano, 53
negativo, 76
orientado, 74
clique, 13
coberto, 65
cobertura mnima, 67
cobertura por vertices, 67
complemento, 11
completo, 11
componente
biconexo, 44
conexo, 43
fortemente conexo, 78
comprimento, 31, 32, 35
de um caminho orientado, 75
concatenac~ao, 34
concatenac~ao de caminhos, 34
conexidade, 48
conexo, 43
conjunto independente, 13
corte
capacidade, 82
denido por A, 15
uxo, 82
custo de um subgrafo, 59
descendente, 44, 73
desigualdade
triangular, 36, 76
diametro, 32
diagrama, 9
digrafo, 20
distancia, 31, 35, 75
emparelhamento, 65
maximo, 65
perfeito, 65
extremos, 9, 31
Fecho transitivo, 74
lho, 44, 73
oresta, 57
106 REFERENCIAS BIBLIOGRAFICAS
uxo
valor, 82
uxo no corte, 82
folha, 57
grafo, 9
k-partido, 17
bipartido, 14
bipartido completo, 16
com pesos nas arestas, 20
completo, 11
das componentes, 78
de blocos, 50
de Petersen, 18
dirigido, 20, 73
euleriano, 52
hamiltoniano, 53
linha, 12
orientado, 20
regular, 12
subjacente, 20
transposto, 78
trivial, 9
vazio, 9
grafo residual, 85
grau, 10
de entrada, 73
de sada, 73
maximo, 10
medio, 10
mnimo, 10
intersecc~ao de grafos, 11
isomorsmo, 18
isomorfos, 18
lista de adjacencias, 21
lista de adjacencias
dirigida, 73
mnimo
s-t corte, 83
matriz
de incidencias, 24
de adjacencias, 21
multigrafo, 20
operac~ao elementar, 59
ordem, 9
Ordenac~ao topologica, 74
passeio, 25
patriarca, 44
permanente, 69
rank, 100
rede, 82
regular, 12
subgrafo, 13
bipartido induzido, 14
gerador, 13
induzido, 13
tamanho, 9
Teorema
de Berge, 66
de Brooks, 47
de Hall, 68, 69
de Konig, 67
de Menger, 50
de Turan, 17
de Tutte, 67
Ford e Fulkerson, 84
traco, 24
triangulo, 13
trilha, 52
euleriana, 52
euleriana fechada, 52
fechada, 52
uni~ao de grafos, 11
union-nd, 96
com arvores, 98
com lista ligada, 97
com vetor, 96
vertice, 9
vertice de corte, 44
vertice-transitivo, 20
vertices internos, 31
valor do uxo, 82
vetores de incidencias, 24
vizinhanca, 10
vizinhanca de U, 17
vizinhos, 10
INDICE DE SMBOLOS 107
Indice de Sımbolos
(V, E, ρ), 20
C = 1, . . . , k, 1, 32
Ck, 32
E(G), 9
E+, 73
E−, 73
EG(v), 10
G+ xy, 57
G− F, 48
G−U, 48
G− e, 43
G− v, 44
G = (A ∪ B, E), 14G = (V, E), 9
G[M], 13
G[U], 13
G ' H, 18Gn, 9
H ⊆ G, 13Kn, 11
Kn,m, 16
N+, 73
N−, 73
NG(U), 17
NG(v), 10
O(fn), 8
P = 0, 1, . . . , k, 31
Pk+1, 31
V(G), 9
∆(G), 10
Ω(fn), 8
Θ(fn), 8
α(G), 16
χ(G), 12
δ(G), 10
κ(G), 48
λ(G), 48
dist(u, v), 35, 75
distk(i, j), 40
µ(G), 65
ν(G), 67
ω(G), 16
LG, 12
cin(G), 33
diam(G), 32
distG(u, v), 31
distG(u, v) =∞, 31
val(f), 82
c(S), 83
d(G), 10
d(v), 10