コード例 #1
0
        // check that algorithm computes either the topological order or finds a directed cycle
        private void dfs(EdgeWeightedDigraph G, int v)
        {
            // Console.Out.WriteLine(cost++);
            onStack[v] = true;
            marked[v] = true;
            foreach(DirectedEdge e in G.adj(v))
            {
            DirectedEdge resultEdge = e;
            int w = resultEdge.to();

            // short circuit if directed cycle found
            if (_cycle != null) return;

            //found new vertex, so recur
            else if (!marked[w]) {
                edgeTo[w] = resultEdge;
                dfs(G, w);
            }

            // trace back directed cycle
            else if (onStack[w]) {
                _cycle = new Stack<DirectedEdge>();
                while (e.from() != w) {
                    _cycle.Push(resultEdge);
                    resultEdge = edgeTo[e.from()];
                }
                _cycle.Push(resultEdge);
            }
            }

            onStack[v] = false;
        }