public void AddClause(int i, bool f, int j, bool g) { if (i < 0 || _n < i) { throw new IndexOutOfRangeException(nameof(i)); } if (j < 0 || _n < j) { throw new IndexOutOfRangeException(nameof(j)); } _scc.AddEdge(2 * i + (f ? 0 : 1), 2 * j + (g ? 1 : 0)); _scc.AddEdge(2 * j + (g ? 0 : 1), 2 * i + (f ? 1 : 0)); }
public static long Calc(int n) { n >>= 3; long ans = 0; var graph = new SCCGraph(n); for (int i = 0; i < n; i++) { graph.AddEdge(i, (int)((1000000007L * i) % n)); } ans = graph.SCC().Length; return(ans); }
public static void Solve() { var(N, M) = Scanner.Scan <int, int>(); var G = new SCCGraph(N); for (var i = 0; i < M; i++) { var(u, v) = Scanner.Scan <int, int>(); G.AddEdge(u, v); } var scc = G.GetSCC(); Console.WriteLine(scc.Count()); foreach (var v in scc) { Console.WriteLine($"{v.Count()} {string.Join(" ", v)}"); } }
public override IEnumerable <object> Solve(TextReader inputStream) { var(nodeCount, edgeCount) = inputStream.ReadValue <int, int>(); var graph = new SCCGraph(nodeCount); for (int i = 0; i < edgeCount; i++) { var(u, v) = inputStream.ReadValue <int, int>(); graph.AddEdge(u, v); } var sccs = graph.SCC(); yield return(sccs.Count); foreach (var scc in sccs) { yield return($"{scc.Count} {scc.Join(' ')}"); } }
public void Solve() { var n = sc.Integer(); var a = sc.Integer(); var F = new int[a]; var T = new int[a]; for (int i = 0; i < a; i++) { F[i] = sc.Integer() - 1; T[i] = sc.Integer() - 1; } var b = sc.Integer(); var A = new int[b]; var B = new int[b]; for (int i = 0; i < b; i++) { A[i] = sc.Integer() - 1; B[i] = sc.Integer() - 1; } var max = 0; for (int i = 0; i < 1 << b; i++) { var G = new SCCGraph(n); for (int j = 0; j < a; j++) { G.AddEdge(T[j], F[j]); } var dame = new bool[n]; for (int j = 0; j < b; j++) { if ((i >> j & 1) == 1) { G.AddEdge(A[j], B[j]); } else { dame[A[j]] = true; } } G.Build(); var ok = Enumerate(G.Size, x => true); for (int j = 0; j < G.Size; j++) { if (G.S[j].Count > 1 || ok[j] == false || dame[G.S[j][0]]) { ok[j] = false; foreach (var to in G.G[j]) { ok[to.to] = false; } } } var cnt = ok.Count(x => x); max = Math.Max(max, cnt); Debug.WriteLine(cnt); } IO.Printer.Out.WriteLine(max); }