Đây là một C# thực hiện việc phát hiện chu trình của tarjan.Trợ giúp phát hiện chu kỳ Tarjan C#
Thuật toán được tìm thấy ở đây: 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);
}
}
Lưu ý một DepGraph chỉ là một danh sách các Vertex. và Vertex có danh sách các Vertex khác đại diện cho các cạnh. Đồng thời chỉ mục và liên kết được khởi tạo thành -1
EDIT: Làm việc này ... Tôi vừa giải thích sai kết quả.
Tại sao nó là v.lowlink = Math.Min (v.lowlink, w.index) 'ngoài' v.lowlink = Math.Min (v.lowlink, w.lowlink) '? –
@LinMa Hoặc là về mặt kỹ thuật chính xác. –