Обновить:
Это решение не является правильным.
Решение, к сожалению, верно только для деревьев! Нахождение диаметра дерева даже не нужно. Вот контрпример для графиков (диаметр равен 4, алгоритм возвращает 3, если вы выберете это ):v
Если график направлен, то это довольно сложно, вот статья, в которой утверждается, что в плотном случае результаты быстрее, чем использование алгоритмов для всех пар кратчайших путей.
Тем не менее, моя главная мысль о том, что график не направлен, и с неотрицательными весами я слышал о хорошем трюке несколько раз:
- Выберите вершинуv
- Найти такой , что является максимальнымд ( V , U )Ud( v , u )
- Найти такое, что максимальноd ( u , w )весd( и , ж )
- Вернутьd( и , ж )
Его сложность такая же, как два последовательных поиска в ширину ¹, то есть если граф связан ².O ( | E| )
Это казалось фольклорным, но сейчас я все еще пытаюсь получить справку или доказать ее исправление. Я обновлю, когда я достигну одной из этих целей. Это кажется таким простым, я отправляю свой ответ прямо сейчас, возможно, кто-то получит его быстрее.
¹ если график весовой, в википедии, кажется, написано но я уверен только в .O ( | E | log | V | )O ( | E| + | В| журнал| В| )O ( | E| журнал| В| )
² Если график не связан, вы получите но вам, возможно, придется добавить чтобы выбрать один элемент из каждого подключенного компонента. Я не уверен, если это необходимо, и в любом случае, вы можете решить, что диаметр в этом случае бесконечен.O ( α ( | V | ) )O(|V|+|E|)O(α(|V|))