static void Main(string[] args) { var newGraph = new WeightedGraph(); newGraph.AddNode("A"); newGraph.AddNode("B"); newGraph.AddNode("C"); newGraph.AddNode("D"); newGraph.AddEdge("A", "B", 3); newGraph.AddEdge("B", "D", 4); newGraph.AddEdge("C", "D", 5); newGraph.AddEdge("A", "C", 1); newGraph.AddEdge("B", "C", 2); Console.WriteLine(newGraph.ShortestDistance("A", "D")); Console.WriteLine(newGraph.ShortestPath("A", "D")); Console.WriteLine(newGraph.MinimumSpaningTree()); }
public void TestHasCycleReturnFalseForCorrectGraph() { var graph = new WeightedGraph(); graph.AddNode("a"); graph.AddNode("b"); graph.AddNode("c"); graph.AddNode("p"); graph.AddEdge("a", "b", 0); graph.AddEdge("b", "c", 0); var hasCycle = graph.HasCycle(); Assert.That(false, Is.EqualTo(hasCycle)); }
private WeightedGraph <Char> TestCharGraph() { var graph = new WeightedGraph <Char>(); var a = new CharNode('A'); var b = new CharNode('B'); graph.AddNode(a); graph.AddNode(b); graph.AddUndirectedEdge(a, b, 10); return(graph); }
public void TestHasCycleReturnTrueIfThereIsCycle() { var graph = new WeightedGraph(); graph.AddNode("a"); graph.AddNode("b"); graph.AddNode("c"); graph.AddNode("p"); graph.AddEdge("a", "b", 0); graph.AddEdge("b", "c", 0); graph.AddEdge("c", "a", 0); var hasCycle = graph.HasCycle(); Assert.That(true, Is.EqualTo(hasCycle)); }
public void TestGetShortedPath() { var graph = new WeightedGraph(); graph.AddNode("a"); graph.AddNode("b"); graph.AddNode("c"); graph.AddNode("p"); graph.AddEdge("a", "b", 1); graph.AddEdge("b", "c", 2); graph.AddEdge("a", "c", 10); var path = graph.GetShortedPath("a", "c"); StringAssert.AreEqualIgnoringCase("a,b,c", path.ToString()); }
public void GivenTwoKeys_WhenBothExists_ShouldAddRelationship() { // Arrange var graph = new WeightedGraph <string>(); graph.AddNode("test1"); graph.AddNode("test2"); graph.AddEdge("test1", "test2", 10); // Act var values = graph.GetAll(); // Assert values.Should().NotBeNull().And.HaveCount(2); values.GetValueOrDefault("test1").Should().ContainSingle("test2"); values.GetValueOrDefault("test2").Should().ContainSingle("test1"); }
public void TestExpandingEdges() { var graph = new WeightedGraph <Char>((oldEdge, newEdge) => newEdge > oldEdge); var a = new CharWeightedNode('A'); var b = new CharWeightedNode('B'); graph.AddNode(a); graph.AddNode(b); graph.AddUndirectedEdge(a, b, 10); Assert.AreEqual(10, a.Cost(b)); graph.UpdateUndirectedEdge(a, b, 20); Assert.AreEqual(20, a.Cost(b)); graph.UpdateUndirectedEdge(a, b, 6); Assert.AreEqual(20, a.Cost(b)); }
private WeightedGraph <Char> MockWeightedGraph() { var graph = new WeightedGraph <Char>(); var a = new CharWeightedNode('A'); var b = new CharWeightedNode('B'); var c = new CharWeightedNode('C'); var d = new CharWeightedNode('D'); var e = new CharWeightedNode('E'); var g = new CharWeightedNode('G'); graph.AddNode(a); graph.AddNode(b); graph.AddNode(c); graph.AddNode(d); graph.AddNode(e); graph.AddNode(g); graph.AddUndirectedEdge(a, b, 20); graph.AddUndirectedEdge(a, e, 8); graph.AddUndirectedEdge(b, c, 18); graph.AddUndirectedEdge(b, d, 21); graph.AddUndirectedEdge(c, d, 15); graph.AddUndirectedEdge(c, e, 30); graph.AddUndirectedEdge(d, e, 12); return(graph); }
public void TestUndirectedUnion() { var addition = new WeightedGraph <Char>(); var a = new CharWeightedNode('A'); var c = new CharWeightedNode('C'); var f = new CharWeightedNode('F'); var h = new CharWeightedNode('H'); addition.AddNode(a); addition.AddNode(c); addition.AddNode(f); addition.AddNode(h); addition.AddUndirectedEdge(a, c, 11); addition.AddUndirectedEdge(a, h, 7); addition.AddUndirectedEdge(c, h, 14); var graph = MockWeightedGraph(); graph.UndirectedUnion(addition); var bfs = ""; graph.BFS(node => bfs += node.Content); Assert.AreEqual("ABECHDGF", bfs); var edges = graph.UndirectedEdges(); var actual = $"{edges.Length} edges"; foreach (var edge in edges) { actual += $", {edge.Item1.Content.ToString()}-{edge.Item3.ToString()}-{edge.Item2.Content.ToString()}"; } var expected = "10 edges, A-20-B, A-8-E, A-11-C, A-7-H, B-18-C, B-21-D, C-15-D, C-30-E, C-14-H, D-12-E"; Assert.AreEqual(expected, actual); }
public void Run() { var weightedGraphA = new WeightedGraph(); weightedGraphA.AddNode("A"); weightedGraphA.AddNode("B"); weightedGraphA.AddNode("C"); weightedGraphA.AddNode("D"); weightedGraphA.AddNode("E"); weightedGraphA.AddEdge("A", "B", 1); weightedGraphA.AddEdge("B", "C", 1); weightedGraphA.AddEdge("B", "E", 12); weightedGraphA.AddEdge("C", "D", 1); weightedGraphA.AddEdge("D", "E", 1); weightedGraphA.AddEdge("A", "E", 10); weightedGraphA.Print(); Console.WriteLine($"Shortest path from A to E: {string.Join(",", weightedGraphA.GetShortestPath("A", "E"))}"); Console.WriteLine(""); Console.WriteLine($"Does graph A have a cycle?: {weightedGraphA.HasCycle()}"); Console.WriteLine(""); Console.WriteLine("Creating Graph B"); var weightedGraphB = new WeightedGraph(); weightedGraphB.AddNode("A"); weightedGraphB.AddNode("B"); weightedGraphB.AddNode("C"); weightedGraphB.AddEdge("A", "B", 1); weightedGraphB.AddEdge("B", "C", 1); weightedGraphB.Print(); Console.WriteLine(""); Console.WriteLine($"Does graph B have a cycle?: {weightedGraphB.HasCycle()}"); Console.WriteLine(""); Console.WriteLine("Creating Graph C"); var weightedGraphC = new WeightedGraph(); weightedGraphC.AddNode("A"); weightedGraphC.AddNode("B"); weightedGraphC.AddNode("C"); weightedGraphC.AddNode("D"); weightedGraphC.AddEdge("A", "B", 3); weightedGraphC.AddEdge("B", "D", 4); weightedGraphC.AddEdge("C", "D", 5); weightedGraphC.AddEdge("A", "C", 1); weightedGraphC.AddEdge("B", "C", 2); weightedGraphC.Print(); Console.WriteLine(""); Console.WriteLine($"Minimum Spanning Tree for Graph C: "); var minimumSpanningTreeC = weightedGraphC.GetMinimumSpanningTree(); minimumSpanningTreeC.Print(); }