Largura primeira pesquisa

Travessia do gráfico

Travessia do gráfico significa visitar cada vértice e aresta exatamente uma vez em um poço ordem definida. Ao usar certos algoritmos de gráfico, você deve garantir que cada vértice do gráfico seja visitado exatamente uma vez. A ordem em que os vértices são visitados é importante e pode depender do algoritmo ou questão que você está resolvendo.

Durante uma travessia, é importante que você rastreie quais vértices foram visitados. A maneira mais comum de rastrear vértices é marcá-los.

Pesquisa em amplitude (BFS)

Existem muitas maneiras de percorrer os gráficos. BFS é a abordagem mais comumente usada.

O BFS é um algoritmo de passagem onde você deve começar a fazer a passagem de um nó selecionado (nó de origem ou nó inicial) e atravessar o gráfico em camadas, explorando assim os nós vizinhos (nós que estão diretamente conectados ao nó de origem). Você deve, então, mover-se para os nós vizinhos do próximo nível.

Como o nome BFS sugere, você deve percorrer o gráfico em largura da seguinte forma:

  1. Primeiro mova horizontalmente e visite todos os nós da camada atual
  2. Mova para a próxima camada

Considere o seguinte diagrama.

A distância entre os nós na camada 1 é comparativamente menor do que a distância entre os nós na camada 2. Portanto, no BFS, você deve atravessar todos os nós na camada 1 antes de mover para os nós na camada 2.

Percorrendo nós filhos

Um gráfico pode conter ciclos, que podem levá-lo ao mesmo nó novamente enquanto percorre o gráfico. Para evitar o processamento do mesmo nó novamente, use um array booleano que marca o nó após ele ser processado. Ao visitar os nós na camada de um gráfico, armazene-os de maneira que você possa atravessar os nós filhos correspondentes em uma ordem semelhante.

Para facilitar esse processo, use uma fila para armazenar o nó e marque-o como “visitado” até que todos os seus vizinhos (vértices que estão diretamente conectados a ele) sejam marcados. A fila segue o método de enfileiramento First In First Out (FIFO) e, portanto, os vizinhos do nó serão visitados na ordem em que foram inseridos no nó, ou seja, o nó que foi inserido primeiro será visitado primeiro, e assim sobre.

Pseudocódigo

Processo de cruzamento

O cruzamento iniciará a partir do nó de origem e enviará s na fila. s serão marcados como “visitados”.

Primeira iteração

  • s será retirado da fila
  • Vizinhos de s, ou seja, 1 e 2 serão percorridos
  • 1 e 2, que não foram percorridos anteriormente, são percorridos. Eles serão:
    • Colocados na fila
    • 1 e 2 serão marcados como visitados

Segunda iteração

  • 1 é retirado da fila
  • Vizinhos de 1, ou seja, se 3 são percorridos
  • s é ignorado porque está marcado como “visitado”
  • 3, que não foi percorrido anteriormente, é percorrido. É:
    • Colocado na fila
    • Marcado como visitado

Terceira iteração

  • 2 é retirado da fila
  • Vizinhos de 2, ou seja, s, 3 e 4 são atravessados
  • 3 es são ignorados porque estão marcados como “visitados”
  • 4, que não foi percorrido anteriormente, é percorrido. É:
    • Colocado na fila
    • Marcado como visitado

Quarta iteração

  • 3 é retirado da fila
  • vizinhos de 3, ou seja, 1, 2 e 5 são atravessados
  • 1 e 2 são ignorados porque estão marcados como “visitados”
  • 5, que não foi percorrido anteriormente, é percorrido. É:
    • Colocado na fila
    • Marcado como visitado

Quinta iteração

  • 4 será retirado da fila
  • vizinhos de 4, ou seja, 2 é atravessado
  • 2 é ignorado porque já está marcado como “visitado”

Sexta iteração

  • 5 é retirado da fila
  • vizinhos de 5, ou seja, 3 é atravessado
  • 3 é ignorado porque é já marcado como “visitado”

A fila está vazia e sai do loop. Todos os nós foram percorridos usando BFS.

Se todas as arestas em um gráfico tiverem o mesmo peso, então o BFS também pode ser usado para encontrar a distância mínima entre os nós em um gráfico.

Exemplo

Como neste diagrama, comece a partir do nó de origem, para encontrar a distância entre a fonte nó e nó 1. Se você não seguir o algoritmo BFS, você pode ir do nó de origem para o nó 2 e depois para o nó 1. Esta abordagem irá calcular a distância entre o nó de origem e o nó 1 como 2, enquanto o mínimo a distância é na verdade 1. A distância mínima pode ser calculada corretamente usando o algoritmo BFS.

Complexidade

A complexidade de tempo do BFS é O (V + E), onde V é o número de nós e E é o número de arestas.

Aplicativos

1. Como determinar o nível de cada nó na árvore dada?

Como você sabe no BFS, você atravessa o nível. Você também pode usar o BFS para determinar o nível de cada nó.

Implementação

Este código é semelhante ao código BFS com apenas a seguinte diferença:
nível] = nível + 1;

Neste código, enquanto você visita cada nó, o nível desse nó é definido com um incremento no nível de seu nó pai. É assim que o nível de cada nó é determinado.

2 . 0-1 BFS

Este tipo de BFS é usado para encontrar a distância mais curta entre dois nós em um gráfico, desde que as arestas do gráfico tenham os pesos 0 ou 1. Se você aplicar o BFS explicado anteriormente em neste artigo, você obterá um resultado incorreto para a distância ideal entre 2 nós.

Nesta abordagem, uma matriz booleana não é usada para marcar o nó porque a condição da distância ideal será verificada quando você visite cada nó. Uma fila dupla é usada para armazenar o nó. Em 0-1 BFS, se o peso da borda = 0, o nó é empurrado para a frente do desenfileiramento. Se o peso da aresta = 1, então o nó é empurrado para trás do desenfileiramento.

Implementação

Q é uma fila dupla. A distância é uma matriz onde distância irá conter a distância do nó inicial ao nó v. Inicialmente, a distância definida do nó de origem até cada nó é infinita.

Vamos entender este código com o seguinte gráfico:

A lista de adjacências do gráfico será a seguinte:
Aqui, “s” é considerado 0 ou nó de origem.

0 – > 1 – > 3 – > 2
bordas.first = 1, bordas.segundo = 1
bordas.first = 3, bordas.segundo = 0
bordas.first = 2, bordas.segundo = 1

1 – > 0 – > 4
bordas.first = 0, bordas.second = 1
bordas.first = 4 , bordas.second = 0

2 – > 0 – > 3
bordas.first = 0 , bordas.segundo = 0
bordas.first = 3, bordas.segundo = 0

3 – > 0 – > 2 – > 4
bordas.first = 0, bordas.second = 0
bordas.first = 2, bordas.segundo = 0
edge.first = 4, edge.second = 0

4 – > 1 – > 3
bordas.first = 1, bordas.segundo = 0
bordas.first = 3, bordas.segundo = 0

Se você usar o algoritmo BFS, o resultado será incorreto porque mostrará a você a distância ideal entre s e nó 1 es e nó 2 como 1, respectivamente. Isso ocorre porque ele visita os filhos de se calcula a distância entre s e seus filhos, que é 1. A distância ótima real é 0 em ambos os casos.

Processamento

Começando no nó de origem, ou seja, 0, ele se moverá em direção a 1, 2 e 3. Como o peso da aresta entre 0 e 1 e 0 e 2 é 1, respectivamente , 1 e 2 serão colocados no final da fila. No entanto, como a espessura da borda entre 0 e 3 é 0, 3 será empurrado para a frente da fila. A distância será mantida na matriz de distância de acordo.

3 serão então retirados da fila e o mesmo processo será aplicado aos seus vizinhos, e assim por diante.

Contribuído por: Prateek Garg

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *