コード例 #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 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 });
        }