Atualizar:
Esta solução não está correta.
Infelizmente, a solução é verdadeira (e direta) para árvores! Encontrar o diâmetro de uma árvore nem precisa disso. Aqui está um contra-exemplo para gráficos (o diâmetro é 4, o algoritmo retorna 3 se você escolher este ):v
Se o gráfico for direcionado, isso é bastante complexo, eis alguns trabalhos que reivindicam resultados mais rápidos no caso denso do que usar algoritmos para os caminhos mais curtos de todos os pares.
No entanto, meu ponto principal é sobre o caso de o gráfico não ser direcionado e com pesos não negativos, ouvi um truque interessante várias vezes:
- Escolha um vértice v
- Encontre modo que d ( v , u ) seja máximovocêd(v,u)
- Encontre modo que d ( u , w ) seja máximowd( u , w )
- Retorno d( u , w )
Sua complexidade é igual a duas primeiras buscas sucessivas¹, ou seja, se o gráfico estiver conectado².O ( | E| )
Parecia folclore, mas, no momento, ainda estou lutando para obter uma referência ou provar sua correção. Atualizarei quando atingir um desses objetivos. Parece tão simples que eu posto minha resposta agora, talvez alguém entenda mais rápido.
¹ se o gráfico for ponderado, a wikipedia parece dizer mas só tenho certeza sobre O ( | E | log | V | ) .O ( | E| + | V| registro| V| )O ( | E| registro| V| )
² Se o gráfico não estiver conectado, você obtém mas pode ser necessário adicionar O ( α ( | V | ) ) para selecionar um elemento de cada componente conectado. Não tenho certeza se isso é necessário e, de qualquer maneira, você pode decidir que o diâmetro é infinito neste caso.O ( | V| + | E| )O ( α ( | V| )))