public TwoSatSolver(int n, int[] vs, int[] us, bool[] vb, bool[] ub) { N = n; G = new List <int> [2 * N]; for (int i = 0; i < 2 * N; i++) { G[i] = new List <int>(); } for (int i = 0; i < vs.Length; i++) { G[vs[i] + (vb[i] ? N : 0)].Add(us[i] + (ub[i] ? 0 : N)); G[us[i] + (ub[i] ? N : 0)].Add(vs[i] + (vb[i] ? 0 : N)); } StrongConnectedGraph Scc = new StrongConnectedGraph(G); OK = true; for (int i = 0; i < N; i++) { OK &= !Scc.SameAffilication(i, i + N); } }
void Calc() { int N = re.i(); int M = re.i(); G = new List <int> [N]; order = new List <int> [N]; revG = new List <int> [N]; revorder = new List <int> [N]; for (int j = 0; j < N; j++) { G[j] = new List <int>(); order[j] = new List <int>(); revG[j] = new List <int>(); revorder[j] = new List <int>(); } for (int j = 0; j < M; j++) { int f = re.i() - 1; int t = re.i() - 1; G[f].Add(t); revG[t].Add(f); order[f].Add(j); revorder[t].Add(j); } bool[] Changed = new bool[M]; for (int i = 0; i < N; i++) { int[] OK1 = new int[N]; OK1[i] = N + 5; for (int j = 0; j < G[i].Count; j++) { dfs(G[i][j], j + 1, OK1); } int[] OK2 = new int[N]; OK2[i] = N + 5; for (int j = G[i].Count - 1; j >= 0; j--) { dfs(G[i][j], j + 1, OK2); } for (int j = 0; j < G[i].Count; j++) { if (OK1[G[i][j]] != j + 1 || OK2[G[i][j]] != j + 1) { Changed[order[i][j]] = !Changed[order[i][j]]; } } } StrongConnectedGraph Scc = new StrongConnectedGraph(G); for (int i = 0; i < N; i++) { for (int j = 0; j < revG[i].Count; j++) { if (Scc.SameAffilication(i, revG[i][j])) { Changed[revorder[i][j]] = !Changed[revorder[i][j]]; } } } for (int i = 0; i < M; i++) { if (Changed[i]) { sb.Append("diff\n"); } else { sb.Append("same\n"); } } }