Tarjan-Zykluserkennung hilft C #
Hier ist eine C# - Implementierung von tarjan Zyklus-Erkennung.
Der Algorithmus ist hier zu finden:
http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
public class TarjanCycleDetect
{
private static List<List<Vertex>> StronglyConnectedComponents;
private static Stack<Vertex> S;
private static int index;
private static DepGraph dg;
public static List<List<Vertex>> DetectCycle(DepGraph g)
{
StronglyConnectedComponents = new List<List<Vertex>>();
index = 0;
S = new Stack<Vertex>();
dg = g;
foreach (Vertex v in g.vertices)
{
if (v.index < 0)
{
strongconnect(v);
}
}
return StronglyConnectedComponents;
}
private static void strongconnect(Vertex v)
{
v.index = index;
v.lowlink = index;
index++;
S.Push(v);
foreach (Vertex w in v.dependencies)
{
if (w.index < 0)
{
strongconnect(w);
v.lowlink = Math.Min(v.lowlink, w.lowlink);
}
else if (S.Contains(w))
{
v.lowlink = Math.Min(v.lowlink, w.index);
}
}
if (v.lowlink == v.index)
{
List<Vertex> scc = new List<Vertex>();
Vertex w;
do
{
w = S.Pop();
scc.Add(w);
} while (v != w);
StronglyConnectedComponents.Add(scc);
}
}
Hinweis: eine DepGraph ist nur eine Liste von Vertex. und der Scheitelpunkt hat eine Liste von anderen Vertex repräsentieren die Kanten. Auch index-und lowlink initialisiert werden -1
EDIT: Das funktioniert...ich habe nur falsch interpretiert die Ergebnisse.
InformationsquelleAutor der Frage user623879 | 2011-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oben ist tatsächlich korrekt, habe ich nicht verstanden, was eine starke zusammenhangskomponente war. Ich hatte erwartet die Funktion eine leere Liste zurück von starken zusammenhangskomponenten, doch es wurde wieder eine Liste der einzelnen Knoten.
Glaube ich, dass die oben genannten arbeiten. Fühlen Sie sich frei zu verwenden, wenn Sie es brauchen!
InformationsquelleAutor der Antwort user623879
2008 quickgraph unterstützt dieses Algorithmus. Finden Sie die
StronglyConnectedComponentsAlgorithm
- Klasse für die Implementierung, oderAlgorithmExtensions.StronglyConnectedComponents
Methode für eine Nutzung Verknüpfung.Beispiel:
InformationsquelleAutor der Antwort JohannesH
Oben dargestellten Beispiel in der Frage nicht funktionsfähig ist, sollte jemand wollen, um schnell zu spielen. Beachten Sie auch, dass es ist stack-basiert, das wird explodieren und dein stack, wenn Sie alles geben, aber der trivialste von Graphen. Hier ist ein funktionierendes Beispiel mit einem unit-test, dass die Modelle die Grafik präsentiert auf der Tarjan wikipedia-Seite:
Ich habe eine Id-Eigenschaft, um die Vertex-Objekt, so ist es einfach zu sehen, was getan wird, es ist nicht unbedingt erforderlich. Ich auch gereinigt einige der code ein wenig, die Autorin war mit der Benennung von Seite pseudo-code, das ist gut für den Vergleich, aber es war nicht sehr informativ.
InformationsquelleAutor der Antwort Roger Hill