// 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; }