Estrutura de Dados
13 – Grafos: Algoritmos
de Busca
Tópicos
• Percurso em Grafos
Percurso em Grafos
• A operação básica em grafos é o percurso
- Ou seja, visitar todos os vértices e arestas uma
única vez em alguma ordem;
• Uma possível dificuldade seria não terminar a
busca nunca, por causa de repetição
- Por isso marcamos os vértices já visitados.
• Existem dois algoritmos básicos
Busca em Largura (BFS)
• A busca em largura (Breadth-First-Search – BFS)
expande a exploração de um grafo em níveis
- A partir do vértice inicial, o nível explorado é o dos
vértices adjacentes;
- Após a exploração deste nível, passa-se à exploração
do vértice adjacente aos do nível anterior;
- Caso o grafo seja desconectado, ao fim da exploração
de um componente, passa-se ao próximo;
- O procedimento se repete até que todos os vértices
tenham sido explorados.
Busca em Largura (BFS)
• Uma estrutura de fila é utilizada para guiar os passos
da busca;
• Durante a exploração, um vértice é descoberto na
primeira vez em que é encontrado, quando é então
enfileirado
-
Representado pela cor cinza.
• Quando o vértice é retirado da fila, ele é considerado
visitado
-
Todos os vértices adjacentes a ele foram descobertos, ou
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira da fila e percorre todos
os vértices adjacentes,
inserindo-os na fila e pintando
de cinza.
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Após todos os vértices terem
sido percorridos, o vértice atual
é pintado de preto, que
significa que ele já foi
explorado/visitado.
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Retira o próximo da fila,
percorre seus vértices
Busca em Largura (BFS)
1 5 9 3 7 2 6 8 4Busca em Largura (BFS)
• Existe uma relação entre o penúltimo e último
vértice descobertos
- O último foi descoberto a partir do penúltimo;
- Dizemos então que o penúltimo é pai/predecessor
do último;
• Se seguirmos a genealogia dos vértices,
obtemos o caminho de menor comprimento
entre o vértice inicial da busca e todos os outros
Busca em Largura - Código
• Para a implementação definiremos a cor do
vértice como (utiliza #define):
- BRANCO (0): significa que ele nunca foi percorrido
- CINZA (1): já foi percorrido uma vez
- PRETO (2): já foi explorado/visitado
• A função BFS() analisa a ordem de exploração
dos vértices para encontrar o menor caminho
entre dois vértices.
Busca em Largura - Código
Busca em Largura - Código
Busca em Largura - Código
• Função de criação de resultado: inicializa
variáveis
Busca em Largura - Código
Busca em Largura - Código
• Exemplo:
1 5 0 3 2 4 origemBusca em Largura - Código
• Exemplo:
Fila: null Atual: x
• Após a execução da função de cria resultado – essa função inicializa a cor, a distância e o predecessor de todos os vértices do grafo. 0 1 2 3 4 5 6 Cor B B B B B B B Dist. 0 0 0 0 0 0 0
Busca em Largura - Código
• Exemplo:
Fila: 0->null Atual: x
• Insere na fila o vértice
origem e pinta ele de cinza (executando a função BFS) 0 1 2 3 4 5 6 Cor B B B B B B B C Dist. 0 0 0 0 0 0 0
Busca em Largura - Código
• Exemplo:
Fila: 1->2->3->null Atual: 0
• Enquanto a fila for diferente de vazia retira um vértice do início da fila. Verifica todos os vértices
adjacentes ao atual, insere-os na fila, pinta eles de
cinza, atualiza a distância e o seu predecessor. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C Dist. 0 0 0 0 0 0 0 1 1 1
Busca em Largura - Código
• Exemplo:
Fila: 1->2->3->null Atual: 0
• Após ter passado por todos os vértices adjacentes pinta o vértice atual de preto,
que significa que ele já foi explorado/visitado. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C P Dist. 0 0 0 0 0 0 0 1 1 1
Busca em Largura - Código
• Exemplo:
Fila: 2->3->null Atual: 0 1
• Repete o processo: - retira um vértice da fila,
torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C P Dist. 0 0 0 0 0 0 0 1 1 1
Busca em Largura - Código
• Exemplo:
Fila: 2->3->null Atual: 0 1
• Neste caso todos os
adjacentes de 1 já foram percorridos (estão cinzas), e com isso pinta o vértice de preto. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C P P Dist. 0 0 0 0 0 0 0 1 1 1
Busca em Largura - Código
• Exemplo:
Fila: 3->4->5->null Atual: 0 1 2
• Repete o processo: - retira um vértice da fila,
torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2
Busca em Largura - Código
• Exemplo:
Fila: 3->4->5->null Atual: 0 1 2
• Após ter passado por todos os vértices adjacentes pinta o vértice atual de preto,
que significa que ele já foi explorado/visitado. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2
Busca em Largura - Código
• Exemplo:
Fila: 4->5->null Atual: 0 1 2 3
• Repete o processo:
- retira um vértice da fila, torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações.
Neste caso todos os adjacentes de 3 já foram 0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C P P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2
Busca em Largura - Código
• Exemplo:
Fila: 5->null Atual: 0 1 2 3 4
• Repete o processo:
- retira um vértice da fila, torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações.
Neste caso todos os adjacentes de 4 já foram percorridos (estão cinzas), e
0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C P P P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2
Busca em Largura - Código
• Exemplo:
Fila: 6->null
Atual: 0 1 2 3 4 5
• Repete o processo: - retira um vértice da fila,
torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C C P P P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2 3
Busca em Largura - Código
• Exemplo:
Fila: 6->null
Atual: 0 1 2 3 4 5
• Após ter passado por todos os vértices adjacentes pinta o vértice atual de preto,
que significa que ele já foi explorado/visitado. 0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C C P P P P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2 3
Busca em Largura - Código
• Exemplo:
Fila: nullAtual: 0 1 2 3 4 5 6
• Repete o processo:
- retira um vértice da fila, torna-o o atual;
- verifica seus vértices
adjacentes e atualiza suas informações.
Neste caso todos os adjacentes de 6 já foram percorridos (estão cinzas), e
0 1 2 3 4 5 6 Cor B B B B B B B C C C C C C C P P P P P P P Dist. 0 0 0 0 0 0 0 1 1 1 2 2 3