Você está na página 1de 37

MO417 — Complexidade de Algoritmos I

Cid Carvalho de Souza Cândida Nunes da Silva


Orlando Lee
Grafos: Noções Básicas e Representação

26 de outubro de 2011

Revisado por Zanoni Dias

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Definição de Grafo Definição de Grafo

Um grafo é um par G = (V , E) onde:


V é um conjunto finito de elementos chamados vértices e
Dada uma aresta e = (a, b), dizemos que os vértices a e b
E é um conjunto finito de pares não-ordenados de vértices são os extremos da aresta e e que a e b são vértices
chamados arestas. adjacentes.
Exemplo: Dizemos também que a aresta e é incidente aos vértices a
V = {a, b, c, d, e} e b, e que os vértices a e b são incidentes à aresta e.
E = {(a, b), (a, c), (b, c), (b, d), (c, d), (c, e), (d, e)}

a c
e
e a b

b d

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Grafo Simples Tamanho do Grafo

Dizemos que um grafo é simples quando não possui laços


ou arestas múltiplas. Denotamos por |V | e |E| a cardinalidade dos conjuntos de
Um laço é uma aresta com extremos idêntico e arestas vértices e arestas de um grafo G, respectivamente.
múltiplas são duas ou mais arestas com o mesmo par de No exemplo abaixo temos |V | = 5 e |E| = 7.
vértices como extremos.
a c
Exemplo: laço
e
a c
b d
e
O tamanho do grafo G é dado por |V | + |E|.
b d
arestas múltiplas

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Subgrafo e Subgrafo Gerador Grau de um vértice

O grau (degree) de um vértice v , denotado por d(v ) é o


número de arestas incidentes a v , com laços contados
Um subgrafo H = (V ′ , E ′ ) de um grafo G = (V , E) é um duas vezes.
grafo tal que V ′ ⊆ V , E ′ ⊆ E. Exemplo:
d(a)=2
Um subgrafo gerador de G é um subgrafo H com V ′ = V .
a c d(b)=3
Exemplo:
e d(c)=6
d(d)=5
a c a c a c b d d(e)=4
e e

b d b d b d Teorema (Handshaking lemma)


Grafo G Subgrafo não gerador Subgrafo gerador Para todo grafo G = (V , E) temos:
X
d(v ) = 2|E|.
v ∈V

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Caminhos em Grafos Caminhos Simples e Ciclos

Um caminho P de v0 a vn no grafo G é uma seqüência Um caminho simples é um caminho em que não há
finita e não vazia (v0 , e1 , v1 , . . . , en , vn ) cujos elementos repetição de vértices e nem de arestas na sequência.
são alternadamente vértices e arestas e tal que, para todo Um ciclo ou caminho fechado é uma caminho em que
1 ≤ i ≤ n, vi−1 e vi são os extremos de ei . v0 = vn .
O comprimento do caminho P é dado pelo seu número de Exemplo:
arestas, ou seja, n.
Exemplo: v0
f v0=v4 f
a a
v0 e4
a f v3 v3
e4
e1 c e c e
v3 e1
c e3 v4 e3
e1 e
e4 e3 v6 b d b d
e6 v1 e2 v2 v1 e2 v2
b d
v1=v4 e2=e5 v2=v5
Caminho Simples Ciclo

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Grafo Conexo Árvore

Dizemos que um grafo é conexo se, para qualquer par de Um grafo G é uma árvore se é conexo e não possui ciclos
vértices u e v de G, existe um caminho de u a v em G. (acı́clico). As seguintes afirmações são equivalentes:
Quando o grafo G não é conexo, podemos particionar em G é uma árvore.
componentes conexos. Dois vértices u e v de G estão no G é conexo e possui exatamente |V | − 1 arestas.
mesmo componente conexo de G se há caminho de u a v G é conexo e a remoção de qualquer aresta desconecta o
em G. grafo (minimal conexo).
Para todo par de vértices u, v de G, existe um único
Exemplo: caminho de u a v em G.
Exemplo:
a f f f
a a
c e c e
c e

b d b d
b d
Conexo Não-conexo com
3 componentes conexos

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Alguns exemplos de grafos Grafo Orientado

As definições que vimos até agora são para grafos não


orientados.
Floresta: grafo acı́clico (não precisa ser conexo). Cada Um grafo orientado é definido de forma semelhante, com a
componente é uma árvore! diferença que as arestas (às vezes chamadas de arcos)
Grafo completo: para todo par de vértices u, v a aresta consistem de pares ordenados de vértices.
(u, v ) pertence ao grafo. Exemplo:
Grafo bipartido: possui uma bipartição (A, B) do conjunto
a c
de vértices tal que toda aresta tem um extremo em A e
outro em B. e
Grafo planar: pode ser desenhado no plano de modo que
arestas se interceptam apenas nos extremos. b d

Às vezes, para enfatizar, dizemos grafo não-orientado em


vez de simplesmente grafo.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Grafo orientado Grafo Ponderado

Se e = (u, v ) é uma aresta de um grafo orientado G, então


dizemos que e sai de u e entra em v . Um grafo (orientado ou não) é ponderado se a cada aresta
e do grafo está associado um valor real c(e), o qual
O grau de saı́da d + (v ) de um vértice v é o número de
denominamos custo (ou peso) da aresta.
arestas que saem de v . O grau de entrada d − (v ) de v é o
número de arestas que entram em v . Exemplo:
Teorema. Para todo grafo orientado G = (V , E) temos:
10
X
d + (v ) =
X
d − (v ) = |E|. a f
5 9
v ∈V v ∈V
c 7
Em geral considera-se que em caminhos e ciclos em 1 e
6
grafos orientados todas as arestas “vão na mesma 15 3
direção”.
b d
Há um conceito de conexidade para grafos orientados que 13
veremos mais tarde.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Algoritmos em Grafos - Motivação Aplicações

Caminho mı́nimo: dado um conjunto de cidades, as


distâncias entre elas e duas cidades A e B, determinar um
Grafos são estruturas abstratas que podem modelar caminho (trajeto) mais curto de A até B.
diversos problemas do mundo real. Árvore Geradora de Peso Mı́nimo: dado um conjunto de
Por exemplo, um grafo pode representar conexões entre computadores, onde cada par de computadores pode ser
cidades por estradas ou uma rede de computadores. ligado usando uma quantidade de fibra ótica, encontrar
O interesse em estudar algoritmos para problemas em uma rede interconectando-os que use a menor quantidade
grafos é que conhecer um algoritmo para um determinado de fibra ótica possı́vel.
problema em grafos pode significar conhecer algoritmos Emparelhamento máximo: dado um conjunto de pessoas
para diversos problemas reais. e um conjunto de vagas para diferentes empregos, onde
cada pessoa é qualificada para certos empregos e cada
vaga pode ser ocupada por uma pessoa, encontrar um
modo de empregar o maior número possı́vel de pessoas.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Aplicações Representação Interna de Grafos

Problema do Caixeiro Viajante: dado um conjunto de A complexidade dos algoritmos para solução de
cidades, encontrar um passeio que sai de uma cidade, problemas modelados por grafos depende fortemente da
passa por todas as cidades e volta para a cidade inicial tal sua representação interna.
que a distância total a ser percorrida seja menor possı́vel. Existem duas representações canônicas: matriz de
Problema Chinês do Correio: dado o conjunto das ruas adjacência e listas de adjacência.
de um bairro, encontrar um passeio que passa por todas O uso de uma ou outra num determinado algoritmo
as ruas voltando ao ponto inicial tal que a distância total a depende da natureza das operações que ditam a
ser percorrida seja menor possı́vel. complexidade do algoritmo.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Matriz de adjacência Matriz de adjacência

Exemplo de um grafo e a matriz de adjacência


Seja G = (V , E) um grafo simples (orientado ou não). correspondente.
A matriz de adjacência de G é uma matriz quadrada A de a b c d e
ordem |V |, cujas linhas e colunas são indexadas pelos a c a 0 1 1 0 0
vértices em V , e tal que:
b 1 0 1 1 0
 e c 1 1 0 1 1
1 se (i, j) ∈ E,
A[i, j] = d 0 1 1 0 1
0 caso contrário.
b d e 0 0 1 1 0
Note que se G é não-orientado, então a matriz A
correspondente é simétrica.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Matriz de adjacência Listas de adjacência

Exemplo de um grafo orientado e a matriz de adjacência


correspondente.
Seja G = (V , E) um grafo simples (orientado ou não).
a b c d e A representação de G por uma lista de adjacências
a c a 0 0 0 0 0 consiste no seguinte.
b 1 0 1 0 0
e c 1 1 0 0 0 Para cada vértice v , temos uma lista ligada Adj[v ] dos
d 0 1 1 0 0 vértices adjacentes a v , ou seja, w aparece em Adj[v ] se
e 0 0 1 1 0 (v , w) é uma aresta de G. Os vértices podem estar em
b d
qualquer ordem em uma lista.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Listas de adjacência Lista de adjacências

Exemplo de um grafo não-orientado e a listas de Exemplo de um grafo orientado e a lista de adjacências


adjacência correspondente. correspondente.

a c
a
a c
b a c
a b c
e b a c d e c a b
c a b d e d b c
d b c e
b d e c d
b d e c d

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Matriz × Lista de adjacência Extensões

Matriz de adjacência: é fácil verificar se (i, j) é uma aresta


de G.
Há outras alternativas para representar grafos, mas
Lista de adjacência: é fácil descobrir os vértices matrizes e listas de adjacência são as mais usadas.
adjacentes a um dado vértice v (ou seja, listar Adj[v ]). Elas podem ser adaptadas para representar grafos
ponderados, grafos com laços e arestas múltiplas, grafos
Matriz de adjacência: espaço Θ(|V |2 ). com pesos nos vértices etc.
Geralmente mais adequada a grafos densos
Para determinados problemas é essencial ter estruturas
(|E| = Θ(|V |2 )).
de dados adicionais para melhorar a eficiência dos
Lista de adjacência: espaço Θ(|V | + |E|). algoritmos.
Geralmente mais adequada a grafos esparsos
(|E| = Θ(|V |)).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Busca em grafos

Grafos são estruturas mais complicadas do que listas,


vetores e árvores (binárias).
Precisamos de métodos para explorar/percorrer um grafo
(orientado ou não-orientado).
Buscas em grafos Métodos de buscas em grafos:
Busca em largura (BFS - Breadth-First Search)
Busca em profundidade (DFS - Depth-First Search)
Pode-se obter várias informações sobre a estrutura do
grafo que podem ser úteis para projetar algoritmos
eficientes para determinados problemas.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Notação Busca em largura

Para um grafo G (orientado ou não) denotamos por V [G] Dizemos que um vértice v é alcançável a partir de um
seu conjunto de vértices e por E[G] seu conjunto de vértice s em um grafo G se existe um caminho de s a v em
arestas. G.
Definição: a distância de s a v é o comprimento de um
Para denotar complexidades nas expressões com O ou Θ caminho mais curto de s a v .
usaremos V e E em vez de |V [G]| ou |E[G]|. Por exemplo,
Se v não é alcançável a partir de s, então dizemos que a
Θ(V + E) ou O(V 2 ).
distância de s a v é ∞ (infinita).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Busca em largura Busca em largura

Busca em largura recebe um grafo G = (V , E) e um Inicialmente a Árvore de Busca em Largura contém


vértice especificado s chamado fonte (source). apenas o vértice fonte s.
Percorre todos os vértices alcançáveis a partir de s em Para cada vizinho v de s, o vértice v e a aresta (s, v ) são
ordem de distância deste. Vértices a mesma distância acrescentadas à árvore.
podem ser percorridos em qualquer ordem. O processo é repetido para os vizinhos dos vizinhos de s e
Constrói uma Árvore de Busca em Largura com raiz s. assim por diante, até que todos os vértices atingı́veis por s
Cada caminho de s a um vértice v nesta árvore sejam inseridos na árvore.
corresponde a um caminho mais curto de s a v . Este processo é implementado através de uma fila Q.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Busca em largura Exemplo (CLRS)

r s t u
Busca em largura atribui cores a cada vértice: branco,
∞ 0 ∞ ∞
cinza e preto.
Cor branca = “não visitado”. Q s
Inicialmente todos os vértices são brancos.
0
Cor cinza = “visitado pela primeira vez”. ∞ ∞ ∞ ∞
Cor Preta = “teve seus vizinhos visitados”. v w x y

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo (CLRS) Exemplo (CLRS)

r s t u r s t u
1 0 ∞ ∞ 1 0 2 ∞

Q w r Q r t x
1 1 1 2 2
∞ 1 ∞ ∞ ∞ 1 2 ∞
v w x y v w x y

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo (CLRS) Exemplo (CLRS)

r s t u r s t u
1 0 2 ∞ 1 0 2 3

Q t x v Q x v u
2 2 2 2 2 3
2 1 2 ∞ 2 1 2 ∞
v w x y v w x y

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo (CLRS) Exemplo (CLRS)

r s t u r s t u
1 0 2 3 1 0 2 3

Q v u y Q u y
2 3 3 3 3
2 1 2 3 2 1 2 3
v w x y v w x y

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo (CLRS) Exemplo (CLRS)

r s t u r s t u
1 0 2 3 1 0 2 3

Q y Q ∅
3
2 1 2 3 2 1 2 3
v w x y v w x y

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Cores Representação da árvore e das distâncias

A raiz da Árvore de Busca em Largura é s.


Para cada vértice v guarda-se sua cor atual cor[v ] que Cada vértice v (diferente de s) possui um pai π[v ].
pode ser branco, cinza ou preto. O caminho de v a s na Árvore é dado por:
Para efeito de implementação, isto não é realmente v , π[v ], π[π[v ]], π[π[π[v ]]], . . . , s.
necessário, mas facilita o entendimento do algoritmo.
Uma variável d[v ] é usada para armazenar a distância de
s a v (que será determinada durante a busca).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Busca em largura Busca em largura

Recebe um grafo G (na forma de listas de adjacências) e um


vértice s ∈ V [G] e devolve 8 Q←∅
(i) para cada vértice v , a distância de s a v em G e 9 E NQUEUE(Q, s)
(ii) uma Árvore de Busca em Largura. 10 enquanto Q 6= ∅ faça
11 u ← D EQUEUE(Q)
B USCA -E M -L ARGURA(G, s) 12 para cada v ∈ Adj[u] faça
0 ⊲ Inicialização 13 se cor [v ] = branco então
1 para cada u ∈ V [G] − {s} faça 14 cor[v ] ← cinza
2 cor[u] ← branco 15 d[v ] ← d[u] + 1
3 d[u] ← ∞ 16 π[v ] ← u
4 π[u] ← NIL 17 E NQUEUE(Q, v )
5 cor[s] ← cinza 18 cor[u] ← preto
6 d[s] ← 0 19 retorne d, π
7 π[s] ← NIL

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Consumo de tempo Complexidade de tempo

Método de análise agregado.


A inicialização consome tempo Θ(V ). Conclusão:
Depois que um vértice deixa de ser branco, ele não volta a
A complexidade de tempo de B USCA -E M -L ARGURA é
ser branco novamente. Assim, cada vértice é inserido na
O(V + E).
fila Q no máximo uma vez. Cada operação sobre a fila
consome tempo Θ(1) resultando em um total de O(V ).
Em uma lista de adjacência, cada vértice é percorrido
apenas uma vez. A soma dos comprimentos das listas é Agora falta mostrar que B USCA -E M -L ARGURA funciona.
Θ(E). Assim, o tempo gasto para percorrer as listas é
O(E).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Corretude Alguns lemas

Lema 1. Seja G um grafo e s ∈ V [G].


Para u, v ∈ E[G], seja dist(u, v ) a distância de u a v .
Então para toda aresta (u, v ) temos que
Precisamos mostrar que:
d[v ] = dist(s, v ) para todo v ∈ V [G]. dist(s, v ) ≤ dist(s, u) + 1.
A função predecessor π[ ] define uma Árvore de Busca em
Largura com raiz s. Prova:
Imediato.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Alguns lemas Prova do Lema 2

Indução no número de operações E NQUEUE.


Base: quando s é inserido na fila temos d[s] = 0 = dist(s, s) e
d[v ] é uma estimativa superior de dist(s, v ). d[v ] = ∞ ≥ dist(s, v ) para v ∈ V − {s}.
Passo de indução: v é descoberto enquanto a busca é feita em
Lema 2. Durante a execução do algoritmo vale o seguinte u (percorrendo Adj[u]). Então
invariante
d[v ] = d[u] + 1
d[v ] ≥ dist(s, v ) para todo v ∈ V [G]. ≥ dist(s, u) + 1 (HI)
≥ dist(s, v ). (Lema 1)

Note que d[v ] nunca muda após v ser inserido na fila. Logo, o
invariante vale.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Alguns lemas Prova do Lema 3


Indução no número de operações E NQUEUE e D EQUEUE.
Base: Q = {s}. O lema vale trivialmente.
Lema 3. Suponha que hv1 , v2 , . . . , vr i seja a disposição da fila
Q na linha 10 em uma iteração qualquer. Passo de indução: v1 é removido de Q. Agora v2 é o primeiro
vértice de Q. Então
Então
d[vr ] ≤ d[v1 ] + 1 d[vr ] ≤ d[v1 ] + 1 ≤ d[v2 ] + 1.
e As outras desigualdades se mantêm.
d[vi ] ≤ d[vi+1 ] para i = 1, 2, . . . , r − 1. Passo de indução: v = vr +1 é inserido em Q. Suponha que a
busca é feita em u neste momento. Logo d[v1 ] ≥ d[u]. Então
Em outras palavras, os vértices são inseridos na fila em ordem
crescente e há no máximo dois valores de d[v ] para vértices d[vr +1 ] = d[v ] = d[u] + 1 ≤ d[v1 ] + 1.
na fila. Pela HI d[vr ] ≤ d[u] + 1. Logo
d[vr ] ≤ d[u] + 1 = d[v ] = d[vr +1 ].
As outras desigualdades se mantêm.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Corretude Corretude

Teorema. Seja G um grafo e s ∈ V [G].


Então após a execução de B USCA -E M -L ARGURA, Base: Se dist(s, v ) = 0 então v = s e d[s] = 0.

d[v ] = dist(s, v ) para todo v ∈ V [G]. Hipótese de indução: Suponha então que d[u] = dist(s, u)
para todo vértice u com dist(s, u) < k.
e
Seja v um vértice com dist(s, v ) = k. Considere um caminho
π[ ] define uma Árvore de Busca em Largura. mı́nimo de s a v em G e chame de u o vértice que antecede v
neste caminho. Note que dist(s, u) = k − 1.
Prova:
Considere o instante em que u foi removido da fila Q (linha 11
Note que se dist(s, v ) = ∞ então d[v ] = ∞ pelo Lema 3. de B USCA -E M -L ARGURA). Neste instante, v é branco, cinza ou
Então vamos considerar o caso em que dist(s, v ) < ∞. preto.
Vamos provar por indução em dist(s, v ) que d[v ] = dist(s, v ).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Corretude Caminho mais curto

se v é branco, então a linha 15 faz com


d[v ] = d[u] + 1 = (k − 1) + 1 = k. Imprime um caminho mais curto de s a v .

se v é cinza, então v foi visitado antes por algum vértice w Print-Path(G, s, v )


(logo, v ∈ Adj[w]) e d[v ] = d[w] + 1. Pelo Lema 3, 1 se v = s então
d[w] ≤ d[u] = k − 1 e segue que d[v ] = k. 2 imprime s
3 senão
4 se π[v ] = NIL então
se v é preto, então v já passou pela fila Q e pelo Lema 3,
4 imprime “não existe caminho de s a v ”
d[v ] ≤ d[u] = k − 1. Mas por outro lado, pelo Lema 2,
5 senão
d[v ] ≥ dist(s, v ) = k, o que é uma contradição. Este caso
6 Print-Path(G, s, π[v ])
não ocorre.
7 imprime v
Portanto, em todos os casos temos que d[v ] = dist[s, v ].

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exercı́cio Busca em profundidade

Depth First Search = busca em profundidade

Exercı́cio. Mostre que um grafo G é bipartido se e somente se A estratégia consiste em pesquisar o grafo o mais
não contém um ciclo de comprimento ı́mpar. “profundamente” sempre que possı́vel.
Aplicável tanto a grafos orientados quanto não-orientados.
Projete um algoritmo linear que dado um grafo G devolve
Possui um número enorme de aplicações:
uma bipartição de G, ou
determinar os componentes de um grafo
um ciclo ı́mpar em G.
ordenação topológica
determinar componentes fortemente conexos
subrotina para outros algoritmos

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Busca em profundidade Busca em profundidade

Recebe um grafo G = (V , E) (representado por listas de Outra forma de entender Busca em Profundidade é imaginar
adjacências). A busca inicia-se em um vértice qualquer. que os vértices são armazenados em uma pilha à medida que
Busca em profundidade é um método recursivo. A idéia básica são visitados. Compare isto com Busca em Largura onde os
consiste no seguinte: vértices são colocados em uma fila.
Suponha que a busca atingiu um vértice u.
Suponha que a busca atingiu um vértice u.
Escolhe-se um vizinho não visitado v de u para prosseguir
Escolhe-se um vizinho não visitado v de u para prosseguir
a busca.
a busca.
“Recursivamente” a busca em profundidade prossegue a
Empilhe v e repete-se o passo anterior com v .
partir de v .
Se nenhum vértice não visitado foi encontrado, então
Quando esta busca termina, tenta-se prosseguir a busca a
desempilhe um vértice da pilha, digamos u, e volte ao
partir de outro vizinho de u. Se não for possı́vel, ela
primeiro passo.
retorna (backtracking) ao nı́vel anterior da recursão.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Floresta de Busca em Profundidade Cores dos vértices

A busca em profundidade associa a cada vértice x um A medida que o grafo é percorrido, os vértices visitados vão
predecessor π[x]. sendo coloridos.
O subgrafo induzido pelas arestas Cada vértice tem uma das seguintes cores:
{(π[x], x) : x ∈ V [G] e π[x] 6= NIL} Cor branca = “vértice ainda não visitado”’.
é a Floresta de Busca em Profundidade. Cor cinza = “vértice visitado mas ainda não finalizado”.
Cada componente desta floresta é uma Árvore de Busca Cor preta = “vértice visitado e finalizado”.
em Profundidade.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Estampas/rótulos Exemplo

y z s t
A busca em profundidade associa a cada vértice x dois rótulos: 1/
d[x]: instante de descoberta de x.
Neste instante x torna-se cinza.
f [x]: instante de finalização de x.
Neste instante x torna-se preto.

Os rótulos são inteiros entre 1 e 2|V |.

x w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
2/ 1/ 3/ 2/ 1/

x w v u x w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

y z s t y z s t
3/ 2/ 1/ 3/ 2/ 1/

4/ 4/
x w v u x w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
3/ 2/ 1/ 3/6 2/ 1/

B B

4/5 4/5
x w v u x w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

y z s t y z s t
3/6 2/ 1/ 3/6 2/ 1/

B B

4/5 7/ 4/5 7/
x w v u x C w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
3/6 2/ 1/ 3/6 2/9 1/

B B

4/5 7/8 4/5 7/8


x C w v u x C w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/ 3/6 2/9 1/10

B F B F

4/5 7/8 4/5 7/8


x C w v u x C w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/10 11/ 3/6 2/9 1/10 11/

B F B F

4/5 7/8 4/5 7/8 12/


x C w v u x C w v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/10 11/ 3/6 2/9 1/10 11/

B F B F C

4/5 7/8 12/ 4/5 7/8 12/


x C w C v u x C w C v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/10 11/ 3/6 2/9 1/10 11/

B F C B F C

4/5 7/8 12/13 4/5 7/8 12/13 14/


x C w C v u x C w C v u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/10 11/ 3/6 2/9 1/10 11/

B F C B F C B

4/5 7/8 12/13 14/ 4/5 7/8 12/13 14/


x C w C v C u x C w C v C u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

y z s t y z s t
3/6 2/9 1/10 11/ 3/6 2/9 1/10 11/16

B F C B B F C B

4/5 7/8 12/13 14/15 4/5 7/8 12/13 14/15


x C w C v C u x C w C v C u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Rótulos versus cores Algoritmo DFS

Recebe um grafo G (na forma de listas de adjacências) e


devolve
(i) os instantes d[v ], f [v ] para cada v ∈ V e
Para todo x ∈ V [G] vale que d[x] < f [x].
(ii) uma Floresta de Busca em Profundidade.
Além disso
DFS(G)
x é branco antes do instante d[x]. 1 para cada u ∈ V [G] faça
x é cinza entre os instantes d[x] e f [x]. 2 cor[u] ← branco
x é preto após o instante f [x]. 3 π[u] ← NIL
4 tempo ← 0
5 para cada u ∈ V [G] faça
6 se cor[u] = branco
7 então DFS- VISIT(u)

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Algoritmo DFS- VISIT Algoritmo DFS

Constrói recursivamente uma Árvore de Busca em


DFS(G)
Profundidade com raiz u.
1 para cada u ∈ V [G] faça
DFS- VISIT(u) 2 cor[u] ← branco
1 cor[u] ← cinza 3 π[u] ← NIL
2 tempo ← tempo + 1 4 tempo ← 0
3 d[u] ← tempo 5 para cada u ∈ V [G] faça
4 para cada v ∈ Adj[u] faça 6 se cor[u] = branco
5 se cor[v ] = branco 7 então DFS- VISIT(u)
6 então π[v ] ← u
7 DFS- VISIT(v ) Consumo de tempo
8 cor[u] ← preto O(V ) + V chamadas a DFS- VISIT().
9 f [u] ← tempo ← tempo + 1

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Algoritmo DFS- VISIT Complexidade de DFS

DFS- VISIT(u)
1 cor[u] ← cinza
2 tempo ← tempo + 1 DFS- VISIT(v ) é executado exatamente uma vez para cada
3 d[u] ← tempo v ∈ V.
4 para cada v ∈ Adj[u] faça Em uma execução de DFS- VISIT(v ), o laço das linhas 4-7
5 se cor[v ] = branco é executado |Adj[u]| vezes.
6 então π[v ] ← u Assim, o custo total de todas as chamadas é
7 DFS- VISIT(v ) P
v ∈V |Adj(v )| = Θ(E).
8 cor[u] ← preto
9 f [u] ← tempo ← tempo + 1
Conclusão: A complexidade de tempo de DFS é O(V + E).
Consumo de tempo
linhas 4-7: executado |Adj[u]| vezes.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Estrutura de parênteses Estrutura de parênteses

y z s t
3/6 2/9 1/10 11/16
Os rótulos d[x], f [x] têm propriedades muito úteis para
serem usadas em outros algoritmos.
Eles refletem a ordem em que a busca em profundidade B F C B
foi executada.
Eles fornecem informação de como é a “cara” (estrutura)
do grafo.
4/5 7/8 12/13 14/15
x C w C v C u

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Estrutura de parênteses Estrutura de parênteses

s t
Teorema (Teorema dos Parênteses)
Em uma busca em profundidade sobre um grafo G = (V , E),
z v u para quaisquer vértices u e v , ocorre exatamente uma das
situações abaixo:

y w [d[u], f [u]] e [d[v ], f [v ]] são disjuntos.

[d[u], f [u]] está contido em [d[v ], f [v ]] e


u é descendente de v na Árvore de BP.
x
[d[v ], f [v ]] está contido em [d[u], f [u]] e
v é descendente de u na Árvore de BP.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
(s (z (y (x x) y) (w w) z) s) (t (v v) (u u) t)

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Estrutura de parênteses Teorema do Caminho Branco

Teorema. (Teorema do Caminho Branco)


Em uma Floresta de BP, um vértice v é descendente de u se e
somente se no instante d[u] (quando u foi descoberto), existia
Corolário. (Intervalos encaixantes para descendentes) um caminho de u a v formado apenas por vértices brancos.
Um vértice v é um descendente próprio de u na Floresta de BP
se e somente se d[u] < d[v ] < f [v ] < f [u].

Equivalentemente, v é um descendente próprio de u se e


somente se [d[v ], f [v ]] está contido em [d[u], f [u]].

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Classificação de arestas Classificação de arestas

Busca em profundidade pode ser usada para classificar y z s t


arestas de um grafo G = (V , E). 3/6 2/9 1/10 11/16
Ela classifica as arestas em quatro tipos:
Arestas da árvore: arestas que pertencem à Floresta de B F C B
BP.
Arestas de retorno (back edges): arestas (u, v ) ligando um
vértice u a um ancestral v na Árvore de BP.
Arestas de avanço (forward edges): arestas (u, v ) ligando 4/5 7/8 12/13 14/15
um vértice u a um descendente próprio v na Árvore de BP. x C w C v C u
Arestas de cruzamento (cross edges): todas as outras
arestas. É fácil modificar o algoritmo DFS(G) para que ele também
classifique as arestas de G. (Exercı́cio)

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Classificação de arestas Grafos não-orientados

s t

C B Em grafos não-orientados (u, v ) e (v , u) indicam a mesma


aresta. A sua classificação depende de quem foi visitado
primeiro: u ou v .
z F v u
C Para grafos não-orientados, existem apenas dois tipos de
arestas.
B C
Teorema.
y w Em uma busca em profundidade sobre um grafo não-orientado
G, cada aresta de G ou é aresta da árvore ou é aresta de
retorno.
C

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

x s t x s t
1/ 1/

2/
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

x s t x s t
B
3/ 1/ 3/ 1/

2/ 2/
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

x s t x s t
B B
3/4 1/ 3/4 1/

2/ 2/ 5/
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

x s t x s t
B B
3/4 1/ 3/4 1/ 7/

2/ 5/ 6/ 2/ 5/ 6/
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

x s t x s t
B B
3/4 1/ 7/ 3/4 1/ 7/8

B B

2/ 5/ 6/ 2/ 5/ 6/
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Exemplo

x s t x s t
B B
3/4 1/ 7/8 3/4 1/ 7/8

B B
B

2/ 5/ 6/9 2/ 5/ 6/9
y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo Exemplo

x s t x s t
B B
3/4 1/ 7/8 3/4 1/ 7/8

B B
B B

2/ 5/10 6/9 2/11 5/10 6/9


y z w y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo Ordenação Topológica

x s t
B Uma ordenação topológica de um grafo orientado G = (V , E) é
3/4 1/12 7/8 um arranjo linear dos vértices de G
v1 v2 v3 . . . vn−2 vn−1 vn
tal que se (vi , vj ) é uma aresta de G, então i < j.

B
B
v1 v2 v3
v4 v5 v6

2/11 5/10 6/9


y z w

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Ordenação Topológica Ordenação Topológica

Ordenação topológica é usada em aplicações onde eventos ou


tarefas têm precedência sobre outras.

11/16 cueca meias 17/18


relógio 9/10

12/15 calça sapatos 13/14

meias cueca calça sapatos relógio camisa cinto gravata paletó


camisa 1/8
17/18 11/16 12/15 13/14 9/10 1/8 6/7 2/5 3/4
6/7 cinto
gravata 2/5

paletó 3/4

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Ordenação Topológica Grafo Orientado Acı́clico

Nem todo grafo orientado possui uma ordenação


topológica. Teorema. Um grafo orientado G é acı́clico se e somente se
Por exemplo, um ciclo orientado não possui uma possui uma ordenação topológica.
ordenação topológica. Prova.
v1
Obviamente, se G possui uma ordenação topológica então G é
v2 acı́clico.
vk
Vamos mostrar a recı́proca.
v3
Definição
Uma fonte é um vértice com grau de entrada igual a zero.
v5 v4 Um sorvedouro é um vértice com grau de saı́da igual a zero.
Um grafo orientado G = (V , E) é acı́clico se não contém
um ciclo orientado.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Grafo Orientado Acı́clico Ordenação Topológica

Lema. Todo grafo orientado acı́clico possui uma fonte e um


sorvedouro.
Recebe um grafo orientado acı́clico G e
devolve uma ordenação topológica de G.
Baseado no resultado acima pode-se projetar um algoritmo
para obter uma ordenação topológica de um grafo orientado TOPOLOGICAL -S ORT(G)
acı́clico G. 1 Execute DFS(G) para calcular f [v ] para cada vértice v
2 À medida que cada vértice for finalizado, coloque-o no
Encontre uma fonte v1 de G. inı́cio de uma lista ligada
Recursivamente encontre uma ordenação topológica 3 Devolva a lista ligada resultante
v2 , . . . , vn de G − v1 .
Outro modo de ver a linha 2 é:
Devolva v1 , v2 , . . . , vn .
Imprima os vértices em ordem decrescente de f [v ].
Complexidade: O(V 2 ) (Exercı́cio)
Pode-se fazer melhor...

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Complexidade de tempo Corretude

Lema.
Conclusão Um grafo orientado G é acı́clico se e somente se em uma
busca em profundidade de G não aparecem arestas de retorno.
A complexidade de tempo de TOPOLOGICAL -S ORT é O(V + E). Prova:
Suponha que (u, v ) é uma aresta de retorno.

Agora falta mostrar que TOPOLOGICAL -S ORT funciona. Então v é um ancestral de u na Floresta de BP.
Portanto, existe um caminho de v a u que juntamente com
(u, v ) forma um ciclo orientado. Logo, G não é acı́clico.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Corretude Corretude

Agora suponha que G contém um ciclo orientado C.

v1
Lembre que TOPOLOGICAL -S ORT imprime os vértices em
v2 ordem decrescente de f [ ].
vk
Para mostrar que o algoritmo funciona, basta então mostrar
C v3 que se (u, v ) é uma aresta de G, então f [u] > f [v ].

Considere o instante em que (u, v ) é examinada.


v5 v4
Neste instante, v não pode ser cinza pois senão (u, v ) seria
Suponha que v1 é o primeiro vértice de C a ser descoberto. uma aresta de retorno.
Então no instante d[v1 ] existe um caminho branco de v1 a vk .
Pelo Teorema do Caminho Branco, vk torna-se um Logo, v é branco ou preto.
descendente de v1 e portanto, (vk , v1 ) torna-se uma aresta de
retorno.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Corretude

Se v é branco, então v é descendente de u e portanto


f [v ] < f [u].
Se v é preto, então v já foi finalizado e f [v ] foi definido. Componentes fortemente conexos
Por outro lado u ainda não foi finalizado. Logo, f [v ] < f [u].

Portanto, TOPOLOGICAL -S ORT funciona corretamente.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Componentes fortemente conexos (CFC) Componentes fortemente conexos

Uma aplicação clássica de busca em profundidade:


decompor um grafo orientado em seus componentes Um componente fortemente conexo de um grafo orientado
fortemente conexos. G = (V , E) é um subconjunto de vértices C ⊆ V tal que:
Muitos algoritmos em grafos começam com tal 1 Para todo par de vértices u e v em C, existe um caminho
decomposição. (orientado) de u a v e vice-versa.
O algoritmo opera separadamente em cada componente 2 C é maximal com respeito à propriedade (1).
fortemente conexo.
As soluções são combinadas de alguma forma.

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Componentes fortemente conexos Grafo transposto

Seja G = (V , E) um grafo orientado.


a b c d
O grafo transposto de G é o grafo GT = (V T , E T ) tal que
VT = V e
E T = {(u, v ) : (v , u) ∈ E}.

Ou seja, GT é obtido a partir de G invertendo as orientações


das arestas.
e f g h
Dada uma representação de listas de adjacências de G é
possı́vel obter a representação de listas de adjacências de GT
Um grafo orientado e seus componentes fortemente conexos. em tempo Θ(V + E).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Grafo transposto Algoritmo

a b c d

C OMPONENTES -F ORTEMENTE -C ONEXOS(G)


1 Execute DFS(G) para obter f [v ] para v ∈ V .
e f g h 2 Execute DFS(GT ) considerando os vértices em ordem
decrescente de f [v ].
a b c d 3 Devolva os conjuntos de vértices de cada árvore da
Floresta de Busca em Profundidade obtida.

Veremos que os conjuntos devolvidos são exatemente os


e f g h componentes fortemente conexos de G.

Um grafo orientado e o grafo transposto. Note que eles têm os


mesmos componentes fortemente conexos.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Exemplo CLRS Exemplo CLRS

a b c d
a b c d
13/14 11/16 1/10 8/9

12/15 3/4 2/7 5/6


e f g h
e f g h

1 Execute DFS(G) para obter f [v ] para v ∈ V .

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Exemplo CLRS Grafo Componente

a b c d
A idéia por trás de C OMPONENTES -F ORTEMENTE -C ONEXOS
segue de uma propriedade do grafo componente GCFC obtido a
partir de G contraindo-se seus componentes fortemente
conexos.

a b c d

e f g h

2 Execute DFS(GT ) considerando os vértices em ordem e f g h


decrescente de f [v ].
3 Os componentes fortemente conexos correspondem aos
vértices de cada árvore da Floresta de Busca em
Profundidade.
Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1
Grafo Componente Corretude

A idéia por trás de C OMPONENTES -F ORTEMENTE -C ONEXOS


segue de uma propriedade do grafo componente GCFC obtido a
replacements
partir de G contraindo-se seus componentes fortemente Lema 22.13 (CLRS)
conexos.
Sejam C e C ′ dois componentes f.c. de G.
Sejam u, v ∈ C e u ′ , v ′ ∈ C ′ .
cd
Suponha que existe um caminho u u ′ em G.
Então não existe um caminho v ′ v em G.
abc

O lema acima mostra que GCFC é acı́clico.


fg h
Agora vamos mostrar porque
GCFC é acı́clico. C OMPONENTES -F ORTEMENTE -C ONEXOS funciona.

Os componentes fortementes conexos são visitados em ordem


topológica com relação a GCFC !

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Corretude Corretude

Daqui pra frente d, f referem-se à busca em profundidade em


G feita no passo 1 do algoritmo.
Corolário 22.15 (CLRS):
Definição: Sejam C e C ′ dois componentes f.c. de G.
Para todo subconjunto U de vértices denote Suponha que existe (u, v ) está em E T onde u ∈ C e v ∈ C ′ .
Então f (C) < f (C ′ ).
d(U) := min{d[u]} e f (U) := max{f [u]}.
u∈U u∈U
Teorema 22.16 (CLRS):
O algoritmo C OMPONENTES -F ORTEMENTE -C ONEXOS
Lema 22.14 (CLRS): determina corretamente os componentes fortemente conexos
Sejam C e C ′ dois componentes f.c. de G. de G.
Suponha que existe (u, v ) em E onde u ∈ C e v ∈ C ′ .
Então f (C) > f (C ′ ).

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1 Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Você também pode gostar