public void Run(string inputFileName, string outputFileName) { var lines = File.ReadAllLines(inputFileName); var graph = new Graph(); graph.Parse(lines, true); var result = graph.Tarjan(); File.WriteAllLines(outputFileName, result.Select(x => x.Label)); }
public void Parse_WithWeight_ShouldParse_Test() { // Assign var lines = new[] { "1 2 10", "2 3 15", "3 1 20" }; var graph = new Graph(); // Act graph.Parse(lines, true); // Assert Assert.AreEqual(3, graph.Vertices.Count()); Assert.AreEqual(3, graph.Edges.Count()); }
public long FindMinimumLatency(string[] lines) { var graph = new Graph(); graph.Parse(lines.Skip(2).ToArray()); var clientVerticesLabels = lines[1].Split(' '); var clientVertices = new HashSet<Vertex>(clientVerticesLabels.Select(vertexLabel => graph[vertexLabel])); long minimumLatency = long.MaxValue; foreach (var currentVertex in graph.Vertices.Where(vertex => !clientVertices.Contains(vertex))) { var roadmap = graph.Dijkstra(currentVertex); var currentMinimumLatency = clientVertices.Max(x => roadmap[x].Distance); if (currentMinimumLatency < minimumLatency) { minimumLatency = currentMinimumLatency; } } return minimumLatency; }
public void Tarjans_Case1() { // Assign var lines = new[] { "visa foreignpassport", "visa hotel", "visa bankstatement", "bankstatement nationalpassport", "hotel creditcard", "creditcard nationalpassport", "nationalpassport birthcertificate", "foreignpassport nationalpassport", "foreignpassport militarycertificate", "militarycertificate nationalpassport" }; var graph = new Graph(); var expectedStrings = new[] { "birthcertificate", "nationalpassport", "bankstatement", "creditcard", "hotel", "militarycertificate", "foreignpassport", "visa" }; var expected = expectedStrings.Aggregate((x, y) => x + Environment.NewLine + y); // Act graph.Parse(lines, true); var result = graph.Tarjan(); var actual = result.Select(x => x.Label).Aggregate((x, y) => x + Environment.NewLine + y); // Assert Assert.AreEqual(expected, actual); }
public void Tarjans_Case2() { // Assign var lines = new[] { "visa foreignpassport" }; var graph = new Graph(); var expectedStrings = new[] { "foreignpassport", "visa" }; var expected = expectedStrings.Aggregate((x, y) => x + Environment.NewLine + y); // Act graph.Parse(lines, true); var result = graph.Tarjan(); var actual = result.Select(x => x.Label).Aggregate((x, y) => x + Environment.NewLine + y); // Assert Assert.AreEqual(expected, actual); }
public void Tarjans_Case3() { // Assign var lines = new[] { "cer03 cer09", "cer03 cer08", "cer03 cer07", "cer02 cer06", "cer02 cer05", "cer02 cer04", "cer01 cer03", "cer01 cer02" }; var graph = new Graph(); var expectedStrings = new[] { "cer07", "cer08", "cer09", "cer03", "cer04", "cer05", "cer06", "cer02", "cer01" }; var expected = expectedStrings.Aggregate((x, y) => x + Environment.NewLine + y); // Act graph.Parse(lines, true); var result = graph.Tarjan(); var actual = result.Select(x => x.Label).Aggregate((x, y) => x + Environment.NewLine + y); // Assert Assert.AreEqual(expected, actual); }
public void Tarjans_Case5() { // Assign var lines = new[] { "a b", "c d", "e f", "g h", "i j", "k l", "m n", "o p", "q r", "s t", "u v", "w x", "y z" }; var graph = new Graph(); var expectedStrings = new[] { "b", "a", "d", "c", "f", "e", "h", "g", "j", "i", "l", "k", "n", "m", "p", "o", "r", "q", "t", "s", "v", "u", "x", "w", "z", "y" }; var expected = expectedStrings.Aggregate((x, y) => x + Environment.NewLine + y); // Act graph.Parse(lines, true); var result = graph.Tarjan(); var actual = result.Select(x => x.Label).Aggregate((x, y) => x + Environment.NewLine + y); // Assert Assert.AreEqual(expected, actual); }
public void Tarjans_Case4() { // Assign var lines = new[] { "3a 4a", "3a 4b", "3b 4c", "3b 4d", "3c 4e", "3c 4f", "3d 4g", "3d 4h", "2a 3a", "2a 3b", "2b 3c", "2b 3d", "1a 2a", "1a 2b", "y z", "x v" }; var graph = new Graph(); var expectedStrings = new[] { "4b", "4a", "3a", "4d", "4c", "3b", "4f", "4e", "3c", "4h", "4g", "3d", "2a", "2b", "1a", "z", "y", "v", "x" }; var expected = expectedStrings.Aggregate((x, y) => x + Environment.NewLine + y); // Act graph.Parse(lines, true); var result = graph.Tarjan(); var actual = result.Select(x => x.Label).Aggregate((x, y) => x + Environment.NewLine + y); // Assert Assert.AreEqual(expected, actual); }
private Graph CreateTestWeightedGraph() { var vertexA = new Vertex("A"); var vertexB = new Vertex("B"); var vertexC = new Vertex("C"); var vertexD = new Vertex("D"); var vertexE = new Vertex("E"); var vertexF = new Vertex("F"); var vertexG = new Vertex("G"); var vertexH = new Vertex("H"); var vertexI = new Vertex("I"); var vertexJ = new Vertex("J"); var graph = new Graph(); graph.SetVertex(vertexA); graph.SetVertex(vertexB); graph.SetVertex(vertexC); graph.SetVertex(vertexD); graph.SetVertex(vertexE); graph.SetVertex(vertexF); graph.SetVertex(vertexG); graph.SetVertex(vertexH); graph.SetVertex(vertexI); graph.SetVertex(vertexJ); graph.SetEdge(new Edge(vertexA, vertexB, 3)); graph.SetEdge(new Edge(vertexA, vertexF, 2)); graph.SetEdge(new Edge(vertexB, vertexC, 17)); graph.SetEdge(new Edge(vertexB, vertexD, 16)); graph.SetEdge(new Edge(vertexC, vertexD, 8)); graph.SetEdge(new Edge(vertexC, vertexI, 18)); graph.SetEdge(new Edge(vertexD, vertexE, 11)); graph.SetEdge(new Edge(vertexD, vertexI, 4)); graph.SetEdge(new Edge(vertexE, vertexF, 1)); graph.SetEdge(new Edge(vertexE, vertexG, 6)); graph.SetEdge(new Edge(vertexE, vertexH, 5)); graph.SetEdge(new Edge(vertexE, vertexI, 10)); graph.SetEdge(new Edge(vertexF, vertexG, 7)); graph.SetEdge(new Edge(vertexG, vertexH, 15)); graph.SetEdge(new Edge(vertexH, vertexI, 12)); graph.SetEdge(new Edge(vertexH, vertexJ, 13)); graph.SetEdge(new Edge(vertexI, vertexJ, 9)); graph.SetEdge(new Edge(vertexB, vertexA, 3)); graph.SetEdge(new Edge(vertexF, vertexA, 2)); graph.SetEdge(new Edge(vertexC, vertexB, 17)); graph.SetEdge(new Edge(vertexD, vertexB, 16)); graph.SetEdge(new Edge(vertexD, vertexC, 8)); graph.SetEdge(new Edge(vertexI, vertexC, 18)); graph.SetEdge(new Edge(vertexE, vertexD, 11)); graph.SetEdge(new Edge(vertexI, vertexD, 4)); graph.SetEdge(new Edge(vertexF, vertexE, 1)); graph.SetEdge(new Edge(vertexG, vertexE, 6)); graph.SetEdge(new Edge(vertexH, vertexE, 5)); graph.SetEdge(new Edge(vertexI, vertexE, 10)); graph.SetEdge(new Edge(vertexG, vertexF, 7)); graph.SetEdge(new Edge(vertexH, vertexG, 15)); graph.SetEdge(new Edge(vertexI, vertexH, 12)); graph.SetEdge(new Edge(vertexJ, vertexH, 13)); graph.SetEdge(new Edge(vertexJ, vertexI, 9)); return graph; }
private Graph CreateTestTreeGraph() { var vertexA = new Vertex("a"); var vertexB = new Vertex("b"); var vertexC = new Vertex("c"); var vertexD = new Vertex("d"); var vertexE = new Vertex("e"); var vertexF = new Vertex("f"); var vertexG = new Vertex("g"); var graph = new Graph(); graph.SetVertex(vertexA); graph.SetVertex(vertexB); graph.SetVertex(vertexC); graph.SetVertex(vertexD); graph.SetVertex(vertexE); graph.SetVertex(vertexF); graph.SetEdge(new Edge(vertexA, vertexB, 0)); graph.SetEdge(new Edge(vertexA, vertexC, 0)); graph.SetEdge(new Edge(vertexB, vertexD, 0)); graph.SetEdge(new Edge(vertexB, vertexE, 0)); graph.SetEdge(new Edge(vertexC, vertexF, 0)); graph.SetEdge(new Edge(vertexC, vertexG, 0)); return graph; }
private Graph CreateTestDirectlyAcyclicGraph() { var graph = new Graph(); for (int i = 0; i < 9; i++) { graph.SetVertex(new Vertex(i.ToString())); } graph.SetEdge(new Edge(graph["0"], graph["1"], 0)); graph.SetEdge(new Edge(graph["1"], graph["2"], 0)); graph.SetEdge(new Edge(graph["1"], graph["3"], 0)); graph.SetEdge(new Edge(graph["2"], graph["3"], 0)); graph.SetEdge(new Edge(graph["4"], graph["2"], 0)); graph.SetEdge(new Edge(graph["4"], graph["5"], 0)); graph.SetEdge(new Edge(graph["6"], graph["7"], 0)); graph.SetEdge(new Edge(graph["7"], graph["8"], 0)); graph.SetEdge(new Edge(graph["6"], graph["4"], 0)); return graph; }