Você está na página 1de 9

Buscas em Grafos

Grafos - Busca em Profundidade (DFS)


Buscas em Grafos
Notas de aula da disciplina IME 04-10829 Idéia: Visitar, a cada passo, algum vizinho não
(Algoritmos em Grafos) visitado, do vértice mais recentemente visitado

Paulo Eustáquio Duarte Pinto 2 4


(pauloedp at ime.uerj.br)
1 6

3 5

outubro/2009
1 2

Buscas em Grafos Buscas em Grafos

Grafos - Busca em Profundidade (DFS) Grafos - Busca em Profundidade


2 4
Árvores(Floresta) de
Idéia: Visitar, a cada passo, algum vizinho não visitado, do Profundidade:
vértice mais recentemente visitado 1 6
Mostram a sequência das
visitas. Pode haver mais de
uma árvore de profundidade. 3 5
Desmarcar vértices;
Para i de 1 a n: Árvores de Profundidade:
Se ( i não marcado) Então BP(i,i);
2 Aresta de retorno 2
Fp;
1
BP(u,v); 5
Marcar v;
3
Para vizinhos w de v:
Se (w não marcado) Então 5 6 4 3
BP(v,w);
Fp; 4 6 Aresta de árvore 1
3 4
Fim;

Buscas em Grafos Buscas em Grafos

Grafos – Busca em Profundidade Grafos - Busca em Profundidade (DFS)

Exercício: Mostrar uma árvore de profundidade Propriedade I da BP:


Todos os vértices e todas as arestas são visitados na busca.
iniciando no vértice de letra mais próxima de um dos
nomes do grupo.
Propriedade II da BP:
A complexidade da busca é O(n2) se for usada a
B K M X representação por matriz de adjacências.

Propriedade III da BP:


Z L A complexidade da busca é O(n+m) se for usada a
representação por listas de adjacências.
J F R W
Propriedade IV da BP:
Dado qualquer caminho em C em G, existe um vértice v desse
caminho tal que todos os demais vértices estão em nós
5 6
descendentes de v, na árvore de profundidade de G.

1
Buscas em Grafos Buscas em Grafos

Grafos - Busca em Profundidade Grafos - Busca em Profundidade


2 4
2 4 Possibilidades da DFS:
Possibilidades da DFS: Determinação se o grafo é conexo
Pequenas modificações no
1 6
algoritmo permitem descobrir 6
1
propriedades do grafo
3 5
3 5
Desmarcar vértices; c ← 0;
- Visita a todas as arestas Para i de 1 a n:
- Obtenção dos graus dos vértices Se ( i não marcado) Então
- Determinação se o grafo é conexo c ← c+1;
- Determinação dos componentes conexos BP(i,i);
- Determinação de existência de ciclos Fp;
- Descoberta de elementos estruturais (pontes, blocos etc)
- Descoberta se o grafo é bipartido, ciclo, árvore, Se (c > 1) Então Imprimir (‘Desconexo’)
completo, regular Senão Imprimir (‘Conexo’);
7 8

Buscas em Grafos Buscas em Grafos

Grafos - Busca em Profundidade Grafos - Busca em Profundidade


2 4 2 4
Possibilidades da DFS: Possibilidades da DFS:
Determinação dos componentes conexos Determinação de existência de ciclos

1 6 1 6

3 5 3 5
Co[*] ← 0; c ← 0; Co[*] ← 0; c ← 0;
Para i de 1 a n: temciclo ← F;
BP(u,v);
Se ( Co[i] = 0) Então Para i de 1 a n: BP(u, v);
Co[v] ← c;
c ← c+1; Se ( Co[i] = 0) Então Co[v] ← c;
Para vizinhos w de v:
BP(i,i); c ← c+1; Para vizinhos w de v:
Se (Co[w] = 0) Então
Fp; BP(i, i); Se (Co[w] = 0) Então
BP(v,w);
Para i de 1 a c: Fp; BP(v, w)
Fp;
Imprimir (‘Componente ‘,i); Senão Se (w ≠ u) Então
Fim;
Para j de 1 a n Se (temciclo) Então temciclo ← V;
Se (Co[j] = i) Então Imprimir (‘Cíclico’) Fp;
Imprimir j; Senão Imprimir (‘Acíclico’); Fim;
Fp; 9 10
Fp;

Buscas em Grafos Buscas em Grafos

Grafos - Busca em Profundidade Grafos - Busca em Profundidade

Problema ORIENTAÇÃO ACÍCLICA: Problema ORIENTAÇÃO PARA DAG:


Dado um grafo simples, orientar cada aresta do Dado um grafo simples, orientar cada aresta do
grafo(transformá-lo em um digrafo), tal que não hajam ciclos no grafo(transformá-lo em um digrafo), tal que não hajam ciclos no
digrafo criado. digrafo criado.

OK NOK

2 4 2 4 2 4

1 6 1 6 1 6

3 5 11 3 5 3 5 12

2
Buscas em Grafos Buscas em Grafos

Grafos - Busca em Profundidade Grafos – Pontes 2 4 6


Solução ORIENTAÇÃO PARA 2 4
Ponte:
DAG Aresta que, se removida,
Criar a árvore de desconecta o grafo: Ex (5,6) 1
profundidade. Arestas de 1 6
árvore tornam-se arestas
3 5 8 7
diretas num digrafo. Arestas
de retorno tornam-se arestas 3 5 1
inversas. Idéia de um algoritmo:
2
1 2 4 Dada uma árvore de
profundidade, a aresta 4
2 (v,w) será ponte quando
w é filho de v e não há 5
1 6
4 descendentes de w
3 6
(incluindo w) com
5 3 5 arestas de retorno para
ancestrais de w. 7
3 6 13 14
8

Buscas em Grafos Buscas em Grafos


2 4 6
Grafos – Pontes Grafos – Pontes 2 4 6

Ponte: Externamente:
1 Desmarcar vértices;
Aresta que, se removida, 1
desconecta o grafo: Ex (5,6) c ← 0;
3 5 8 Pontes (1, 1);
7
3 5 8 7
1
v Pre Low
Idéia de um algoritmo: Pontes (p, v);
2 1 1 1 Marcar v; c ← c+1; Pre[v] ← c; Low[v] ← c;
Funções p/ os vértices: 2 2 1 Para vizinhos w de v:
4 Se (w não marcado) Então
4 3 1
Pre(v) = ordem de Pontes(v, w);
5 5 4 1
entrada de v na BP. Se (Low[w] < Low[v]) Então
3 3 5 1 Low[v] ← Low[w];
6
Low(v) = menor ordem Se (Low[w] = Pre[w]) Então
6 6 6
de entrada de um Escrever( v , w, ‘ é Ponte’);
7 7 7 6
vértice alcançado Senão Se (w ≠ p) e (Pre[w] < Low[v]) Então
diretamente por v ou 8 8 6 Low[v] ← Pre[w];
8
por descendente de v 15 Fp; 16
na árvore de Profund. Conclusão: Aresta (5,6) é ponte Fim;

Buscas em Grafos Buscas em Grafos

Grafos – Pontes 2 4 6

Exemplo com a Busca Grafos – Determinação de Pontes


começando no vértice 1. 1
Exercício: Mostrar a árvore de profundidade do grafo
3 5 8 7
abaixo, determinando as pontes do mesmo, através dos
vetores Pre e Low.
v 1 2 3 4 5 6 7 8
P L P L P L P L P L P L P L P L
1 1 1 B K M X
2 1 1 2 2
4 1 1 2 2 3 3
5 1 1 2 2 3 3 4 4 Z
3 1 1 2 2 5 1 3 3 4 1
6 1 1 2 2 5 1 3 3 4 1 6 6 F W
7 1 1 2 2 5 1 3 3 4 1 6 6 7 7
8 1 1 2 1 5 1 3 1 4 1 6 6 7 6 8 6
17 18

3
Buscas em Grafos Buscas em Grafos

Grafos - Pontes Grafos - Pontes

Problema MÃO ÚNICA (I): Problema MÃO ÚNICA (II):


Dado o mapa de uma cidade, representado como um grafo Dado o mapa de uma cidade, representado como um hiper-grafo
simples, onde os vértices são as esquinas e as arestas são os (grafo com multiarestas e loops), onde os vértices são as
trechos de rua entre esquinas, dizer se é possível atribuir mão esquinas e as arestas são os trechos de rua entre esquinas,
única a todos os trechos de ruas, tal que toda esquina seja dizer se é possível atribuir mão única a todos os trechos de
atingível a partir de qualquer outra. ruas, tal que toda esquina seja atingível a partir de qualquer
outra.

Solução MÃO ÚNICA (I): Solução MÃO ÚNICA (II):


2 4 2 4
Basta verificar se existe ou Basta transformar o hiper-
não ponte no grafo dado. grafo em grafo simples e
1 6 1 6 verificar se existe ou não
ponte no grafo transformado e
se essa ponte é a única aresta
3 5 3 5
19
entre os dois vértices, no 20
hipergrafo.

Buscas em Grafos Buscas em Grafos

Grafos - Pontes Grafos - Pontes


Solução MÃO ÚNICA (III):

Problema MÃO ÚNICA (III): Quando não existir ponte, usar a árvore de profundidade,
Dado o mapa de uma cidade, representado como um grafo atribuindo o sentido de cima para baixo para arestas da árvore
simples, onde os vértices são as esquinas e as arestas são os e o sentido de baixo para cima para arestas de retorno.
trechos de rua entre esquinas, dizer se é possível atribuir mão
única a todos os trechos de ruas, tal que toda esquina seja 2 4
atingível a partir de qualquer outra. Quando for possível,
apresentar uma atribuição válida.

1 6 1
2 4 3 5
2
2 4
4
1 6
5
1 6
3 5 3 6
21 3 5 22

Buscas em Grafos Buscas em Grafos

Grafos - Pontes Grafos – Pontos de Articulação 2 4 6

Ponto de Articulação:
Problema MÃO ÚNICA (IV): Vértice que, se removido, 1
Dado o mapa de uma cidade, representado como um hiper- desconecta o grafo: Ex 5
grafo, onde os vértices são as esquinas e as arestas são os
trechos de rua entre esquinas, dizer se é possível atribuir mão 3 5 8 7
única a todos os trechos de ruas, tal que toda esquina seja
atingível a partir de qualquer outra. Quando for possível, Idéia de um algoritmo:
1
apresentar uma atribuição válida.
Dada uma árvore de profund.,
2
o vértice v é ponto de
articulação, se:
2 4 4
a) v é raiz da árv.prof. e
tem mais de um filho. 5
ou
1 6 b) v não é raiz, tem um filho 3 6
w e não há descendentes
de w (incluindo o próprio) 7
3 5
23
com arestas de retorno 24
para ancestrais de v. 8

4
Buscas em Grafos

2 4 6 Grafos – Pontos de Articulação


Grafos – Pontos de Articulação 2 4 6

Ponto de articulação: Externamente:


Vértice que, se removido, 1 Desmarcar vértices;
c ← 0; 1
desconecta o grafo: Ex 5
Pontos (1, 1);
3 5 8 7 Análise de Pa; 3 5 8 7
Idéia de um 1 Pontos (u, v);
algoritmo: v Pre Low Pa Marcar v; c ← c+1; Pre[v] ← c; Low[v] ← c; Pa[v] ← 0;
2 1 1 1 1 Para vizinhos w de v:
Funções p/ vértices: Se (w não marcado) Então
2 2 1 0
4 Pontos(v, w);
Pre(v) e Low(v), como 4 3 1 0 Se (Low[w] < Low[v]) Então
para pontes. 5 5 4 1 1 Low[v] ← Low[w];
3 5 1 0 Se (Pre(v) ≤ Low[w]) Então
Pa(v) = número de 3 6 Pa[v] ← Pa[v] + 1;
filhos de v que não 6 6 6 1 Senão Se (w ≠ u) e (Pre[w] < Low[v]) Então
alcançam ancestrais 7 7 7 6 0 Low[v] ← Pre[w];
de v na árv. Prof. Fp;
8 8 6 25 0 26
8 Fim;

Grafos – Pontos de Articulação Grafos – Pontos de Articulação


2 6
Exemplo com a Busca
começando no vértice 1. Problema MÃO ÚNICA (I):
Dado o mapa de uma cidade, representado como um grafo
simples, onde os vértices são as esquinas e as arestas são os
trechos de rua entre esquinas, dizer se é possível atribuir mão
1 3 5 4 única a todos os trechos de ruas, tal que toda esquina seja
atingível a partir de qualquer outra.
P L Pa P L Pa P L Pa P L Pa P L Pa P L Pa
v 1 2 3 4 5 6
1 1 1 0 Solução MÃO ÚNICA (I):
2 4
2 1 1 0 2 2 0
3 1 1 0 2 2 0 3 1 0 Pontos de articulação
6 1 1 0 2 2 0 3 1 0 4 4 0 interferem nas soluções???.
1 6
4 1 1 0 2 2 0 3 1 0 5 5 0 4 4 0
5 1 1 1 2 1 0 3 1 1 5 4 0 6 4 0 4 4 1
3 5
27 28

Buscas em Grafos

Grafos – Componentes biconexos

Grafos – Determinação de Pontos de Articulação 2 4 6

Exercício: Mostrar a árvore de profundidade do grafo 1


abaixo, determinando os pontos de articulação do
mesmo, através dos vetores Pre, Low e Pa. 3 5 8 7

B K M X Componente biconexo:
subgrafo maximal tal que ou seja uma aresta ou haja,
pelo menos, dois caminhos distintos entre cada par de
vértices do subgrafo.
Z
É equivalente a dizer que cada par de vértices do
F W componente biconexo (quando há mais de 2 vértices no
componente) faz parte de um ciclo.
Componentes biconexos do exemplo:
29 {1,2,3,4,5} {5,6} {6,7,8} 30

5
Grafos – Componentes biconexos Grafos – Componentes biconexos
2 4 6
2 4 6
Marcador: Externamente:
Vértice w que, tem Desmarcar vértices/arestas;
Esvaziar pilha; 1
Low(w) ≥ Pre(pai(w))
1 c ← 0;
Blocos (1, 1); 3 5 8 7
3 5 8 7 Blocos (u, v);
Marcar v; c ← c+1; Pre[v] ← c; Low[v] ← c;
Idéia de um algoritmo:
Para vizinhos w de v:
o marcador w mais “em baixo” da árvore de profundidade
Se aresta (w, v) não marcada Então Empilhar (w, v);
determina um componente = {elementos da subárvore com
Se (w não marcado) Então
raiz em w} + pai(w). Removido esse componente, aplica-
Blocos(v, w);
se recursão no grafo restante.
Se (Low[w] < Low[v]) Então Low[v] ← Low[w];
Se (Low[w] ≥ Pre[v]) Então
a) Fazer BP identificando marcadores e empilhando as
Desempilhar até (w, v);
arestas visitadas:
Senão Se (w ≠ u) e (Pre[w] < Low[v]) Então
b) Quando um marcador w é encontrado, desempilham-se as
Low[v] ← Pre[w];
arestas, até a aresta (w, pai(w)), inclusive.
31 Fp; 32
Fim;

Grafos – Determinação de Blocos Grafos – Determinação de Blocos


2 6 2 6
Exemplo com a Busca Exemplo com a Busca
começando no vértice 1. começando no vértice 1.

1 3 5 4 1 3 5 4

5/6
P L P L P L P L P L P L P L P L P L P L P L P L
v 1 2 3 4 5 6 4/5 v 1 2 3 4 5 6 6: 5/6 4/5 4/6
1 1 1 4/6 1 1 1
3: 3/6
2 1 1 2 2 3/6 2 1 1 2 2
3 1 1 2 2 3 1 3 1 1 2 2 3 1 1: 1/3 2/3 1/2
1/3
6 1 1 2 2 3 1 4 4 6 1 1 2 2 3 1 4 4
4 1 1 2 2 3 1 5 5 4 4 2/3 4 1 1 2 2 3 1 5 5 4 4
5 1 1 2 1 3 1 5 4 6 4 4 4 1/2 5 1 1 2 1 3 1 5 4 6 4 4 4
33 34

Buscas em Grafos Buscas em Grafos

Grafos – Determinação de Blocos Grafos - Busca em Largura (BFS)

Exercício: Mostrar a árvore de profundidade do grafo Idéia: Visitar, a cada passo, algum vizinho não visitado, do
abaixo, determinando os blocos do mesmo, através dos vértice mais antigamente visitado
vetores Pre, Low e de uma pilha auxiliar.
Desmarcar vértices;
B K M X Para i de 1 a n:
Se ( i não marcado) Então BL(i,i);
Fp;
Z
BP(u,v);
Marcar v;
F W Para vizinhos w de v:
Se (w não marcado) Então
BP(v,w);
35
Fp; 36
Fim;

6
Grafos - Busca em Largura (BFS) Grafos - Busca em Largura
2 4
Idéia: Visitar, a cada passo, algum vizinho não visitado, do
vértice mais antigamente visitado Árvores de Largura:
Mostram a sequência das 1 6
visitas. Pode haver mais de
Desmarcar vértices;
uma árvore de largura.
Para i de 1 a n: 3 5
Se ( i não marcado) Então BL(i,i);
Fp;
Árvores de Largura:
BL(u,v); 5 2
Esvaziar fila Q; Enfilar (v); Marcar v;
Enquanto (Q não vazia):
t ← vértice inicial de Q; 2 3 4 6 1 4 5
Para vizinhos w de t:
Se (w não marcado) Então 1
Enfilar (v,w); Marcar w; 3 6
Aresta de
Fp; cruzamento
Desenfilar (t);
Fe; 37 38
Fim; Complexidade: O(n+m)

Grafos – Busca em Largura Grafos - Busca em Largura


2 4

1 6
Exercício: Mostrar uma árvore de largura iniciando no
vértice de letra mais próxima de um dos nomes do Propriedades importantes da BL:
3 5
grupo.
a) Durante a BL, os vértices são
enfilados por ordem de 2
B K M X distância ao vértice da raiz da
busca.
b) Para qualquer nó da árvore de 1 4 5
largura, o caminho da raiz até esse
Z L
nó é um caminho mínimo entre os 3 6
dois nós.
J F R W
Distâncias para o vértice 2: 1, 4 e 5 estão à distância 1,
3 e 6, à distância 2.
39 40
Menor caminho de 2 a 6: 2 5 6

Grafos - Busca em Largura Grafos - Busca em Largura


2 4
Determinação do caminho mínimo
entre a raiz e outro vértice: Determinação do caminho mínimo entre a raiz e outro vértice:
1 6

1 2 3 4 5 6
a)Pode ser feito a partir da fila da BL, 3 5
2/0 1/1 4/1 5/1 3/2 6/4
desde que se guarde, junto com cada
vértice, a posição na fila do vértice 2
pai na busca. Algoritmo: Seja p a posição do vértice na Fila:
b)Pode tb ser feito empilhando-se os Caminho:
caminhos mínimos durante a BL. 1 4 5
j ← p;
Enquanto (j ≠ 0):
3 6 Guardar Fil[j].v no vetor C;
1 2 3 4 5 6 j ← Fil[j].pospai;
2/0 1/1 4/1 5/1 3/2 6/4 Fe;
Escrever C invertido.
41 Fim; 42

7
Grafos – Busca em Largura Grafos - Busca em Largura
2 4

Outras possibilidades da BL:


Pequenas modificações no 1 6
Exercício: Mostrar a obtenção do caminho mínimo algoritmo permitem descobrir
entre o vértice do início da busca e a folha mais propriedades do grafo
3 5
distante.

B K M X - Visita a todas as arestas


- Obtenção dos graus dos vértices
- Determinação se o grafo é conexo
- Determinação dos componentes conexos
Z L - Determinação de existência de ciclos
- Descoberta de elementos estruturais (pontes, blocos etc)
J F R W - Descoberta se o grafo é bipartido, ciclo, árvore, completo,
regular

43 44

Grafos - Comparação Profundidade x Largura Grafos - Busca Irrestrita em


2 4
Profundidade

Idéia:
1 6
Visitar, a cada passo, algum
vizinho do vértice mais
recentemente visitado 3 5

Desmarcar vértices;
Para i de 1 a n:
Se ( i não marcado) Então BP(i);
Fp;

BP(v);
Marcar v;
Para vizinhos w de v:
Se (w não marcado) Então
BP(w);
Fp;
45 Desmarcar v; 46
Fim;

Grafos - Busca Irrestrita em Grafos - Busca Irrestrita em


2 4 2 4
Profundidade Profundidade

Árvores de Busca Irrestrita: Listagem de todoos os ciclos:


1 6 1 6
Mostram a sequência das Como a árvore de busca não
visitas. Pode haver mais de é criada explicitamente, para
uma árvore. 3 5 algumas aplicações é interes- 3 5
sante empilhar os vértices no
Árvore de Busca Irrestrita: início da busca e desempilhar
no final. O exemplo abaixo
mostra a listagem dos ciclos.
5
BP(v);
2 3 4 Marcar v; PUSH(v).
6 Para vizinhos w de v:
1 2 Se (w não marcado) Então BP(w)
1 4 Senão Se (w ≠ u) Então
2 1
Imprimir pilha do topo até vértice v.
3 4 3 Fp;
47
Desmarcar v; POP; 48
Fim;

8
Buscas em Grafos

Grafos – Busca em Profundidade Irrestrita

Exercício: Mostrar uma árvore de profundidade


irrestrita iniciando no vértice de letra mais próxima de
um dos nomes do grupo. FIM

B K M X

F W

49 50

Você também pode gostar