Suchen Sie bei einem gegebenen Baum einen Scheitelpunkt, der den Mindestabstand zu einem Blatt maximiert


7

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?


3
Würden Sie nach dem Grafikzentrum suchen ? Wenn Sie einen Baum haben, ist das Zentrum immer ein einzelner Scheitelpunkt oder eine Kante. Es kann in linearer Zeit gefunden werden.
Juho

3
@Juho: Beachten Sie, dass die Exzentrizität bei der größte Abstand eines Knotens von . Das OP fragt nach dem Mindestabstand zu einem Blatt, der oft unterschiedlich ist. Es ist also nicht klar, dass das Diagrammzentrum, das sich mit Scheitelpunkten minimaler Exzentrizität befasst, das relevante Konzept ist. vv
Niel de Beaudrap

@NieldeBeaudrap Ja, das stimmt.
Juho

Antworten:


5

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:

    1. Pop ein Paar (v,d)aus der Warteschlange. Wennd=maxeinfügen v in einer Sammlung von Elementen mit maximalem Abstand.

    2. Wenn Knoten benachbart sind v die nicht besucht wurden, schieben Sie ein Paar (w,d+1) in die Warteschlange für jeden solchen Nachbarn wund 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 sind max von jedem Blatt.

Lassen n=|V| (beachten Sie, dass m=|E|=n1). 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.


4

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 visitedFlag 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).


Ups, du hast mich geschlagen!
Niel de Beaudrap
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.