Der Zweck des grauen Knotens bei der Suche nach der Tiefe des Diagramms

18

In vielen Implementierungen der Tiefensuche, die ich gesehen habe (zum Beispiel: hier ), wurde der Code zwischen einem grauen Scheitelpunkt (entdeckt, aber nicht alle seine Nachbarn wurden besucht) und einem schwarzen Scheitelpunkt (entdeckt und alle seine Nachbarn wurden besucht) unterschieden. . Was ist der Zweck dieser Unterscheidung? Es scheint, dass der DFS-Algorithmus niemals einen besuchten Scheitelpunkt besucht, unabhängig davon, ob er grau oder schwarz ist.

user6805
quelle

Antworten:

25

Bei der Ausführung einer DFS befindet sich ein Knoten in einem von drei Zuständen - vor dem Besuch, während des rekursiven Besuchs seiner Nachkommen und nachdem alle Nachkommen besucht wurden (Rückkehr zu seinem übergeordneten Knoten, dh Nachbearbeitungsphase). Die drei Farben entsprechen jedem der drei Zustände. Einer der Gründe für die Erwähnung von Farben und Zeitpunkt des Besuchs und der Rückkehr besteht darin, diese Unterscheidungen zum besseren Verständnis ausdrücklich vorzunehmen.

Natürlich gibt es tatsächliche Verwendungen dieser Farben. Betrachten wir einen gerichteten Graphen . Angenommen, Sie möchten G auf das Vorhandensein von Zyklen prüfen . Wenn der betreffende Knoten in einem ungerichteten Diagramm einen schwarzen oder grauen Nachbarn hat, zeigt er einen Zyklus an (und das DFS besucht ihn nicht, wie Sie bereits erwähnt haben). Bei einem gerichteten Graphen bedeutet ein schwarzer Nachbar jedoch keinen Zyklus. Betrachten wir zum Beispiel ein Diagramm mit 3 Vertices - A , B , und C , mit gerichteten Kanten als A B , B C , A C . Angenommen, die DFS beginnt bei AGGA,B,CABBCACA, Dann Besuche , dann C . Wenn es zu A zurückgekehrt ist , prüft es, ob C bereits besucht wurde und schwarz ist. In der Grafik gibt es jedoch keinen Zyklus.BCAC

In einem gerichteten Graphen ist ein Zyklus nur dann vorhanden, wenn ein Knoten erneut gesehen wird, bevor alle seine Nachkommen besucht wurden. Mit anderen Worten, wenn ein Knoten einen Nachbarn hat, der grau ist, gibt es einen Zyklus (und nicht, wenn der Nachbar schwarz ist). Ein grauer Knoten bedeutet, dass wir derzeit seine Nachkommen untersuchen. Wenn ein solcher Nachkomme eine Kante zu diesem grauen Knoten hat, gibt es einen Zyklus. Für die Zykluserkennung in gerichteten Diagrammen sind 3 Farben erforderlich. Es könnte auch andere Beispiele geben, aber Sie sollten auf die Idee kommen.

Paresh
quelle
2
+1 gute Erklärung. Haben GRAU und SCHWARZ für die einfache Durchquerung aller Knoten in einem ungerichteten Graphen (wie einem in meinem Fragekörper verknüpften) keinen funktionalen Unterschied?
user6805
1
@ user6805 Beim einfachen Durchlaufen eines gerichteten oder ungerichteten Graphen an jedem Knoten gibt es keinen funktionalen Unterschied zwischen Grau und Schwarz. Sie können nur zwei Farben verwenden (oder besucht / nicht besucht). Für komplexere Algorithmen benötigen Sie Farben.
Paresh
Ich habe es verstanden! Betrachten Sie den folgenden Fall: twitter.com/MaksimADmitriev/status/796995958043279361 Wir durchlaufen die Diagramme mit DFS. Das Diagramm auf der linken Seite entspricht dem Diagramm aus dieser Antwort und hat keine Zyklen. Lassen Sie uns den Graphen auf der rechten Seite durchlaufen, der einen Zyklus hat. Wir besuchen A und markieren es grau. Wir besuchen B und markieren es grau. Wir besuchen C und markieren es grau. Jetzt besuchen wir A, das bereits grau ist. "Von Schwarz nach Schwarz" bedeutet also nicht, dass es einen Zyklus gibt, sondern "Von Grau nach Grau". Deshalb brauchen wir grau. Bitte korrigieren Sie mich, wenn ich falsch
liege
Für noch komplexere Zwecke, wie das Auffinden stark verbundener Komponenten, muss möglicherweise zweimal für jeden Knoten aufgezeichnet werden: vor dem ersten Auffinden eines Knotens (dh zu dem Zeitpunkt, zu dem er grau gefärbt ist) und nach dem Abschluss des Besuchs eines Knotens (dh die Zeit, in der es schwarz gefärbt ist). Zur Implementierung von Aufzeichnungen wird ein Zähler verwaltet, der bei jedem Ereignis erhöht wird.
Johannes,
2

Es ist eine Übung in CLRS, dass Sie die graue oder schwarze Farbe entfernen können, und der Algorithmus funktioniert gut mit nur zwei Farben, mit anderen Worten, es ist nicht wirklich erforderlich. Das Hauptziel beim Markieren von Scheitelpunkten besteht darin, sicherzustellen, dass wir nicht in eine Endlosschleife geraten, indem wir bereits besuchte Scheitelpunkte wiederholt besuchen.

Der Grund für die Verwendung von 3 Farben im DFS-Algorithmus ist hauptsächlich pädagogischer Natur: Er ist konzeptionell klarer und hilft den Schülern zu erkennen, was während der Ausführung für jeden Knoten vor sich geht.

Kaveh
quelle
0

Der graue Scheitelpunkt gibt an, dass Sie diesen Knoten besucht und in einer bestimmten Reihenfolge zu einem seiner Nachbarn übergegangen sind, dieser Knoten verfügt jedoch möglicherweise über mehrere benachbarte Scheitelpunkte. Dies ist hilfreich beim Zurückverfolgen, um nicht besuchte Scheitelpunkte zu erkunden.

Lassen Sie uns sagen Vertex A hat zwei Nachbarn B und C und B hat einen Nachbarn D .

Beginnen Sie bei Scheitelpunkt A, der weiß ist, und machen Sie ihn grau und bewegen Sie sich zu seinem Nachbarn.

Nehmen wir an, durch Auswahl der alphabetischen Reihenfolge wird der Scheitelpunkt B aufgerufen, der in weißer Farbe und als grau markiert ist.

Dann besucht D Weiß -> Grau D -> keine Nachbarn mehr. daher markiert D-> schwarz .

Nun zieht zurück nach B in Grau und nicht mehr nieghbors. Daher Markierungen B-> schwarz .

AGewinnen Sie die Rückspuren A in Grau und besuchen Sie die Markierung c, um c-> Grau markiert keine Nachbarn mehr C als schwarz

Schließlich kehren Sie zu A zurück und markieren den Scheitelpunkt A als schwarz, da es keine weißen Scheitelpunkte mehr gibt und alle als schwarz.

NRK
quelle
Ich verstehe hier nicht, ob die Unterscheidung zwischen Grau und Schwarz einen Sinn hat.
user6805
das musst du verstehen. Wenn ein Scheitelpunkt als schwarz markiert ist, bedeutet dies, dass zu diesem Scheitelpunkt keine benachbarten Scheitelpunkte vorhanden sind. Hier ist der Scheitelpunkt D schwarz markiert, da es keine Nachbarscheitelpunkte gibt. Wie grau andeutet, gibt es mehr Nachbarn, die besucht werden müssen, und Sie durchqueren diese.
NRK
Ich glaube, es erspart Ihnen den einfachen erneuten Besuch von Knoten, von denen Sie sicher wissen, dass sie keine Hinterkanten haben (dh Optimierung)
Setheron
0

In der DFS klassifizieren wir Kanten als Vorderkante, Hinterkante, Kreuzkante und Baumkante.

Wir verwenden 3 Farben, um die Kanten zu klassifizieren. und diese Farben stellen den Zustand des Scheitelpunkts dar, dh v. weiß: Der Scheitelpunkt v ist noch nicht entdeckt.

grey: v wurde bereits erkannt, aber alle von v aus erreichbaren Scheitelpunkte wurden noch nicht erkannt. Der Scheitelpunkt v befindet sich also noch im Stapel.

black: v ist bereits nicht mehr im Stapel. Ermittelt und fertig.

Wenn Sie bei der DFS auf einen grauen Scheitelpunkt durch Kante e stoßen, handelt es sich um eine Hinterkante. Wenn Sie durch Kante e auf einen schwarzen Scheitelpunkt stoßen, handelt es sich um eine Querkante / Vorderkante. Wenn Sie auf einen weißen Eckpunkt stoßen, rufen Sie DFS rekursiv auf.

Neeraj Singh
quelle
OK, aber worum geht es? Sie haben gesagt, dass Weiß / Grau / Schwarz mit Vorwärts / Rückwärts / Kreuz / Baum zusammenhängt, aber Sie sagen auch nicht, wofür diese Dinge bestimmt sind. Nun gibt es also sieben Dinge, die der Fragesteller nicht versteht, anstatt nur drei!
David Richerby
Diese Kanten können in verschiedenen Anwendungen von DFS verwendet werden, so wie Hinterkanten zum Identifizieren von Schleifen in einem Diagramm verwendet werden. Vorwärts- und Kreuzkanten werden verwendet, um zu testen, ob zwischen jedem Knotenpaar ein eindeutiger Pfad vorhanden ist.
Neeraj Singh