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");
            }
        }
Example #2
0
        /// <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();
            }
        }
Example #3
0
        // 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();
        }
Example #4
0
 /// <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);
 }