public static void MainTest(string[] args) { // create random DAG with V vertices and E edges; then add F random edges int V = int.Parse(args[0]); int E = int.Parse(args[1]); int F = int.Parse(args[2]); EdgeWeightedDigraph G = new EdgeWeightedDigraph(V); int[] vertices = new int[V]; for (int i = 0; i < V; i++) { vertices[i] = i; } StdRandom.Shuffle(vertices); for (int i = 0; i < E; i++) { int v, w; do { v = StdRandom.Uniform(V); w = StdRandom.Uniform(V); } while (v >= w); double weight = StdRandom.Uniform(); G.AddEdge(new DirectedEdge(v, w, weight)); } // add F extra edges for (int i = 0; i < F; i++) { int v = StdRandom.Uniform(V); int w = StdRandom.Uniform(V); double weight = StdRandom.Uniform(0.0, 1.0); G.AddEdge(new DirectedEdge(v, w, weight)); } Console.WriteLine(G); // find a directed cycle EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(G); if (finder.HasCycle) { Console.Write("Cycle: "); foreach (DirectedEdge e in finder.GetCycle()) { Console.Write(e + " "); } Console.WriteLine(); } // or give topologial sort else { Console.WriteLine("No directed cycle"); } }
/// <summary> /// Determines whether the edge-weighted digraph <c>G</c> has a topological /// order and, if so, finds such an order.</summary> /// <param name="G">the edge-weighted digraph</param> /// public Topological(EdgeWeightedDigraph G) { EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(G); if (!finder.HasCycle) { DepthFirstOrder dfs = new DepthFirstOrder(G); order = dfs.ReversePost(); } }
// by finding a cycle in predecessor graph private void findNegativeCycle() { int V = edgeTo.Length; EdgeWeightedDigraph spt = new EdgeWeightedDigraph(V); for (int v = 0; v < V; v++) { if (edgeTo[v] != null) { spt.AddEdge(edgeTo[v]); } } EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(spt); cycle = finder.GetCycle(); }
/// <summary> /// Returns a negative cycle, or <c>null</c> if there is no such cycle.</summary> /// <returns>a negative cycle as an iterable of edges, /// or <c>null</c> if there is no such cycle</returns> /// public IEnumerable <DirectedEdge> NegativeCycle() { for (int v = 0; v < distTo.Length; v++) { // negative cycle in v's predecessor graph if (distTo[v, v] < 0.0) { int V = edgeTo.Length; EdgeWeightedDigraph spt = new EdgeWeightedDigraph(V); for (int w = 0; w < V; w++) { if (edgeTo[v, w] != null) { spt.AddEdge(edgeTo[v, w]); } } EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(spt); Debug.Assert(finder.HasCycle); return(finder.GetCycle()); } } return(null); }