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); } }
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; }
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 }); }
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); }
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 }); }
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); }