コード例 #1
0
        public void BreadthFirstPathsTest1()
        {
            Graph             g = TestHelpers.buildGraph();
            BreadthFirstPaths bfps;

            bfps = new BreadthFirstPaths(g, 0);

            Assert.AreEqual(0, bfps.DistTo(0));
            Assert.AreEqual(1, bfps.DistTo(1));
            Assert.AreEqual(3, bfps.DistTo(4));

            Assert.AreEqual(int.MaxValue, bfps.DistTo(10));
            Assert.AreEqual(int.MaxValue, bfps.DistTo(12));
            Assert.AreEqual(int.MaxValue, bfps.DistTo(5));

            bfps = new BreadthFirstPaths(g, 10);
            Assert.IsTrue(bfps.HasPathTo(11));
            Assert.AreEqual(1, bfps.DistTo(11));

            bfps = new BreadthFirstPaths(g, 12);
            Assert.AreEqual(2, bfps.DistTo(15));

            Assert.IsFalse(bfps.HasPathTo(11));
            Assert.IsFalse(bfps.HasPathTo(3));
            Assert.IsFalse(bfps.HasPathTo(9));
        }
コード例 #2
0
        public static void DoTest()
        {
            IGraph<string> graph = new UndirectedSparseGraph<string>();

            // Add vertices
            var verticesSet1 = new string[] { "a", "z", "s", "x", "d", "c", "f", "v", "w", "m" };
            graph.AddVertices (verticesSet1);

            // Add edges
            graph.AddEdge("a", "s");
            graph.AddEdge("a", "z");
            graph.AddEdge("s", "x");
            graph.AddEdge("x", "d");
            graph.AddEdge("x", "c");
            graph.AddEdge("x", "w");
            graph.AddEdge("x", "m");
            graph.AddEdge("d", "f");
            graph.AddEdge("d", "c");
            graph.AddEdge("c", "f");
            graph.AddEdge("c", "v");
            graph.AddEdge("v", "f");
            graph.AddEdge("w", "m");

            var sourceNode = "f";
            var bfsPaths = new BreadthFirstPaths<string> (graph, sourceNode);

            Console.WriteLine ("Distance from '" + sourceNode + "' to 'a' is: " + bfsPaths.DistanceTo ("a"));
            Console.WriteLine ("Path from '" + sourceNode + "' to 'a' is : " + printPath(bfsPaths.ShortestPathTo("a")));

            Console.WriteLine ();

            Console.WriteLine ("Distance from '" + sourceNode + "' to 'w' is: " + bfsPaths.DistanceTo ("w"));
            Console.WriteLine ("Path from '" + sourceNode + "' to 'w' is : " + printPath(bfsPaths.ShortestPathTo("w")));
        }
コード例 #3
0
        public static void DoTest()
        {
            IGraph <string> graph = new UndirectedSparseGraph <string>();

            // Add vertices
            var verticesSet1 = new string[] { "a", "z", "s", "x", "d", "c", "f", "v", "w", "m" };

            graph.AddVertices(verticesSet1);

            // Add edges
            graph.AddEdge("a", "s");
            graph.AddEdge("a", "z");
            graph.AddEdge("s", "x");
            graph.AddEdge("x", "d");
            graph.AddEdge("x", "c");
            graph.AddEdge("x", "w");
            graph.AddEdge("x", "m");
            graph.AddEdge("d", "f");
            graph.AddEdge("d", "c");
            graph.AddEdge("c", "f");
            graph.AddEdge("c", "v");
            graph.AddEdge("v", "f");
            graph.AddEdge("w", "m");

            var sourceNode = "f";
            var bfsPaths   = new BreadthFirstPaths <string> (graph, sourceNode);

            Console.WriteLine("Distance from '" + sourceNode + "' to 'a' is: " + bfsPaths.DistanceTo("a"));
            Console.WriteLine("Path from '" + sourceNode + "' to 'a' is : " + printPath(bfsPaths.ShortestPathTo("a")));

            Console.WriteLine();

            Console.WriteLine("Distance from '" + sourceNode + "' to 'w' is: " + bfsPaths.DistanceTo("w"));
            Console.WriteLine("Path from '" + sourceNode + "' to 'w' is : " + printPath(bfsPaths.ShortestPathTo("w")));
        }
コード例 #4
0
    static void Main(String[] args)
    {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution */
        int n = Convert.ToInt32(Console.ReadLine());

        for (int i = 0; i < n; i++)
        {
            string   str = Console.ReadLine();
            string[] num = str.Split(' ');
            Graph    g   = new Graph(Convert.ToInt32(num[0]));
            int      e   = Convert.ToInt32(num[1]);
            for (int j = 0; j < e; j++)
            {
                str = Console.ReadLine();
                num = str.Split(' ');
                g.addEdge(Convert.ToInt32(num[0]) - 1, Convert.ToInt32(num[1]) - 1);
            }
            int s = Convert.ToInt32(Console.ReadLine()) - 1;
            //Console.WriteLine("F**k {0}", s);
            BreadthFirstPaths bfs = new BreadthFirstPaths(g, s);

            for (int j = 0; j < g.V(); j++)
            {
                if (bfs.hasPath(j) && j != s)
                {
                    Console.Write("{0} ", bfs.DistTo(j) * 6);
                }
                else if (!bfs.hasPath(j) && j != s)
                {
                    Console.Write("{0} ", -1);
                }
            }
            Console.WriteLine();
        }
    }
コード例 #5
0
    /**************************************************************************
     *
     *  The code below is solely for testing correctness of the data type.
     *
     **************************************************************************/

    // Determines whether a digraph has an Eulerian path using necessary
    // and sufficient conditions (without computing the path itself):
    //    - indegree(v) = outdegree(v) for every vertex,
    //      except one vertex v may have outdegree(v) = indegree(v) + 1
    //      (and one vertex v may have indegree(v) = outdegree(v) + 1)
    //    - the graph is connected, when viewed as an undirected graph
    //      (ignoring isolated vertices)
    private static boolean satisfiesNecessaryAndSufficientConditions(Digraph G) {
        if (G.E() == 0) return true;

        // Condition 1: indegree(v) == outdegree(v) for every vertex,
        // except one vertex may have outdegree(v) = indegree(v) + 1
        int deficit = 0;
        for (int v = 0; v < G.V(); v++)
            if (G.outdegree(v) > G.indegree(v))
                deficit += (G.outdegree(v) - G.indegree(v));
        if (deficit > 1) return false;

        // Condition 2: graph is connected, ignoring isolated vertices
        Graph H = new Graph(G.V());
        for (int v = 0; v < G.V(); v++)
            for (int w : G.adj(v))
                H.addEdge(v, w);
        
        // check that all non-isolated vertices are connected
        int s = nonIsolatedVertex(G);
        BreadthFirstPaths bfs = new BreadthFirstPaths(H, s);
        for (int v = 0; v < G.V(); v++)
            if (H.degree(v) > 0 && !bfs.hasPathTo(v))
                return false;

        return true;
    }
コード例 #6
0
        public void bfsTest()
        {
            using (StreamReader sr = new StreamReader(@"E:\Study\ALG2017\ALGRKC\dataSelf\tinyCG.txt"))
            {
                Graph             g      = new Graph(sr);
                int               source = 0;
                BreadthFirstPaths bfp    = new BreadthFirstPaths(g, source);
                bfp.bfs(g, source);

                for (int i = 0; i < g.V(); i++)
                {
                    Console.Write(source + " to " + i + " : ");
                    if (bfp.HasPathTo(i))
                    {
                        foreach (int v in bfp.PathTo(i))
                        {
                            if (v == source)
                            {
                                Console.Write(source);
                            }
                            else
                            {
                                Console.Write("-" + v);
                            }
                        }
                        Console.WriteLine();
                    }
                    else
                    {
                        Console.WriteLine("no path");
                    }
                }
            }
        }
コード例 #7
0
ファイル: BreadthFirstPaths.cs プロジェクト: kismy/Algorithms
    void Start()
    {
        Graph G = new Graph(txt);

        int s = 0;
        BreadthFirstPaths bfs = new BreadthFirstPaths(G, s);

        for (int v = 0; v < G.V(); v++)
        {
            if (bfs.hasPathTo(v))
            {
                //print("%d to %d (%d):  ", s, v, bfs.DistTo(v));
                string str = s + " to " + v + "\tdistance:" + bfs.DistTo(v) + "\t.\t";
                foreach (int x in bfs.pathTo(v))
                {
                    if (x == s)
                    {
                        str += x;
                    }
                    else
                    {
                        str += ("-" + x);
                    }
                }
                print(str);
            }

            else
            {
                print(s + " to " + v + ":  not connected\n");
            }
        }
    }
コード例 #8
0
ファイル: Program.cs プロジェクト: nandehutuzn/Algorithm
        static void Main(string[] args)
        {
            Graph g = GetGraph();

            int[] paths;
            Paths path;

            path  = new DepthFirstPaths(g, 0);
            paths = path.PathTo(4);

            path  = new BreadthFirstPaths(g, 0);
            paths = path.PathTo(4);

            Console.ReadKey();
        }
コード例 #9
0
        public void BFS_Test()
        {
            BreadthFirstPaths BFS = new BreadthFirstPaths(basicGraph, 0);

            Assert.IsTrue(BFS.HasPathTo(3));
            Assert.IsFalse(BFS.HasPathTo(8));
            var path = BFS.PathTo(7);
            var SB   = new StringBuilder();

            foreach (int v in path)
            {
                SB.Append(v.ToString());
            }
            Assert.AreEqual("027", SB.ToString());
        }
コード例 #10
0
ファイル: Graph.cs プロジェクト: FuGangqiang/algorithms
        public void BreadthFirstPathsTest()
        {
            var g   = GraphSample();
            var bfs = new BreadthFirstPaths(g, 0);

            Assert.True(bfs.HasPathTo(5));
            var path = bfs.PathTo(5);

            int[] result = { 5, 0 };
            int   i      = 0;

            foreach (int v in path)
            {
                Assert.Equal(result[i], v);
                i++;
            }
        }
コード例 #11
0
        public void TestCase1()
        {
            var g = new Graph(6);

            g.AddEdge(0, 5);
            g.AddEdge(2, 4);
            g.AddEdge(2, 3);
            g.AddEdge(1, 2);
            g.AddEdge(0, 1);
            g.AddEdge(3, 4);
            g.AddEdge(3, 5);
            g.AddEdge(0, 2);
            var bfsPaths = new BreadthFirstPaths(g, 0);
            var expected = new int[] { 0, 2, 4 };
            var actual   = bfsPaths.PathTo(4).ToArray();

            Assert.Equal(expected, actual);
        }
コード例 #12
0
    /**/ public static void main(string[] strarr)
    {
        string      str         = strarr[0];
        string      str2        = strarr[1];
        string      str3        = strarr[2];
        SymbolGraph symbolGraph = new SymbolGraph(str, str2);
        Graph       g           = symbolGraph.G();

        if (!symbolGraph.contains(str3))
        {
            StdOut.println(new StringBuilder().append(str3).append(" not in database.").toString());
            return;
        }
        int i = symbolGraph.index(str3);
        BreadthFirstPaths breadthFirstPaths = new BreadthFirstPaths(g, i);

        while (!StdIn.isEmpty())
        {
            string str4 = StdIn.readLine();
            if (symbolGraph.contains(str4))
            {
                int i2 = symbolGraph.index(str4);
                if (breadthFirstPaths.hasPathTo(i2))
                {
                    Iterator iterator = breadthFirstPaths.pathTo(i2).iterator();
                    while (iterator.hasNext())
                    {
                        int i3 = ((Integer)iterator.next()).intValue();
                        StdOut.println(new StringBuilder().append("   ").append(symbolGraph.name(i3)).toString());
                    }
                }
                else
                {
                    StdOut.println("Not connected");
                }
            }
            else
            {
                StdOut.println("   Not in database.");
            }
        }
    }
コード例 #13
0
    /**/ public static void main(string[] strarr)
    {
        In                i                 = new In(strarr[0]);
        Graph             graph             = new Graph(i);
        int               num               = Integer.parseInt(strarr[1]);
        BreadthFirstPaths breadthFirstPaths = new BreadthFirstPaths(graph, num);

        for (int j = 0; j < graph.V(); j++)
        {
            if (breadthFirstPaths.hasPathTo(j))
            {
                StdOut.printf("%d to %d (%d):  ", new object[]
                {
                    Integer.valueOf(num),
                    Integer.valueOf(j),
                    Integer.valueOf(breadthFirstPaths.distTo(j))
                });
                Iterator iterator = breadthFirstPaths.pathTo(j).iterator();
                while (iterator.hasNext())
                {
                    int num2 = ((Integer)iterator.next()).intValue();
                    if (num2 == num)
                    {
                        StdOut.print(num2);
                    }
                    else
                    {
                        StdOut.print(new StringBuilder().append("-").append(num2).toString());
                    }
                }
                StdOut.println();
            }
            else
            {
                StdOut.printf("%d to %d (-):  not connected\n", new object[]
                {
                    Integer.valueOf(num),
                    Integer.valueOf(j)
                });
            }
        }
    }
コード例 #14
0
        public void BFS_MultiSource_Test()
        {
            var sources = new HashSet <int>()
            {
                0, 3
            };
            BreadthFirstPaths BFS = new BreadthFirstPaths(basicGraph, sources);

            Assert.IsTrue(BFS.HasPathTo(3));
            Assert.IsFalse(BFS.HasPathTo(8));
            var path = BFS.PathTo(7);
            var SB   = new StringBuilder();

            foreach (int v in path)
            {
                SB.Append(v.ToString());
            }
            Assert.AreEqual("027", SB.ToString());
            Stack <int> path4 = (Stack <int>)BFS.PathTo(4); //We know that returned type is an stack

            Assert.AreEqual(3, path4.Pop());
        }
コード例 #15
0
    void Start()
    {
        string      source = "JFK";
        SymbolGraph sg     = new SymbolGraph(txt);
        Graph       G      = sg.Graph();

        if (!sg.Contains(source))
        {
            print(source + " not in database.");
            return;
        }

        int s = sg.IndexOf(source);
        BreadthFirstPaths bfs = new BreadthFirstPaths(G, s);

        string sink = "DFW";

        if (sg.Contains(sink))
        {
            int t = sg.IndexOf(sink);
            if (bfs.hasPathTo(t))
            {
                foreach (int v in bfs.pathTo(t))
                {
                    print("   " + sg.NameOf(v));
                }
            }
            else
            {
                print("Not connected");
            }
        }
        else
        {
            print("   Not in database.");
        }
    }
コード例 #16
0
    private static void SeverLink(Graph graph, int skyNetLocation)
    {
        var bfp          = new BreadthFirstPaths(graph, skyNetLocation);
        var shortestExit = -1;
        var exitLength   = Int32.MaxValue;

        foreach (var exit in graph.Exits)
        {
            if (bfp.HasPathTo(exit))
            {
                var currLen = bfp.PathTo(exit).Count();
                if (currLen < exitLength)
                {
                    exitLength   = currLen;
                    shortestExit = exit;
                }
            }
        }

        var targetNode = bfp.PathTo(shortestExit).Skip(1).First();

        graph.RemoveEdge(skyNetLocation, targetNode);
        Console.WriteLine("{0} {1}", skyNetLocation, targetNode);
    }
コード例 #17
0
        public void Testing()
        {
            var graph = new UndirectedGraph(13);

            graph.InsertEdge(0, 5);
            graph.InsertEdge(4, 3);
            graph.InsertEdge(0, 1);
            graph.InsertEdge(9, 12);
            graph.InsertEdge(6, 4);
            graph.InsertEdge(5, 4);
            graph.InsertEdge(0, 2);
            graph.InsertEdge(11, 12);
            graph.InsertEdge(9, 10);
            graph.InsertEdge(0, 6);
            graph.InsertEdge(7, 8);
            graph.InsertEdge(9, 11);
            graph.InsertEdge(5, 3);

            var degree    = graph.VertexDegree(5);
            var maxDegree = graph.GraphMaxVertexDegree();
            var avgDegree = graph.GraphAverageVertexDegree();
            var selfLoops = graph.GraphNumberOfSelfLoops();

            var graph2 = new UndirectedGraph(6);

            graph2.InsertEdge(0, 5);
            graph2.InsertEdge(2, 4);
            graph2.InsertEdge(2, 3);
            graph2.InsertEdge(1, 2);
            graph2.InsertEdge(0, 1);
            graph2.InsertEdge(3, 4);
            graph2.InsertEdge(3, 5);
            graph2.InsertEdge(0, 2);

            var depthFirstSearch      = new DepthFirstSearch(graph2, 0);
            var depthFirstSearchCount = depthFirstSearch.Count();

            var depthFirstSearchTest0 = depthFirstSearch.Marked(0);
            var depthFirstSearchTest1 = depthFirstSearch.Marked(1);
            var depthFirstSearchTest2 = depthFirstSearch.Marked(2);
            var depthFirstSearchTest3 = depthFirstSearch.Marked(3);
            var depthFirstSearchTest4 = depthFirstSearch.Marked(4);
            var depthFirstSearchTest5 = depthFirstSearch.Marked(5);

            var depthFirstSearchNonRecursive      = new DepthFirstSearchNonRecursive(graph2, 0);
            var depthFirstSearchNonRecursiveCount = depthFirstSearchNonRecursive.Count();

            var depthFirstSearchNonRecursiveTest0 = depthFirstSearchNonRecursive.Marked(0);
            var depthFirstSearchNonRecursiveTest1 = depthFirstSearchNonRecursive.Marked(1);
            var depthFirstSearchNonRecursiveTest2 = depthFirstSearchNonRecursive.Marked(2);
            var depthFirstSearchNonRecursiveTest3 = depthFirstSearchNonRecursive.Marked(3);
            var depthFirstSearchNonRecursiveTest4 = depthFirstSearchNonRecursive.Marked(4);
            var depthFirstSearchNonRecursiveTest5 = depthFirstSearchNonRecursive.Marked(5);

            var depthFirstSearchTestConnected = depthFirstSearchCount == graph2.Vertices ? "Connected" : "NOT Connected";

            var depthFirstPath     = new DepthFirstPaths(graph2, 0);
            var depthFirstPathTest = depthFirstPath.PathTo(4);

            var breadthFirstSearch      = new BreadthFirstSearch(graph2, 0);
            var breadthFirstSearchCount = breadthFirstSearch.Count();

            var breadthFirstSearchTest0 = breadthFirstSearch.Marked(0);
            var breadthFirstSearchTest1 = breadthFirstSearch.Marked(1);
            var breadthFirstSearchTest2 = breadthFirstSearch.Marked(2);
            var breadthFirstSearchTest3 = breadthFirstSearch.Marked(3);
            var breadthFirstSearchTest4 = breadthFirstSearch.Marked(4);
            var breadthFirstSearchTest5 = breadthFirstSearch.Marked(5);

            var breadthFirstSearchTestConnected = breadthFirstSearchCount == graph2.Vertices ? "Connected" : "NOT Connected";

            var breadthFirstPath     = new BreadthFirstPaths(graph2, 0);
            var breadthFirstPathTest = breadthFirstPath.PathTo(4);

            var depthFirstComponents = new DepthFirstComponents(graph);

            var depthFirstComponentsTest0 = depthFirstComponents.IsConnected(0, 7);
            var depthFirstComponentsTest1 = depthFirstComponents.IsConnected(0, 6);
            var depthFirstComponentsTest2 = depthFirstComponents.IsConnected(7, 9);
            var depthFirstComponentsTest3 = depthFirstComponents.IsConnected(7, 8);
            var depthFirstComponentsTest4 = depthFirstComponents.IsConnected(9, 0);
            var depthFirstComponentsTest5 = depthFirstComponents.IsConnected(9, 12);

            var depthFirstCycle     = new DepthFirstCycle(graph);
            var depthFirstCycleTest = depthFirstCycle.HasCycle();

            var depthFirstBipartite     = new DepthFirstBipartite(graph);
            var depthFirstBipartiteTest = depthFirstBipartite.IsBipartite();

            var symbolGraph = new SymbolGraph();

            symbolGraph.Insert(new [] { "JFK", "MCO" });
            symbolGraph.Insert(new[] { "ORD", "DEN" });
            symbolGraph.Insert(new[] { "ORD", "HOU" });
            symbolGraph.Insert(new[] { "DFW", "PHX" });
            symbolGraph.Insert(new[] { "JFK", "ATL" });
            symbolGraph.Insert(new[] { "ORD", "DFW" });
            symbolGraph.Insert(new[] { "ORD", "PHX" });
            symbolGraph.Insert(new[] { "ATL", "HOU" });
            symbolGraph.Insert(new[] { "DEN", "PHX" });
            symbolGraph.Insert(new[] { "PHX", "LAX" });
            symbolGraph.Insert(new[] { "JFK", "ORD" });
            symbolGraph.Insert(new[] { "DEN", "LAS" });
            symbolGraph.Insert(new[] { "DFW", "HOU" });
            symbolGraph.Insert(new[] { "ORD", "ATL" });
            symbolGraph.Insert(new[] { "LAS", "LAX" });
            symbolGraph.Insert(new[] { "ATL", "MCO" });
            symbolGraph.Insert(new[] { "HOU", "MCO" });
            symbolGraph.Insert(new[] { "LAS", "PHX" });

            symbolGraph.Build();

            var symbolGraphTest0 = symbolGraph.Contains("LAS");
            var symbolGraphTest1 = symbolGraph.Contains("MOO");
            var symbolGraphTest2 = symbolGraph.Index("LAX");
            var symbolGraphTest3 = symbolGraph.Name(symbolGraphTest2);

            var symbolGraph2 = new SymbolGraphDegreesOfSeparation();

            symbolGraph2.Insert(new[] { "JFK", "MCO" });
            symbolGraph2.Insert(new[] { "ORD", "DEN" });
            symbolGraph2.Insert(new[] { "ORD", "HOU" });
            symbolGraph2.Insert(new[] { "DFW", "PHX" });
            symbolGraph2.Insert(new[] { "JFK", "ATL" });
            symbolGraph2.Insert(new[] { "ORD", "DFW" });
            symbolGraph2.Insert(new[] { "ORD", "PHX" });
            symbolGraph2.Insert(new[] { "ATL", "HOU" });
            symbolGraph2.Insert(new[] { "DEN", "PHX" });
            symbolGraph2.Insert(new[] { "PHX", "LAX" });
            symbolGraph2.Insert(new[] { "JFK", "ORD" });
            symbolGraph2.Insert(new[] { "DEN", "LAS" });
            symbolGraph2.Insert(new[] { "DFW", "HOU" });
            symbolGraph2.Insert(new[] { "ORD", "ATL" });
            symbolGraph2.Insert(new[] { "LAS", "LAX" });
            symbolGraph2.Insert(new[] { "ATL", "MCO" });
            symbolGraph2.Insert(new[] { "HOU", "MCO" });
            symbolGraph2.Insert(new[] { "LAS", "PHX" });
            symbolGraph2.Insert(new[] { "ZZZ", "YYY" });

            symbolGraph2.Build();

            var symbolGraph2Test0 = symbolGraph2.IsConnected("JFK", "LAS");
            var symbolGraph2Test1 = symbolGraph2.IsConnected("JFK", "DFW");
            var symbolGraph2Test2 = symbolGraph2.IsConnected("HOU", "YYY");
        }
コード例 #18
0
        public void Testing()
        {
            var graph = new DirectedGraph(13);

            graph.InsertEdge(4, 2);
            graph.InsertEdge(2, 3);
            graph.InsertEdge(3, 2);
            graph.InsertEdge(6, 0);
            graph.InsertEdge(0, 1);
            graph.InsertEdge(2, 0);
            graph.InsertEdge(11, 12);
            graph.InsertEdge(12, 9);
            graph.InsertEdge(9, 10);
            graph.InsertEdge(9, 11);
            graph.InsertEdge(8, 9);
            graph.InsertEdge(10, 12);
            graph.InsertEdge(11, 4);
            graph.InsertEdge(4, 3);
            graph.InsertEdge(3, 5);
            graph.InsertEdge(7, 8);
            graph.InsertEdge(8, 7);
            graph.InsertEdge(5, 4);
            graph.InsertEdge(0, 5);
            graph.InsertEdge(6, 4);
            graph.InsertEdge(6, 9);
            graph.InsertEdge(7, 6);

            var vertexOutDegree = graph.VertexOutDegree(6);
            var vertexInDegre   = graph.VertexInDegree(6);
            var graphReveresed  = graph.Reverse();

            var depthFirstSearch      = new DepthFirstSearch(graph, 0);
            var depthFirstSearchCount = depthFirstSearch.Count();

            var depthFirstSearchTest0 = depthFirstSearch.Marked(0);
            var depthFirstSearchTest1 = depthFirstSearch.Marked(1);
            var depthFirstSearchTest2 = depthFirstSearch.Marked(2);
            var depthFirstSearchTest3 = depthFirstSearch.Marked(3);
            var depthFirstSearchTest4 = depthFirstSearch.Marked(4);
            var depthFirstSearchTest5 = depthFirstSearch.Marked(5);
            var depthFirstSearchTest6 = depthFirstSearch.Marked(6);

            var depthFirstSearchTestConnected = depthFirstSearchCount == graph.Vertices ? "Connected" : "NOT Connected";

            var depthFirstPath     = new DepthFirstPaths(graph, 0);
            var depthFirstPathTest = depthFirstPath.PathTo(2);

            var breadthFirstSearch      = new BreadthFirstSearch(graph, 0);
            var breadthFirstSearchCount = breadthFirstSearch.Count();

            var breadthFirstSearchTest0 = breadthFirstSearch.Marked(0);
            var breadthFirstSearchTest1 = breadthFirstSearch.Marked(1);
            var breadthFirstSearchTest2 = breadthFirstSearch.Marked(2);
            var breadthFirstSearchTest3 = breadthFirstSearch.Marked(3);
            var breadthFirstSearchTest4 = breadthFirstSearch.Marked(4);
            var breadthFirstSearchTest5 = breadthFirstSearch.Marked(5);
            var breadthFirstSearchTest6 = breadthFirstSearch.Marked(6);

            var breadthFirstSearchTestConnected = breadthFirstSearchCount == graph.Vertices ? "Connected" : "NOT Connected";

            var breadthFirstPath     = new BreadthFirstPaths(graph, 0);
            var breadthFirstPathTest = breadthFirstPath.PathTo(2);

            var depthFirstCycle      = new DepthFirstCycle(graph);
            var depthFirstCycleTest0 = depthFirstCycle.HasCycle();
            var depthFirstCycleTest1 = depthFirstCycle.Cycle();

            var graph2 = new DirectedGraph(13);

            graph2.InsertEdge(2, 3);
            graph2.InsertEdge(0, 6);
            graph2.InsertEdge(0, 1);
            graph2.InsertEdge(2, 0);
            graph2.InsertEdge(11, 12);
            graph2.InsertEdge(9, 12);
            graph2.InsertEdge(9, 10);
            graph2.InsertEdge(9, 11);
            graph2.InsertEdge(3, 5);
            graph2.InsertEdge(8, 7);
            graph2.InsertEdge(5, 4);
            graph2.InsertEdge(0, 5);
            graph2.InsertEdge(6, 4);
            graph2.InsertEdge(6, 9);
            graph2.InsertEdge(7, 6);

            var depthFirstCycle2      = new DepthFirstCycle(graph2);
            var depthFirstCycle2Test0 = depthFirstCycle2.HasCycle();
            var depthFirstCycle2Test1 = depthFirstCycle2.Cycle();

            var depthFirstOrder = new DepthFirstOrder(graph2);

            var depthFirstOrderTest0 = depthFirstOrder.PreOrder();
            var depthFirstOrderTest1 = depthFirstOrder.PostOrder();
            var depthFirstOrderTest2 = depthFirstOrder.ReversePostOrder();

            var symbolGraph = new SymbolGraph();

            symbolGraph.Insert(new[] { "JFK", "MCO" });
            symbolGraph.Insert(new[] { "ORD", "DEN" });
            symbolGraph.Insert(new[] { "ORD", "HOU" });
            symbolGraph.Insert(new[] { "DFW", "PHX" });
            symbolGraph.Insert(new[] { "JFK", "ATL" });
            symbolGraph.Insert(new[] { "ORD", "DFW" });
            symbolGraph.Insert(new[] { "ORD", "PHX" });
            symbolGraph.Insert(new[] { "ATL", "HOU" });
            symbolGraph.Insert(new[] { "DEN", "PHX" });
            symbolGraph.Insert(new[] { "PHX", "LAX" });
            symbolGraph.Insert(new[] { "JFK", "ORD" });
            symbolGraph.Insert(new[] { "DEN", "LAS" });
            symbolGraph.Insert(new[] { "DFW", "HOU" });
            symbolGraph.Insert(new[] { "ORD", "ATL" });
            symbolGraph.Insert(new[] { "LAS", "LAX" });
            symbolGraph.Insert(new[] { "ATL", "MCO" });
            symbolGraph.Insert(new[] { "HOU", "MCO" });
            symbolGraph.Insert(new[] { "LAS", "PHX" });

            symbolGraph.Build();

            var symbolGraphTest0 = symbolGraph.Contains("LAS");
            var symbolGraphTest1 = symbolGraph.Contains("MOO");
            var symbolGraphTest2 = symbolGraph.Index("LAX");
            var symbolGraphTest3 = symbolGraph.Name(symbolGraphTest2);

            var symbolGraph2 = new SymbolGraph();

            symbolGraph2.Insert(new[] { "Algorithms", "Theoretical CS", "Databases", "Scientific Computing" });
            symbolGraph2.Insert(new[] { "Introduction to CS", "Advanced Programming", "Algorithms" });
            symbolGraph2.Insert(new[] { "Advanced Programming", "Scientific Computing" });
            symbolGraph2.Insert(new[] { "Scientific Computing", "Computational Biology" });
            symbolGraph2.Insert(new[] { "Theoretical CS", "Computational Biology", "Artificial Intelligence" });
            symbolGraph2.Insert(new[] { "Linear Algebra", "Theoretical CS" });
            symbolGraph2.Insert(new[] { "Calculus", "Linear Algebra" });
            symbolGraph2.Insert(new[] { "Artificial Intelligence", "Neural Networks", "Robotics", "Machine Learning" });
            symbolGraph2.Insert(new[] { "Machine Learning", "Neural Networks" });

            symbolGraph2.Build();

            var topologicalSort   = new TopologicalSort(symbolGraph2.Graph());
            var topologicalSorted = new List <string>();

            foreach (var item in topologicalSort.Order)
            {
                topologicalSorted.Add(symbolGraph2.Name(item));
            }

            var depthFirstComponents = new DepthFirstComponents(graph);

            var depthFirstComponentsTest0 = depthFirstComponents.IsStronglyConnected(1, 7);
            var depthFirstComponentsTest1 = depthFirstComponents.IsStronglyConnected(0, 2);
            var depthFirstComponentsTest2 = depthFirstComponents.IsStronglyConnected(2, 7);
            var depthFirstComponentsTest3 = depthFirstComponents.IsStronglyConnected(9, 12);
            var depthFirstComponentsTest4 = depthFirstComponents.IsStronglyConnected(6, 8);
            var depthFirstComponentsTest5 = depthFirstComponents.IsStronglyConnected(7, 8);
        }
コード例 #19
0
        public void Run()
        {
            Console.WriteLine("Choose file:");    // Prompt
            Console.WriteLine("1 - tinyCG.txt");  // Prompt
            Console.WriteLine("2 - mediumG.txt"); // Prompt
            Console.WriteLine("3 - largeG.zip");  // Prompt
            Console.WriteLine("or quit");         // Prompt

            var fileNumber = Console.ReadLine();
            var fieName    = string.Empty;

            switch (fileNumber)
            {
            case "1":
                fieName = "tinyCG.txt";
                break;

            case "2":
                fieName = "mediumG.txt";
                break;

            case "3":
                fieName = "largeG.zip";
                break;

            case "quit":
                return;

            default:
                return;
            }


            var @in   = new In($"Files\\Graphs\\{fieName}");
            var lines = !fieName.EndsWith("zip") ? @in.ReadAllLines() : @in.ReadAllLinesFromZip();

            var lineIterator = 0;
            var v            = 0;
            var e            = 0;
            var edges        = new List <EdgeU>();

            foreach (var line in lines)
            {
                if (lineIterator == 0)
                {
                    v = Convert.ToInt32(line);
                }
                if (lineIterator == 1)
                {
                    e = Convert.ToInt32(line);
                }
                if (lineIterator > 1)
                {
                    var lineSplitted = line.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    var ve           = Convert.ToInt32(lineSplitted[0]);
                    var we           = Convert.ToInt32(lineSplitted[1]);
                    var edge         = new EdgeU(ve, we);
                    edges.Add(edge);
                }

                lineIterator++;
            }

            var graph = new Graph(v, e, edges);

            if (fileNumber != "3")
            {
                Console.WriteLine(graph);
            }


            const int s    = 0;
            var       bfs1 = new BreadthFirstPaths(graph, s);

            for (var vi = 0; vi < graph.V; vi++)
            {
                if (bfs1.HasPathTo(vi))
                {
                    Console.Write($"{s} to {vi}:  ");
                    foreach (int x in bfs1.PathTo(vi))
                    {
                        if (x == s)
                        {
                            Console.Write(x);
                        }
                        else
                        {
                            Console.Write($"-{x}");
                        }
                    }
                    Console.WriteLine();
                }

                else
                {
                    Console.WriteLine($"{s} to {v}:  not connected{Environment.NewLine}");
                }
                if (vi >= 1 && fileNumber == "3")
                {
                    break;
                }
            }

            //Console.WriteLine("------------------------------------------------");

            Console.ReadLine();
        }