Вот рабочая реализация C # определения цикла tarjan.
Алгоритм находится здесь: http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
public class TarjanCycleDetect
{
private static List> StronglyConnectedComponents;
private static Stack S;
private static int index;
private static DepGraph dg;
public static List> DetectCycle(DepGraph g)
{
StronglyConnectedComponents = new List>();
index = 0;
S = new Stack();
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 scc = new List();
Vertex w;
do
{
w = S.Pop();
scc.Add(w);
} while (v != w);
StronglyConnectedComponents.Add(scc);
}
}
Обратите внимание, что DepGraph - это просто список вершин. и Vertex имеет список других Vertex, которые представляют ребра. Также index и lowlink инициализируются значением -1
EDIT: Это работает ... Я просто неверно истолковал результаты.