You are on page 1of 9

Busca em largura

Teoria dos Grafos

Busca em Largura
Prof. Humberto Brando humberto@unifal-mg.edu.br aula disponvel no site: http://www.dcc.ufmg.br/~humberto/
Universidade Federal de Alfenas Departamento de Cincias Exatas verso da aula: 0.1

Um dos algoritmos mais simples da rea; Serve de base para vrios outros algoritmos:
Base para Caminho mais curto (Dijkstra);
Utilizado para calcular rotas de custo mnimo em um par de localidades em um mapa, por exemplo;

Base para rvore Geradora Mnima - AGM (Prim);


Utilizado para interligar localidades a um custo mnimo, por exemplo.

Busca em largura
O algoritmo da Busca em Largura calcula a distncia (menor nmero de arestas) desde o vrtice s (raiz) at todos os vrtices acessveis; Ele tambm produz uma rvore Primeiro na Extenso, com raiz em s, que contm todos os vrtices acessveis;

Busca em largura
Para cada vrtice v acessvel a partir de s, o caminho na rvore primeiro na extenso de s at v corresponde a um caminho mais curto de s at v, ou seja, um caminho que contm um nmero mnimo de arestas; Observao: Esta informao no possvel ser obtida na busca em profundidade: d(s,t)=2 na rvore gerada pela DFS 4.

Busca em largura
Assim como a Busca em Profundidade (DFS), o algoritmo da Busca em Largura (BFS) funciona sobre grafos orientados e tambm no orientados;

Busca em largura
A busca em largura recebe esse nome porque expande a fronteira entre vrtices descobertos e no descobertos uniformemente ao longo da extenso da fronteira; Isto , o algoritmo g descobre todos os vrtices distncia k a partir de s, antes de descobrir quaisquer vrtices distncia k+1; (ponto chave) Comparativo com o movimento da gua;

Busca em largura
O controle do descobrimento dos ns na busca em largura feito de forma semelhante ao controle utilizado na busca em profundidade anteriormente apresentada:
N branco = No visitado/no conhecido; N cinza = N conhecido/no visitado; Seus adjacentes no foram inseridos na fila; N preto = N conhecido/N visitado; Todos os seus adjacentes foram inseridos na fila;

Busca em largura
Um vrtice descoberto na primeira vez em que encontrado; Neste momento ele se torna no branco; branco Assim como na DFS, DFS os vrtices de cor cinza e preta distinguem os vrtices j localizados em duas categorias; categorias Vrtices de cor cinza podem ter alguns vrtices adjacentes brancos; Eles representam a fronteira entre vrtices descobertos e no descobertos;

Busca em largura
A Busca em largura constri uma rvore primeiro na extenso, contendo inicialmente apenas sua raiz; extenso Sempre que um vrtice v descoberto no curso da varredura da lista de adjacncias de um vrtice u j descoberto, o vrtice v e a aresta (u,v) so adicionados rvore; rvore Neste caso, dizemos que u predecessor ou pai de v na rvore primeiro na extenso;

Busca em largura
Como um vrtice descoberto no mximo uma vez, vez este possui apenas um pai; pai Conceito de Ancestral: Se u est no caminho na rvore a partir da raiz s at o vrtice v, ento u ancestral de v, e v um descendente de u. Tudo depende do n escolhido para raiz; As vezes prefixado, como em algumas aplicaes da rea de redes;

Busca em largura
Segundo Cormen Cormen, a Busca em Largura (BFS BFS) pressupe que o grafo G=(V,A) representado por uma lista de adjacncia; Vimos no TP1 que com o uso de interfaces este detalhe pode ser ocultado para os programadores;

Busca em largura
Assim como na DFS, a BFS faz uso de algumas estruturas auxiliares durante a pesquisa: cor[u]; //indicativo de atingibilidade; [u]; [ ] //indica //i di o vrtice ti predecessor d de d u(pai); ( i) d[u]; //indica a distncia desde a origem d(s,u) - em arestas; Q; //indica a fila (FIFO) ponto chave do algoritmo.

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ] [u ] NULL
12 13 14 15 16 17 18 para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]
recebe como parmetro o [u ] NULLgrafo 13 G(V,A) e um vrtice para iniciar a busca O procedimento BFS 12

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila ()

14 15 16 17 18

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

9 ENFILEIRA(Q, s )

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor [v]do = grafo, BRANCO Para cada vrtice
diferente do vrtice inicial cor [v ] CINZA s, faa...

[u ] NULL

12 13
Indica que eles esto 15 descobertos (ainda no conhecidos) BRANCOS

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

14 16 17 18

d [v] = d [u ] + 1 [v ] u

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ] [u ] NULL 12 13 para cada v Adj[u ] se cor[v] = BRANCO
Raiz s at cada vrtice

Busca em Largura
BFS (G, s ) 2 3 4 cor[u ] BRANCO d [u ] [u ] NULL 1 para cada vrtice u V [G ] { s} 10 enquanto !vazia(Q) predecessor/pai; 11 12 13 14 15 16 17 18 u DESENFILEIRA(Q) para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1
Indica que cada vrtice ainda no tem

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

14Indica que acor [v ] CINZA distncia da 15infinita (a princpio) d [v] = d [u ] + 1 16 [v ] u 17 18 ENFILEIRA(Q, v) cor[u ] PRETO

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u Vdistncia( [G ] {ss, }s) = 10 enquanto !vazia(Q) 0 2 cor[u ] BRANCO bvio! 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL

12 13

para cada v Adj[u ] se cor[v] = BRANCO

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

A cor do vrtice de [v ] CINZA 14 cor

15 primeiro a ser d [v ] = d [u ] + 1 conhecido/visitado... 16 [v ] u 17 18 ENFILEIRA(Q, v) cor[u ] PRETO

partida s Cinza... O

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ] [u ] NULL 12 13 14 para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ] [u ] NULL
Uma estrutura auxiliar de 12 para cada fila iniciada como vazia;

13 14 15 16 17 18

v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

E por default 15 , o vrtice de d [v] = d [u ] + 1 partida no possui predecessor 16 (pai); [v ] u

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

17 18

ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u


E o vrtice de partida s ENFILEIRA(Q, v) enfileirado; O algoritmo est pronto para cor [u ] PRETO comear!!!

[u ] NULL

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

no visitados, faa... 5 cor[ sainda ] CINZA

Enquanto existir vrtices

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL

)... CINZA 5 cor[ s( ]u

Retira o primeiro da fila

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u ENFILEIRA(Q, v) cor[u ] PRETO

[u ] NULL

u, CINZA faa.. 5 cor[ sde ]

Para todos os adjacentes

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

conhecido, faa... 5 cor[ sno ] CINZA

[u ] NULL Se o adjacente de u ainda

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u ENFILEIRA(Q, v) cor[u ] PRETO

[u ] NULL

5 cor[ s(conhecido/no ] CINZA visitado) 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

Colora-o de CINZA...

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u ENFILEIRA(Q, v) cor[u ] PRETO

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL


Indica que 8 Q nova Fila () a distncia de v at a raiz uma unidade a seu pai at a raiz... mais(que a)distncia de 9 ENFILEIRA Q, s

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila ()


Seta o pai do vrtice v como u. , s ) 9 ENFILEIRA (Q

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ]

[u ] NULL
explorar seus adjacentes

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1 [v ] u ENFILEIRA(Q, v) cor[u ] PRETO

[u ] NULL

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA Enfileira o vrtice v para 6 d [ s] no 0 futuro... 7 [ s ] NULL

5 cor[ s ] CINZA 6 d [ s] 0 Ao todos os 7 [ sconhecer ] NULL


(conhecido/visitado)

8 Q nova Fila () 9 ENFILEIRA(Q, s )

marcado como PRETO. 8Q Fila () nova

adjacentes de u, o vrtice

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

9 ENFILEIRA(Q, s )

Busca em Largura
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) Lembrando que este procedimento se repete 2 cor[ u ] BRANCO 11 u DESENFILEIRA(Q) 3 4 d [u ] [u ] NULL
at que a fila esteja vazia...

Busca em Largura

12 13 14 15 16 17 18

para cada v Adj[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO
Incio da BFS. Apenas o vrtice s conhecido (cinza). O mesmo inserido na fila (FIFO).

Busca em Largura

Busca em Largura

O vrtice s marcado como preto: todos seus vizinhos so conhecidos... Diferente da DFS.

2
Os vrtices r e w so adicionados na rvore primeiro na extenso, e tambm as arestas (s,r) e (s,w) Retira s da fila, e comea parte para seus adjacentes...

1
Os vrtices adjacentes a s so marcados como cinzas, e tambm indicado a distncia at a raiz.

Adjacentes de s so enfileirados...

Busca em Largura

Busca em Largura

Busca em Largura

Busca em Largura

Busca em Largura

Busca em Largura

Busca em Largura

Busca em Largura
rvore gerada na busca

Busca em largura
Anlise de complexidade
BFS (G, s ) 1 para cada vrtice u V [G ] {s} 10 enquanto !vazia(Q) 2 cor[u ] BRANCO 11 u DESENFILEIRA(Q) 3 d [u ] 12 para cada v Adj[u ]

Busca em largura
Anlise de complexidade
Obviamente que a complexidade da busca em largura depende diretamente da representao do grafo 10 enquanto !vazia(Q ) utilizada;
11 12 13 14 15 16 17 18 u DESENFILEIRA(Q) para cada v Adj p j[u ] se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

4 [u ] NULL 5 cor[ s ] CINZA 6 d [ s] 0 7 [ s ] NULL 8 Q nova Fila () 9 ENFILEIRA(Q, s )

13 14 15 16 17 18

se cor[v] = BRANCO cor[v] CINZA d [v] = d [u ] + 1

[v] u
ENFILEIRA(Q, v) cor[u ] PRETO

[v ] u
ENFILEIRA(Q, v) cor[u ] PRETO

Utilizando lista de adjacncia: O(|V|+|A|)

Exerccios
Qual o tempo de execuo da BFS se o grafo for representado por uma matriz de adjacncias? Mostre os valores dos vetores e d resultantes da BFS(G u), para o grafo G a seguir: BFS(G,u)

Prova
1 Prova:
Sexta-feira; 19/09/2008.

Reposio de aula:
Quinta-feira; 18/09/2008; 11h; Aula tira dvidas; Prdio S. Sala a definir.

Busca em Largura
Estes slides esto disponveis no endereo: http://www.dcc.ufmg.br/~humberto/ Bibliografia recomendada para esta aula:
Algoritmos Teoria e Prtica, Traduo da 2 edio. Thomas H. Cormen, Charles E E. Leiserson Leiserson, Ronald L L. Rivest Rivest, Clifford Stein. Stein 2002, 2002 936 pp. pp Editora Campus/Elsevier, ISBN 8535209263. Observao: Existem erros de digitao no algoritmo da busca em largura da 2 edio. Leia como .