Tarjan cycle de détection de l'aide de C#
Ici est un travail C# de mise en œuvre de tarjan du cycle de détection.
L'algorithme se trouve ici:
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);
}
}
Note un DepGraph est juste une liste de Vertex. et Vertex a une liste d'autres Vertex qui représentent les bords. Aussi l'index et lowlink sont initialisé à -1
EDIT: Cela ne fonctionne pas...j'ai juste mal interprété les résultats.
- Pourquoi il est " v. lowlink = Math.Min(v. lowlink, w.index)` autre que
v.lowlink = Math.Min(v.lowlink, w.lowlink)
? - Soit est techniquement correcte.
Vous devez vous connecter pour publier un commentaire.
Ci-dessus est correcte, je n'ai pas compris ce qu'est une composante fortement connexe. Je m'attendais à la fonction de renvoyer une Liste vide de composantes fortement connexes, mais il était de retour d'une liste de nœuds simples.
Je crois que le ci-dessus est le travail. N'hésitez pas à utiliser si vous en avez besoin!
En 2008 quickgraph a pris en charge cet algorithme. Voir la
StronglyConnectedComponentsAlgorithm
classe pour la mise en œuvre, ouAlgorithmExtensions.StronglyConnectedComponents
méthode pour une utilisation raccourci.Exemple:
Exemple présenté ci-dessus en question n'est pas fonctionnel si quelqu'un veux jouer rapidement avec elle. Notez également qu'il est à pile, qui vont faire exploser votre tapis si vous donnez quelque chose, mais le plus trivial de graphiques. Voici un exemple de travail avec une unité de test de modèles, le graphique présenté à la Tarjan page wikipedia:
J'ai ajouté un Id de propriété au Sommet de l'objet de sorte qu'il est simple de voir ce qui est fait, il n'est pas strictement nécessaire. J'ai aussi nettoyé le code un peu, l'auteur a été à l'aide de nommage à partir de la page de pseudo-code, ce qui est bon pour la comparaison, mais il n'était pas très instructif.