예제 #1
0
        /**
         * Returns the reverse of the digraph.
         *
         * @return the reverse of the digraph
         */
        public Digraph <T> Reverse()
        {
            Digraph <T> reverse = new Digraph <T>();

            //foreach (T v in Vertices)
            //{
            //    _ = v.Clone();
            //}
            foreach (T v in Vertices)
            {
                foreach (T s in Successors(v))
                {
                    reverse.AddEdge(new DirectedEdge <T>(s, v));
                }
            }
            return(reverse);
        }
예제 #2
0
        private static void GraphFindAllPaths()
        {
            var graph = new Digraph();

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);
            graph.AddEdge(0, 3);
            graph.AddEdge(2, 0);
            graph.AddEdge(2, 1);
            graph.AddEdge(1, 3);

            var results = graph.FindAllPaths(2, 3);

            foreach (var path in results)
            {
                Console.WriteLine(string.Join(",", path));
            }
        }
예제 #3
0
        private static void TestGraph()
        {
            var graph = new Digraph();

            /*graph.AddEdge(5, 2);
             * graph.AddEdge(5, 0);
             * graph.AddEdge(4, 0);
             * graph.AddEdge(4, 1);
             * graph.AddEdge(2, 3);
             * graph.AddEdge(3, 1);
             *
             * var stack = graph.TopologicalSort();
             *
             * while (stack.Count > 0)
             * {
             *  Console.Write(stack.Pop() + " ");
             * }*/

            graph.AddEdge(0, 1);
            graph.AddEdge(0, 2);
            graph.AddEdge(1, 2);
            graph.AddEdge(2, 0);
            graph.AddEdge(2, 3);
            graph.AddEdge(3, 3);

            var result = graph.TransitiveClosure();

            for (var i = 0; i < result.GetLength(0); i++)
            {
                for (var j = 0; j < result.GetLength(1); j++)
                {
                    Console.Write(result[i, j] + " ");
                }
                Console.WriteLine();
            }
        }
예제 #4
0
        /**
         * Unit tests the {@code DepthFirstOrder} data type.
         *
         * @param args the command-line arguments
         */
        public static void Test()
        {
            string tiny            = $@"
13
22
 4  2
 2  3
 3  2
 6  0
 0  1
 2  0
11 12
12  9
 9 10
 9 11
 7  9
10 12
11  4
 4  3
 3  5
 6  8
 8  6
 5  4
 0  5
 6  4
 6  9
 7  6
";
            Digraph <IntWrapper> G = new Digraph <IntWrapper>(tiny, (string s) => new IntWrapper(int.Parse(s)));

            System.Console.Error.WriteLine(G);

            DepthFirstOrder <IntWrapper, DirectedEdge <IntWrapper> > dfs = new DepthFirstOrder <IntWrapper, DirectedEdge <IntWrapper> >(G);

            System.Console.WriteLine("   v  pre post");
            System.Console.WriteLine("--------------");
            foreach (IntWrapper v in G.Vertices)
            {
                System.Console.Write("{0} {1} {2}\n", v, dfs.Pre(v), dfs.Post(v));
            }

            System.Console.Write("Preorder:  ");
            foreach (IntWrapper v in dfs.Pre())
            {
                System.Console.Write(v + " ");
            }
            System.Console.WriteLine();

            System.Console.Write("Postorder: ");
            foreach (IntWrapper v in dfs.Post())
            {
                System.Console.Write(v + " ");
            }
            System.Console.WriteLine();

            System.Console.Write("Reverse postorder: ");
            foreach (IntWrapper v in dfs.ReversePost())
            {
                System.Console.Write(v + " ");
            }
            System.Console.WriteLine();
        }