public Topological(EdgeWeightedDigraph G)
        {
            DirectedCycle cycleFinder = new DirectedCycle(G);

            if (!cycleFinder.HasCycle())
            {
                DepthFirstOrder dfs = new DepthFirstOrder(G);
                order = dfs.ReversePost();
            }
        }
        private Stack <int> order;  //顶点的拓扑排序
        public Topological(Digraph G)
        {
            DirectedCycle cycleFinder = new DirectedCycle(G);//用于判断有向图G是否有环

            if (!cycleFinder.HasCycle())
            {
                DepthFirstOrder dfs = new DepthFirstOrder(G);
                order = dfs.ReversePost();
            }
        }
Esempio n. 3
0
        private int count;     //强连通分量的数量
        public KosarajuSCC(Digraph G)
        {
            marked = new bool[G.VNumber()];
            id     = new int[G.VNumber()];
            //第一次深度优先,得到反向有向图顶点的逆后序排列
            DepthFirstOrder order = new DepthFirstOrder(G.Reverse());

            foreach (int s in order.ReversePost())
            {
                if (!marked[s])
                {
                    Dfs(G, s);//第二次深度优先搜索,得到有向图的强连通分量
                    count++;
                }
            }
        }