Beste Antwort
Eine stark verbundene Komponente (SCC) in einem gerichteten Diagramm ist entweder ein Zyklus oder ein einzelner Scheitelpunkt.
Wir wenden DFS auf das Diagramm an und verfolgen zwei Eigenschaften für jeden Knoten im erzeugten DFS-Baum: 1. Die Zeit (oder Reihenfolge) der ersten Entdeckung in DFS. ( sagen Sie p1) 2. Die Reihenfolge des ältesten Vorfahren, den es erreichen kann. (sagen Sie p2) Anfangs sind beide für jeden Knoten gleich. Während die erste Eigenschaft konstant bleibt, kann die zweite Eigenschaft während rekursiver DFS-Aufrufe aktualisiert und zum Auffinden von Hinterkanten für Vorfahren verwendet werden. Wenn für jeden Scheitelpunkt nach rekursiven DFS-Aufrufen aller benachbarten Scheitelpunkte beide gleich sind, ist dies entweder 1. Ein einzelner Scheitelpunkt, der nicht Teil eines Zyklus ist. ODER 2. Ein Teil eines Zyklus und damit alle seine Nachkommen (im erstellten DFS-Baum) können ihn erreichen (können seine Vorfahren nicht erreichen). Mit anderen Worten, wir können an diesem Knoten beginnen und an diesem enden. Im zweiten Fall können wir alle zu druckenden Nachkommen verfolgen.
Diese Animation hilft beim Verständnis der Erklärung (erste Ganzzahl ist p1, zweite ist p2):
@ Datei: Tarjans Algorithmus Animation.gif
Detaillierte Erklärung und C ++ – Implementierung: Tarjan „s Algorithmus zum Auffinden stark verbundener Komponenten – GeeksforGeeks
PS: Dieser Algorithmus ist dem Auffinden von Artikulationspunkten, Brücken und zweifach verbundenen Graphen sehr ähnlich. Wenn Sie diese zuerst lernen, erhalten Sie eine bessere Intuition für den Algorithmus. http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/
Antwort
Der Algorithmus verwendet einen gerichteten Graphen als Eingabe und erzeugt eine Partition der Eckpunkte des Graphen in die stark verbundenen Komponenten des Graphen. Jeder Scheitelpunkt des Diagramms erscheint in genau einer der stark verbundenen Komponenten. Jeder Scheitelpunkt, der sich nicht in einem gerichteten Zyklus befindet, bildet für sich genommen eine stark verbundene Komponente: zum Beispiel einen Scheitelpunkt, dessen In- oder Out-Grad 0 ist, oder einen beliebigen Scheitelpunkt eines azyklischen Graphen.
The Die Grundidee des Algorithmus ist folgende: Eine Tiefensuche beginnt an einem beliebigen Startknoten (und nachfolgende Tiefensuchen werden an allen Knoten durchgeführt, die noch nicht gefunden wurden). Wie bei der Tiefensuche üblich, besucht die Suche jeden Knoten des Diagramms genau einmal und lehnt es ab, jeden bereits erkundeten Knoten erneut zu besuchen. Somit ist die Sammlung von Suchbäumen ein übergreifender Wald des Graphen. Die stark verbundenen Komponenten werden als bestimmte Teilbäume dieser Gesamtstruktur wiederhergestellt. Die Wurzeln dieser Teilbäume werden als „Wurzeln“ der stark verbundenen Komponenten bezeichnet. Jeder Knoten einer stark verbundenen Komponente kann als Root dienen, wenn es sich um den ersten Knoten der Komponente handelt, der bei der Suche erkannt wird.