Пример #1
0
    private static void unitTest(Digraph G, String description) {
        StdOut.println(description);
        StdOut.println("-------------------------------------");
        StdOut.print(G);

        DirectedEulerianCycle euler = new DirectedEulerianCycle(G);

        StdOut.print("Eulerian cycle: ");
        if (euler.hasEulerianCycle()) {
            for (int v : euler.cycle()) {
                StdOut.print(v + " ");
            }
            StdOut.println();
        }
        else {
            StdOut.println("none");
        }
        StdOut.println();
    }
Пример #2
0
        public void Run()
        {
            const int v = 50;
            const int e = 100;

            // Eulerian cycle
            var g1 = DigraphGenerator.EulerianCycle(v, e);

            DirectedEulerianCycle.UnitTest(g1, "Eulerian cycle");
            Console.WriteLine("---------------------------------------------------------------");

            // Eulerian path
            var g2 = DigraphGenerator.EulerianPath(v, e);

            DirectedEulerianCycle.UnitTest(g2, "Eulerian path");
            Console.WriteLine("---------------------------------------------------------------");

            // empty digraph
            var g3 = new Digraph(v);

            DirectedEulerianCycle.UnitTest(g3, "empty digraph");
            Console.WriteLine("---------------------------------------------------------------");

            // self loop
            var g4 = new Digraph(v);
            var v4 = StdRandom.Uniform(v);

            g4.AddEdge(v4, v4);
            DirectedEulerianCycle.UnitTest(g4, "single self loop");
            Console.WriteLine("---------------------------------------------------------------");

            // union of two disjoint cycles
            var h1   = DigraphGenerator.EulerianCycle(v / 2, e / 2);
            var h2   = DigraphGenerator.EulerianCycle(v - v / 2, e - e / 2);
            var perm = new int[v];

            for (var i = 0; i < v; i++)
            {
                perm[i] = i;
            }
            StdRandom.Shuffle(perm);
            var g5 = new Digraph(v);

            for (var vi = 0; vi < h1.V; vi++)
            {
                foreach (int w in h1.Adj(vi))
                {
                    g5.AddEdge(perm[vi], perm[w]);
                }
            }
            for (var vi = 0; vi < h2.V; vi++)
            {
                foreach (int w in h2.Adj(vi))
                {
                    g5.AddEdge(perm[v / 2 + vi], perm[v / 2 + w]);
                }
            }
            DirectedEulerianCycle.UnitTest(g5, "Union of two disjoint cycles");
            Console.WriteLine("---------------------------------------------------------------");

            // random digraph
            var g6 = DigraphGenerator.Simple(v, e);

            DirectedEulerianCycle.UnitTest(g6, "simple digraph");
            Console.WriteLine("---------------------------------------------------------------");


            Console.ReadLine();
        }