Escolar Documentos
Profissional Documentos
Cultura Documentos
3 5
outubro/2009
1 2
1
Buscas em Grafos Buscas em Grafos
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;
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
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;
Grafos – Pontes 2 4 6
3
Buscas em Grafos Buscas em Grafos
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
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
Buscas em Grafos
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;
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
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)
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
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
43 44
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;
8
Buscas em Grafos
B K M X
F W
49 50