コード例 #1
0
        public void Run()
        {
            using (var reader = new StreamReader("SCC.txt"))
            using (var writer = new StreamWriter("output.txt"))
            {
                var graph = new DirectedGraph<int>();

                while (true)
                {
                    string row = reader.ReadLine();
                    if (row == null)
                    {
                        break;
                    }

                    var parts = row.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
                    var numbers = parts.Select(x => int.Parse(x, CultureInfo.InvariantCulture) - 1).ToArray();
                    var from = numbers[0];
                    var to = numbers[1];
                    if (from != to)
                    {
                        graph.AddEdge(from, to);
                    }
                }

                var calculator = new StronglyConnectedComponentsCalculator<int>(graph);

                var components = calculator.GetStronglyConnectedComponents().ToArray();
                var top5Components = components.OrderByDescending(x => x.Length).Take(5).ToArray();
                var result = string.Join(",", top5Components.Select(x => x.Length));
                writer.WriteLine(result);
            }
        }
コード例 #2
0
ファイル: TwoSatSolver.cs プロジェクト: korzenikov/Projects
        public static bool IsSatisfiable(IReadOnlyCollection<Clause> clauses)
        {
            var graph = new DirectedGraph<int>();

            foreach (var clause in clauses)
            {
                var literal1 = clause.Literal1;
                var literal2 = clause.Literal2;
                var from1 = GetNodeIndex(literal1.Negate());
                var to1 = GetNodeIndex(literal2);

                graph.AddEdge(from1, to1);

                var from2 = GetNodeIndex(literal2.Negate());
                var to2 = GetNodeIndex(literal1);

                graph.AddEdge(from2, to2);
            }

            var calculator = new StronglyConnectedComponentsCalculator<int>(graph);
            var components = calculator.GetStronglyConnectedComponents().ToArray();
            foreach (var component in components)
            {
                var positiveLiteralNodes = component.Where(node => node >= 0).ToArray();
                var negativeLiteralNodes = new HashSet<int>(component.Where(node => node < 0));
                if (positiveLiteralNodes.Any(node => negativeLiteralNodes.Contains(GetNegativeLiteralNodeIndex(node))))
                {
                    return false;
                }
            }

            return true;
        }
コード例 #3
0
        public void GetStronglyConnectedComponentsTest()
        {
            var graph = GetTestGraph();

            var calculator = new StronglyConnectedComponentsCalculator<int>(graph);
            var components = calculator.GetStronglyConnectedComponents().ToArray();
            components.Should().HaveCount(3);
            components[0].Should().BeEquivalentTo(new[] { 0, 6, 3 });
            components[1].Should().BeEquivalentTo(new[] { 8, 5, 2 });
            components[2].Should().BeEquivalentTo(new[] { 7, 1, 4 });
        }
コード例 #4
0
        public void DepthFirstSearchLoopTest()
        {
            var graph = GetTestGraph();

            var calculator1 = new StronglyConnectedComponentsCalculator<int>(graph);
            var result1 = calculator1.DepthFirstSearchLoop(graph.Keys, true).ToArray();
            result1.Length.Should().BeLessOrEqualTo(3);

            var calculator2 = new StronglyConnectedComponentsCalculator<int>(graph);
            var result2 = calculator2.DepthFirstSearchLoop(graph.Keys.Reverse(), true).ToArray();
            result2.Length.Should().BeLessOrEqualTo(3);
        }
コード例 #5
0
        public void GetStronglyConnectedComponentsTest2()
        {
            var graph = new DirectedGraph<int>();
            graph.AddEdge(1, 3);
            graph.AddEdge(3, 5);
            graph.AddEdge(3, 9);
            graph.AddEdge(5, 7);
            graph.AddEdge(7, 1);

            var calculator = new StronglyConnectedComponentsCalculator<int>(graph);
            var components = calculator.GetStronglyConnectedComponents().ToArray();
            components.Should().HaveCount(2);
            components[0].Should().BeEquivalentTo(new[] { 9 });
            components[1].Should().BeEquivalentTo(new[] { 1, 3, 5, 7 });
        }
コード例 #6
0
        public void DepthFirstSearchTest()
        {
            var graph1 = GetTestGraph();

            var calculator1 = new StronglyConnectedComponentsCalculator<int>(graph1);
            IEnumerable<int> vertices1 = calculator1.DepthFirstSearch(0, true);
            vertices1.Should().HaveCount(9);

            var calculator2 = new StronglyConnectedComponentsCalculator<int>(graph1);
            IEnumerable<int> vertices2 = calculator2.DepthFirstSearch(1, true);
            vertices2.Should().HaveCount(3);

            var graph2 = new DirectedGraph<int>();
            graph2.AddEdge(0, 1);
            graph2.AddEdge(0, 2);
            graph2.AddEdge(2, 1);

            var calculator3 = new StronglyConnectedComponentsCalculator<int>(graph2);
            IEnumerable<int> vertices3 = calculator3.DepthFirstSearch(0, false);
            vertices3.Should().HaveCount(3);
        }