Se me for dado um gráfico que forma uma árvore, estou interessado em encontrar um vértice que maximize a distância mínima a qualquer folha.
Estou certo de que esse problema já foi estudado antes. Alguém sabe o nome deste problema ou um algoritmo para resolvê-lo?
Respostas:
Para encontrar um vértice de distância máxima de qualquer folha, você pode realizar uma pesquisa abrangente a partir de muitos pontos de partida, como as folhas. Como um BFS visita cada nó pelo caminho mais curto possível a partir da (s) fonte (s) da pesquisa, podemos atribuir facilmente a cada nó a distância até a folha mais próxima.
Inserir em uma fila uma coleção de pares( ℓ , 0 ) para ℓ abrangendo todas as folhas e registrando max =0 .
Repita o seguinte até que a fila esteja vazia:
Estale um par( v , d) fora da fila. E sed= max inserir v em uma coleção de elementos de distância máxima.
Se houver nós adjacentes av que não foram visitados, empurre um par ( w , d+ 1 ) na fila para cada vizinho W , marcando-os como tendo sido visitados. Se houver algumW esvazie a coleção de elementos de distância máxima (se não estiver vazia) e defina max =d+ 1 .
O resultado é uma coleção de nós que estão todos à distância pelo menosmax de qualquer folha.
Deixein = | V| (Observe que m = | E| =n-1 ) Supondo que possamos preencher a fila com as folhas da árvore a tempoO ( n ) examinando todos os nós do gráfico e que os vértices têm listas de adjacência de seus vizinhos, "atravessamos" cada aresta duas vezes para considerar os vizinhos de cada vértice; então esse algoritmo levaO ( n + m ) = O ( n ) Tempo. Também funciona para não-árvores, recuperando novamenteO ( n + m ) Tempo.
fonte
Realize a pesquisa da primeira largura de todas as folhas em paralelo, ou seja, visite todos os vizinhos de todas as folhas, seus respectivos vizinhos e assim por diante. O nó visitado por último é o seu vencedor.
Se você permitir que todas as pesquisas compartilhem a
visited
bandeira, nenhum vértice será visitado duas vezes. Como temos uma árvore, todas as arestas são visitadas apenas uma vez. No total, obtemos tempo de execução linear (no número de nós).fonte