Aktualisieren:
Diese Lösung ist nicht korrekt.
Die Lösung ist leider nur für Bäume richtig (und unkompliziert)! Den Durchmesser eines Baumes zu finden, braucht das nicht einmal. Hier ist ein Gegenbeispiel für Graphen (Durchmesser ist 4, der Algorithmus gibt 3 zurück, wenn Sie dieses auswählen ):v
Wenn das Diagramm gerichtet ist, ist dies ziemlich komplex, hier ist etwas Papier behauptet, dass im dichten Fall schnellere Ergebnisse erzielt werden als bei Verwendung von Algorithmen für kürzeste Pfade mit allen Paaren.
Mein Hauptaugenmerk liegt jedoch auf dem Fall, dass der Graph nicht gerichtet ist und ich bei nicht negativen Gewichten mehrmals von einem netten Trick gehört habe:
- Wählen Sie einen Eckpunkt v
- Finde so, dass d ( v , u )ud(v,u) maximal ist
- Finden Sie so, dass d ( u , w ) maximal istwd(u,w)
- Return d(u,w)
Seine Komplexität entspricht der von zwei aufeinanderfolgenden Breitensuchen¹, d. H. O(|E|) wenn der Graph verbunden ist².
Es schien Folklore zu sein, aber im Moment kämpfe ich immer noch darum, eine Referenz zu finden oder seine Korrektur zu beweisen. Ich werde aktualisieren, wenn ich eines dieser Ziele erreiche. Es scheint so einfach zu sein, dass ich meine Antwort sofort poste. Vielleicht bekommt es jemand schneller.
¹ Wenn der Graph gewichtet ist, scheint Wikipedia zu sagen, aber ich bin mir nur sicher, ob O ( | E | log | V | )O(|E|+|V|log|V|)O(|E|log|V|) .
² Wenn der Graph nicht verbunden ist, erhalten Sie aber Sie müssen möglicherweise O ( α (O(|V|+|E|)O(α(|V|)), um ein Element aus jeder verbundenen Komponente auszuwählen. Ich bin mir nicht sicher, ob dies notwendig ist, und trotzdem können Sie entscheiden, dass der Durchmesser in diesem Fall unendlich ist.