zipdang04

2SAT

Aug 2nd, 2021 (edited)
978
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int oo = 1e9;
  5. struct TWOSET{
  6.     TWOSET(){}
  7.  
  8.     int n, all, m;
  9.     vector<vector<int>> graph;
  10.     vector<int> grIdx; int cntGr;
  11.     vector<bool> answer;
  12.     inline int getIdx(int node){
  13.         return (node > 0) ? node : (-node + n);
  14.     };
  15.    
  16.     void init(int n){
  17.         this -> n = n; m = 0;
  18.         all = n * 2 + 1;
  19.         graph = vector<vector<int>>(all, vector<int>());
  20.         grIdx = vector<int>(all, 0);
  21.     }
  22.  
  23.     void addEdge(int u, int v){
  24.         graph[getIdx(-u)].push_back(getIdx(v));
  25.         graph[getIdx(-v)].push_back(getIdx(u));
  26.     }
  27.  
  28.     vector<int> low, num;
  29.     stack<int> st;
  30.     int time = 0;
  31.     void initTarjan(){
  32.         low = vector<int>(all, false);
  33.         num = vector<int>(all, false);
  34.         time = cntGr = 0;
  35.     }
  36.     void tarjan(int node){
  37.         low[node] = num[node] = ++time;
  38.         st.push(node);
  39.  
  40.         for (int child: graph[node])
  41.             if (num[child])
  42.                 minimize(low[node], num[child]);
  43.             else {
  44.                 tarjan(child);
  45.                 minimize(low[node], low[child]);
  46.             }
  47.        
  48.         if (num[node] == low[node]){
  49.             ++cntGr; int v = -1;
  50.             while (v != node){
  51.                 v = st.top(), st.pop();
  52.                 grIdx[v] = cntGr;
  53.                 low[v] = num[v] = oo;
  54.             }
  55.         }
  56.     }
  57.  
  58.     bool checkSatisfiable(){
  59.         initTarjan();
  60.         for (int node = 1; node < all; node++)
  61.             if (low[node] == 0) tarjan(node);
  62.  
  63.         answer = vector<bool>(n + 1);
  64.         for (int i = 1; i <= n; i++){
  65.             int u = getIdx(i), v = getIdx(-i);
  66.             if (grIdx[u] == grIdx[v]) return false;
  67.             answer[i] = grIdx[u] < grIdx[v];
  68.         }
  69.         return true;
  70.     }
  71. };
Add Comment
Please, Sign In to add comment