一尘不染

Tarjan循环检测帮助C#

algorithm

这是tarjan循环检测的有效C#实现。

可在以下位置找到该算法: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);
            }

        }

注意DepGraph只是Vertex的列表。顶点具有代表边缘的其他顶点的列表。另外index和lowlink都初始化为-1

编辑:这正在工作…我只是误解了结果。


阅读 182

收藏
2020-07-28

共1个答案

一尘不染

上面的内容实际上是正确的,我不明白什么是强连接的组件。我期望函数返回一个空列表,其中包含强连接的组件,但它返回的是单个节点的列表。

我相信以上是可行的。如果需要,请随时使用!

2020-07-28