Aktualizacja:
To rozwiązanie jest nieprawidłowe.
Rozwiązanie jest niestety prawdziwe (i proste) dla drzew! Znalezienie średnicy drzewa nawet tego nie potrzebuje. Oto kontrprzykład dla wykresów (średnica wynosi 4, algorytm zwraca 3, jeśli wybierzesz to ):v
Jeśli wykres jest skierowany, jest to dość skomplikowane, oto część papieru, która twierdzi, że wyniki w gęstym przypadku są szybsze niż stosowanie algorytmów dla najkrótszych ścieżek wszystkich par.
Jednak moja główna uwaga dotyczy przypadku, w którym wykres nie jest skierowany, a przy wagach nieujemnych kilkakrotnie słyszałem o fajnej sztuczce:
- Wybierz wierzchołekv
- Znajdź tak, że jest maksymalned ( v , u )ud(v,u)
- Znajdź tak, że jest maksymalned ( u , w )wd(u,w)
- Zwróćd(u,w)
Jego złożoność jest taka sama, jak dwa kolejne pierwsze wyszukiwania¹, tzn. jeśli wykres jest połączony².O(|E|)
Wydawało się to folklorem, ale w tej chwili wciąż staram się zdobyć referencję lub udowodnić jej poprawienie. Zaktualizuję, kiedy osiągnę jeden z tych celów. Wydaje się to takie proste, że teraz zamieszczam swoją odpowiedź, być może ktoś dostanie ją szybciej.
¹ jeśli wykres jest ważony, wikipedia wydaje się mówić ale jestem pewien co do .O ( | E | log | V | )O(|E|+|V|log|V|)O(|E|log|V|)
² Jeśli wykres nie jest połączony, otrzymujesz ale może być konieczne dodanie aby wybrać jeden element z każdego podłączonego komponentu. Nie jestem pewien, czy jest to konieczne, a mimo to możesz zdecydować, że średnica jest w tym przypadku nieskończona.O(|V|+|E|)O(α(|V|))