public static void PerformUndirectedGraphOps()
        {
            var undirectedGraph = new UndirectedGraph();

            undirectedGraph.AddNode("A");
            undirectedGraph.AddNode("B");
            undirectedGraph.AddNode("C");
            undirectedGraph.AddEdge("A", "B", 3);
            undirectedGraph.AddEdge("A", "C", 2);
            undirectedGraph.Print();

            Console.WriteLine("Dijkstra Start");

            var dijkstraDemo = new UndirectedGraph();

            dijkstraDemo.AddNode("A");
            dijkstraDemo.AddNode("B");
            dijkstraDemo.AddNode("C");
            dijkstraDemo.AddNode("D");
            dijkstraDemo.AddNode("E");
            dijkstraDemo.AddEdge("A", "B", 3);
            dijkstraDemo.AddEdge("A", "C", 4);
            dijkstraDemo.AddEdge("A", "D", 2);
            dijkstraDemo.AddEdge("B", "D", 6);
            dijkstraDemo.AddEdge("B", "E", 1);
            dijkstraDemo.AddEdge("C", "D", 1);
            dijkstraDemo.AddEdge("D", "E", 5);
            dijkstraDemo.Print();
            Console.WriteLine("Shortest Path from A to E is : " + dijkstraDemo.GetShortestDistance("A", "E"));

            Console.WriteLine("Cycle Detection");
            var cycleDetectionDemo = new UndirectedGraph();

            cycleDetectionDemo.AddNode("A");
            cycleDetectionDemo.AddNode("B");
            cycleDetectionDemo.AddNode("C");
            cycleDetectionDemo.AddNode("D");
            cycleDetectionDemo.AddEdge("A", "B", 1);
            cycleDetectionDemo.AddEdge("B", "C", 1);
            cycleDetectionDemo.AddEdge("C", "A", 2);
            cycleDetectionDemo.Print();
            Console.WriteLine("The graph contains cycle : " + cycleDetectionDemo.HasCycles());

            Console.WriteLine("Prim's Algorithm for Minimum Spanning Tree");
            var primDemo = new UndirectedGraph();

            primDemo.AddNode("A");
            primDemo.AddNode("B");
            primDemo.AddNode("C");
            primDemo.AddNode("D");
            primDemo.AddEdge("A", "B", 3);
            primDemo.AddEdge("A", "C", 1);
            primDemo.AddEdge("B", "C", 2);
            primDemo.AddEdge("B", "D", 4);
            primDemo.AddEdge("C", "D", 5);
            primDemo.Print();
            Console.WriteLine("Minimum Spanning Tree is : ");
            primDemo.FindMinimumSpanningTree().Print();
        }
        public void When_EdgeIsDuplicated_ExceptionIsThrown()
        {
            var from  = new Node("someValue");
            var to    = new Node("someOtherValue");
            var graph = new UndirectedGraph();

            graph.AddNode(from);
            graph.AddNode(to);
            graph.AddEdge(from, to, 5);

            graph.AddEdge(from, to, 5);
        }
        public void AddTest()
        {
            UndirectedGraph <string> graph = new UndirectedGraph <string>();

            graph.AddNode(new GraphNode <string>("node1"));
            graph.AddNode(new GraphNode <string>("node2"));
            graph.AddNode(new GraphNode <string>("node3"));
            graph.AddNode(new GraphNode <string>("node4"));
            graph.AddNode(new GraphNode <string>("node5"));

            Assert.IsTrue(graph.Contains("node4"));
            Assert.AreEqual(5, graph.Size);
            Assert.IsFalse(graph.Contains("dylan"));
        }
        public void When_EdgeIsAdded_ToNodeBecomesNeighborOfFromNodeAndViceversa()
        {
            var from  = new Node("someValue");
            var to    = new Node("someOtherValue");
            var graph = new UndirectedGraph();

            graph.AddNode(from);
            graph.AddNode(to);

            graph.AddEdge(from, to, 5);

            Assert.IsTrue(from.HasNeighbor(to));
            Assert.AreEqual(5, from.GetCostTo(to));
            Assert.IsTrue(to.HasNeighbor(from));
            Assert.AreEqual(5, to.GetCostTo(from));
        }
Ejemplo n.º 5
0
        public void AddNodeTestInvalid()
        {
            // Arrange
            Graph testGraph = new UndirectedGraph();

            testGraph.AddNode(1, new UndirectedGraph.Node(1, "spin"));
            var expectedId      = 1;
            var expectedPayload = "spin";

            // Act
            testGraph.AddNode(1, new UndirectedGraph.Node(1, "spot"));
            var actual = testGraph.GetNode(1);

            // Assert
            Assert.AreEqual(expectedId, actual.id);
            Assert.AreEqual(expectedPayload, actual.payload);
        }
        public AbstractGraph <int, int> GetGraph()
        {
            //Read no of nodes and edges
            var graph             = new UndirectedGraph <int, int>();
            var noOfNodesAndEdges =
                Console.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToList();
            var noOfNodes = noOfNodesAndEdges.First();
            var noOfEdges = noOfNodesAndEdges.Last();

            for (int n = 0, e = 0; n < noOfNodes && e < noOfEdges;)
            {
                var nodeOrEdge =
                    Console.ReadLine()
                    .Split(separator, StringSplitOptions.RemoveEmptyEntries)
                    .Select(int.Parse)
                    .ToList();
                //Node only
                if (nodeOrEdge.Count == 1)
                {
                    graph.AddNode(nodeOrEdge.First());
                    n++;
                }
                //Edge without weight
                else if (nodeOrEdge.Count == 2)
                {
                    e++;

                    AddEdge(graph, nodeOrEdge[0], nodeOrEdge[1], DefaultEdgeWeight);
                }
                //edge with weight
                else
                {
                    e++;
                    AddEdge(graph, nodeOrEdge[0], nodeOrEdge[1], nodeOrEdge[2]);
                }
            }
            for (var n = 1; n <= noOfNodes; n++)
            {
                if (!graph.GetNodes().Contains(n))
                {
                    graph.AddNode(n);
                }
            }

            return(graph);
        }
        public void When_EdgeToANonExistingNodeInGraphIsAdded_ExceptionIsThrown()
        {
            var from  = new Node("someValue");
            var to    = new Node("someOtherValue");
            var graph = new UndirectedGraph();

            graph.AddNode(from);

            graph.AddEdge(from, to, 1);
        }
Ejemplo n.º 8
0
    // Generates a new undirected graph using an adjacency matrix.
    public UndirectedGraph <int> GenerateUndirectedGraph(int size, float probability)
    {
        UndirectedGraph <int> graph = new UndirectedGraph <int>(size);

        System.Random rPos = new System.Random();
        int[,] adjMat = GenerateAdjacencyMatrix(size, probability);

        for (int x = 0; x < size; x++)
        {
            if (x == 0)
            {
                graph.AddNode(new EntryNode(x, Vector3.zero));
            }
            else if (x == size - 2)
            {
                graph.AddNode(new BossRoom(x, new Vector3(rPos.Next(x - 3, x + 3) * scale, 0, rPos.Next(x - 3, x + 3) * scale)));
            }
            else if (x == size - 1)
            {
                graph.AddNode(new ExitNode(x, new Vector3(rPos.Next(x - 3, x + 3) * scale, 0, rPos.Next(x - 3, x + 3) * scale)));
            }

            else
            {
                graph.AddNode(new RoomNode(x, new Vector3(rPos.Next(x - 3, x + 3) * scale, 0, rPos.Next(x - 3, x + 3) * scale)));
            }
        }

        for (int x = 0; x < size; x++)
        {
            for (int y = 0; y < size; y++)
            {
                // int difference = Mathf.Abs(y) + x;
                if (adjMat[x, y] == 1 && !graph.Nodes[x].Neighbours.Contains(graph.Nodes[y]))
                {
                    graph.Nodes[x].AddEdge(graph.Nodes[y]);
                }
            }
        }

        return(graph);
    }
Ejemplo n.º 9
0
        public void GetPathPayloadTestValid()
        {
            // Arrange
            UndirectedGraph testGraph = new UndirectedGraph();

            Dictionary <string, string[]> testData = new Dictionary <string, string[]>
            {
                { "bird", new string[] { "gird", "bard", "byrd", "bind" } },
                { "gird", new string[] { "bird", "gild", "girl", "girt" } },
                { "bard", new string[] { "card", "hard", "lard", "ward", "yard", "bird", "byrd", "bald", "band", "baud", "bawd", "barb", "bare", "bark", "barn", "barr", "bart" } },
                { "byrd", new string[] { "bard", "bird" } },
                { "bind", new string[] { "find", "hind", "kind", "lind", "mind", "wind", "band", "bend", "bond", "bird", "bing", "bini" } },
                { "wind", new string[] { "bind", "find", "hind", "kind", "lind", "mind", "wand", "wild", "wine", "wing", "wink", "wino", "winy" } },
                { "wing", new string[] { "bing", "ding", "king", "ping", "ring", "sing", "zing", "wang", "wong", "wind", "wine", "wink", "wino", "winy" } },
            };

            int nodeId = 1;

            foreach (string word in testData.Keys)
            {
                testGraph.AddNode(nodeId, new UndirectedGraph.Node(nodeId, word));
                nodeId++;
            }

            foreach (var node in testData)
            {
                foreach (string neighbour in node.Value)
                {
                    if (!testData.ContainsKey(neighbour))
                    {
                        continue;
                    }
                    else
                    {
                        testGraph.AddEdge(testGraph.GetNodeId(node.Key), testGraph.GetNodeId(neighbour));
                    }
                }
            }

            var expected = new List <string> {
                "bird", "bind", "wind", "wing"
            };

            // Act
            var actual = testGraph.HasPathBFS(testGraph.GetNode(testGraph.GetNodeId("bird")), testGraph.GetNode(testGraph.GetNodeId("wing")));

            // Assert
            Assert.IsTrue(actual.Item1);
            Assert.IsTrue(expected.Count == actual.Item2.Count);
            for (int i = 0; i < expected.Count; i++)
            {
                Assert.AreEqual(expected[i], actual.Item2[i]);
            }
        }
        public void When_NodeIsRemovedFromGraph_GraphNodesDoNotContainRemovedNode()
        {
            var node  = new Node("someValue");
            var graph = new UndirectedGraph();

            graph.AddNode(node);

            graph.RemoveNode(node);

            Assert.IsFalse(graph.HasNode(node));
            Assert.AreEqual(0, graph.GetCount());
        }
        public void When_NodeIsRemovedFromGraph_AllEdgesToTheRemovedNodeAreCleared()
        {
            var from  = new Node("someValue");
            var to    = new Node("someOtherValue");
            var to2   = new Node("anotherValue");
            var graph = new UndirectedGraph();

            graph.AddNode(from);
            graph.AddNode(to);
            graph.AddNode(to2);
            graph.AddEdge(from, to, 5);
            graph.AddEdge(from, to2, 6);

            graph.RemoveNode(from);

            foreach (Node node in graph.GetNodes())
            {
                Assert.IsFalse(node.HasNeighbor(from));
            }

            Assert.IsFalse(graph.HasNode(from));
        }
Ejemplo n.º 12
0
        public void GetNodePayloadTestValid()
        {
            // Arrange
            UndirectedGraph testGraph = new UndirectedGraph();

            testGraph.AddNode(1, new UndirectedGraph.Node(1, "spin"));
            string expectedPayload = "spin";

            // Act
            var actual = testGraph.GetNodePayload(1);

            // Assert
            Assert.AreEqual(expectedPayload, actual);
        }
Ejemplo n.º 13
0
        public void GetNodeTestInvalid()
        {
            // Arrange
            UndirectedGraph testGraph = new UndirectedGraph();

            testGraph.AddNode(1, new UndirectedGraph.Node(1, "spin"));
            UndirectedGraph.Node expected = null;

            // Act
            var actual = testGraph.GetNode(2);

            // Assert
            Assert.AreEqual(expected, actual);
        }
Ejemplo n.º 14
0
        public void GetNodeIdTestValid()
        {
            // Arrange
            UndirectedGraph testGraph = new UndirectedGraph();

            testGraph.AddNode(1, new UndirectedGraph.Node(1, "spin"));
            int expectedId = 1;

            // Act
            var actual = testGraph.GetNodeId("spin");

            // Assert
            Assert.AreEqual(expectedId, actual);
        }
Ejemplo n.º 15
0
        public static PandemicBoard FromCitiesAndEdges(IEnumerable <City> cities, IEnumerable <Edge> edges)
        {
            var cityGraph = new UndirectedGraph <City>();

            foreach (var city in cities)
            {
                cityGraph.AddNode(city);
            }

            foreach (var edge in edges)
            {
                cityGraph.AddEdge(edge.From, edge.To);
            }

            return(new PandemicBoard(cityGraph));
        }
Ejemplo n.º 16
0
        public void When_UndirectedGraphIsComplex_MinimumPathIsReturned()
        {
            //testing graph example from https://msdn.microsoft.com/en-US/library/ms379574(v=vs.80).aspx
            var newYork      = new Node("New York");
            var chicago      = new Node("Chicago");
            var sanFrancisco = new Node("San Francisco");
            var denver       = new Node("Denver");
            var losAngeles   = new Node("Los Angeles");
            var dallas       = new Node("Dallas");
            var miami        = new Node("Miami");
            var sanDiego     = new Node("San Diego");

            var graph = new UndirectedGraph();

            graph.AddNode(newYork);
            graph.AddNode(chicago);
            graph.AddNode(sanFrancisco);
            graph.AddNode(denver);
            graph.AddNode(losAngeles);
            graph.AddNode(dallas);
            graph.AddNode(miami);
            graph.AddNode(sanDiego);

            graph.AddEdge(newYork, chicago, 75);
            graph.AddEdge(newYork, denver, 100);
            graph.AddEdge(newYork, dallas, 125);
            graph.AddEdge(newYork, miami, 90);
            graph.AddEdge(chicago, sanFrancisco, 25);
            graph.AddEdge(chicago, denver, 20);
            graph.AddEdge(sanFrancisco, losAngeles, 45);
            graph.AddEdge(sanDiego, losAngeles, 45);
            graph.AddEdge(dallas, sanDiego, 90);
            graph.AddEdge(dallas, losAngeles, 80);
            graph.AddEdge(miami, dallas, 50);
            graph.AddEdge(denver, losAngeles, 100);

            var         dijkstra     = new Dijkstra(graph);
            List <Node> minimumPath  = dijkstra.GetMinimumPathBetween(newYork, losAngeles).ToList();
            var         expectedPath = new List <Node> {
                newYork, chicago, sanFrancisco, losAngeles
            };

            CollectionAssert.AreEqual(expectedPath, minimumPath);
            Assert.AreEqual(145, dijkstra.GetPathCost(minimumPath));
        }
Ejemplo n.º 17
0
        public void ShouldAddNodes(string inodes)
        {
            //Arrange
            var expectedNodes =
                inodes.Split(nodeSeparator, StringSplitOptions.RemoveEmptyEntries)
                .Select(char.Parse)
                .OrderBy(x => x)
                .ToList();
            AbstractGraph <char, int> sut = new UndirectedGraph <char, int>();

            //Act
            expectedNodes.ForEach(x => sut.AddNode(x));
            var actual = sut.GetNodes().OrderBy(x => x);

            //Assert
            Assert.AreEqual(expectedNodes, actual);
        }
Ejemplo n.º 18
0
        public static UndirectedGraph <City> LoadCityGraph()
        {
            var graph     = new UndirectedGraph <City>();
            var idxLookup = BuildCityIdxLookup(Cities);

            foreach (var city in Cities)
            {
                graph.AddNode(city);
            }

            foreach (var(cityFrom, cityTo) in Edges)
            {
                graph.AddEdge(idxLookup[cityFrom], idxLookup[cityTo]);
            }

            return(graph);
        }
        public void ShouldAddNodes(string inodes)
        {
            //Arrange
            var expectedNodes =
                inodes.Split(nodeSeparator, StringSplitOptions.RemoveEmptyEntries)
                    .Select(char.Parse)
                    .OrderBy(x => x)
                    .ToList();
            AbstractGraph<char, int> sut = new UndirectedGraph<char, int>();

            //Act
            expectedNodes.ForEach(x => sut.AddNode(x));
            var actual = sut.GetNodes().OrderBy(x => x);

            //Assert
            Assert.AreEqual(expectedNodes, actual);
        }
        private AbstractGraph <int, int> GetMockGraph(string igraph, int edgeWeight)
        {
            var edges = igraph.Split(_edgeSeparator, StringSplitOptions.RemoveEmptyEntries);
            var graph = new UndirectedGraph <int, int>();

            foreach (var edge in edges)
            {
                var nodesConnectingEdge =
                    edge.Split(_nodeSeparator, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToList();
                if (nodesConnectingEdge.Count == 1)
                {
                    graph.AddNode(nodesConnectingEdge.Single());
                }
                else
                {
                    graph.AddEdge(nodesConnectingEdge.First(), nodesConnectingEdge.Last(), edgeWeight);
                }
            }

            return(graph);
            //var mockGraph = MockRepository.GenerateStub<AbstractGraph<int, int>>();

            //var nodes = new List<int>();
            //foreach (var edge in edges)
            //{
            //    var nodesConnectingEdge = edge.Split(nodeSeparator).Select(int.Parse).ToList();
            //    if (nodes.Contains(nodesConnectingEdge.First()))
            //    {
            //        nodes.Add(nodesConnectingEdge.First());
            //    }
            //    if (nodes.Contains(nodesConnectingEdge.Last()))
            //    {
            //        nodes.Add(nodesConnectingEdge.Last());
            //    }
            //}
            //mockGraph.Stub(x => x.GetNodes()).Return(nodes);
            ////      mockGraph.Stub(x=>x.GetNeighbours(1)).IgnoreArguments().Do()
            //return mockGraph;
        }
Ejemplo n.º 21
0
        public void Chordal()
        {
            var graph = new UndirectedGraph <char, EdgeData>();

            graph.AddNodes('a', 'b', 'c', 'd', 'e');
            graph.AddEdges(
                ('a', 'b', dummyEdgeData),
                ('a', 'c', dummyEdgeData),
                ('b', 'c', dummyEdgeData),
                ('b', 'd', dummyEdgeData),
                ('b', 'e', dummyEdgeData),
                ('c', 'd', dummyEdgeData),
                ('d', 'e', dummyEdgeData)
                );

            graph.Chordal.Should().BeTrue();

            graph.AddNode('f');
            graph.AddEdge('a', 'f', dummyEdgeData);

            graph.Chordal.Should().BeFalse();
        }
        private AbstractGraph<int, int> GetMockGraph(string igraph, int edgeWeight)
        {
            var edges = igraph.Split(_edgeSeparator, StringSplitOptions.RemoveEmptyEntries);
            var graph = new UndirectedGraph<int, int>();
            foreach (var edge in edges)
            {
                var nodesConnectingEdge =
                    edge.Split(_nodeSeparator, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToList();
                if (nodesConnectingEdge.Count == 1)
                {
                    graph.AddNode(nodesConnectingEdge.Single());
                }
                else
                {
                    graph.AddEdge(nodesConnectingEdge.First(), nodesConnectingEdge.Last(), edgeWeight);
                }
            }

            return graph;
            //var mockGraph = MockRepository.GenerateStub<AbstractGraph<int, int>>();

            //var nodes = new List<int>();
            //foreach (var edge in edges)
            //{
            //    var nodesConnectingEdge = edge.Split(nodeSeparator).Select(int.Parse).ToList();
            //    if (nodes.Contains(nodesConnectingEdge.First()))
            //    {
            //        nodes.Add(nodesConnectingEdge.First());
            //    }
            //    if (nodes.Contains(nodesConnectingEdge.Last()))
            //    {
            //        nodes.Add(nodesConnectingEdge.Last());
            //    }
            //}
            //mockGraph.Stub(x => x.GetNodes()).Return(nodes);
            ////      mockGraph.Stub(x=>x.GetNeighbours(1)).IgnoreArguments().Do()
            //return mockGraph;
        }
Ejemplo n.º 23
0
        public void GivenASingleEdgeIsAdded_ShouldHaveOneEdge()
        {
            // arrange
            _graph.AddNode(0);
            _graph.AddNode(0);

            // act
            _graph.AddEdge(0, 1);

            // assert
            var edgesFrom0 = _graph.GetEdgesFrom(0);
            var edgesFrom1 = _graph.GetEdgesFrom(1);

            Assert.AreEqual(1, edgesFrom0.Count);
            Assert.AreEqual(0, edgesFrom0.Single().From);
            Assert.AreEqual(1, edgesFrom0.Single().To);

            Assert.AreEqual(1, edgesFrom1.Count);
            Assert.AreEqual(1, edgesFrom1.Single().From);
            Assert.AreEqual(0, edgesFrom1.Single().To);
        }