Wenn ich ein Diagramm bekomme, das einen Baum bildet, bin ich daran interessiert, einen Scheitelpunkt zu finden, der den Mindestabstand zu einem Blatt maximiert.
Ich bin sicher, dass dieses Problem bereits untersucht wurde. Kennt jemand den Namen dieses Problems oder einen Algorithmus zur Lösung?
Antworten:
Um einen Scheitelpunkt mit maximaler Entfernung von einem Blatt zu finden, können Sie eine Breitensuche durchführen, die an vielen Startpunkten beginnt, dh an den Blättern. Da ein BFS jeden Knoten auf dem kürzest möglichen Weg von den Quellen der Suche (n) besucht, können wir jedem Knoten leicht den Abstand zum nächsten Blatt zuordnen.
Fügen Sie in eine Warteschlange eine Sammlung von Paaren für die sich über alle Blätter erstrecken, und zeichnen Sie .(ℓ,0) ℓ max=0
Wiederholen Sie Folgendes, bis die Warteschlange leer ist:
Pop ein Paar(v,d) aus der Warteschlange. Wennd=max einfügen v in einer Sammlung von Elementen mit maximalem Abstand.
Wenn Knoten benachbart sindv die nicht besucht wurden, schieben Sie ein Paar (w,d+1) in die Warteschlange für jeden solchen Nachbarn w und markiert sie als besucht. Wenn es solche gibtw Leeren Sie die Sammlung der Elemente mit maximalem Abstand (falls sie nicht leer ist) und legen Sie sie fest max=d+1 .
Das Ergebnis ist eine Sammlung von Knoten, die mindestens alle voneinander entfernt sindmax von jedem Blatt.
Lassenn=|V| (beachten Sie, dass m=|E|=n−1 ). Angenommen, wir können die Warteschlange rechtzeitig mit den Blättern des Baumes füllenO(n) Indem wir alle Knoten des Graphen untersuchen und feststellen, dass die Scheitelpunkte Adjazenzlisten ihrer Nachbarn haben, "durchqueren" wir jede Kante zweimal, um die Nachbarn jedes Scheitelpunkts zu berücksichtigen. dann dauert dieser AlgorithmusO(n+m)=O(n) Zeit. Es funktioniert auch für Nicht-Bäume und nimmt wiederO(n+m) Zeit.
quelle
Führen Sie eine Breitensuche von allen Blättern parallel durch, dh besuchen Sie alle Nachbarn aller Blätter, dann ihre jeweiligen Nachbarn und so weiter. Der zuletzt besuchte Knoten ist Ihr Gewinner.
Wenn Sie zulassen, dass alle Suchvorgänge das
visited
Flag gemeinsam nutzen, wird kein Scheitelpunkt zweimal besucht. Da wir einen Baum haben, wird auch jeder Rand nur einmal besucht. Insgesamt erhalten wir eine lineare Laufzeit (in der Anzahl der Knoten).quelle