Exemplo n.º 1
0
 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));
 }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 3
0
        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;
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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;
        }