Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class _2sat {
- public:
- int n;
- vector <int> used, comp;
- vector <vector<int>> g, rev;
- vector <int> tp;
- _2sat(int sz) : n(sz * 2) {
- used.resize(n);
- comp.resize(n);
- g.resize(n);
- rev.resize(n);
- }
- void addEdge(int u, int add1, int v, int add2) {
- g[u * 2 + add1].push_back(v * 2 + add2);
- rev[v * 2 + add2].push_back(u * 2 + add1);
- }
- void dfs(int u) {
- used[u] = 1;
- for (auto to : g[u]) {
- if (used[u]) continue;
- dfs(to);
- }
- tp.push_back(u);
- }
- void paint(int u, int cl) {
- comp[u] = cl;
- for (auto to : rev[u]) {
- if (comp[to]) continue;
- paint(to, cl);
- }
- }
- vector <int> solve() {
- tp.clear();
- fill(used.begin(), used.end(), 0);
- fill(comp.begin(), comp.end(), 0);
- for (int i = 0; i < n; ++i) {
- if (!used[i]) {
- dfs(i);
- }
- }
- int c = 1;
- for (int i = 0; i < n; ++i) {
- int v = tp[n - i - 1];
- if (comp[v] != 0) continue;
- paint(v, c);
- c++;
- }
- vector <int> ret, cool;
- for (int i = 0; i < n; i += 2) {
- if (comp[i] == comp[i + 1]) return cool;
- ret.push_back(comp[i] > comp[i + 1]);
- }
- return ret;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment