Dang_Quan_10_Tin

TWOSAT

Mar 7th, 2021 (edited)
676
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. struct twosat
  2. {
  3.     vector<vector<int>> adj, nadj, com;
  4.     vector<bool> res, typ;
  5.     vector<int> in, s;
  6.     int n, l;
  7.     twosat(int n = 0)
  8.     {
  9.         l = 0;
  10.         this->n = n;
  11.         adj.resize(n * 2);
  12.         nadj.resize(n * 2);
  13.         com.resize(n * 2 + 2);
  14.         res.resize(n * 2);
  15.         in.resize(n * 2);
  16.         typ.resize(n * 2 + 2);
  17.         s.reserve(n * 2);
  18.     }
  19.  
  20. #define ID(x, t) ((t) ? (x) : (x) + n)
  21.  
  22.     void AddEdge(int u, bool typeu, int v, bool typev)
  23.     {
  24.         adj[ID(u, !typeu)].emplace_back(ID(v, typev));
  25.         nadj[ID(v, typev)].emplace_back(ID(u, !typeu));
  26.         adj[ID(v, !typev)].emplace_back(ID(u, typeu));
  27.         nadj[ID(u, typeu)].emplace_back(ID(v, !typev));
  28.     }
  29.     void dfs(int v)
  30.     {
  31.         in[v] = 1;
  32.         for (auto i : adj[v])
  33.             if (!in[i])
  34.                 dfs(i);
  35.         s.emplace_back(v);
  36.     }
  37.     void dfs_com(int v)
  38.     {
  39.         in[v] = l;
  40.         com[l].emplace_back(v);
  41.         for (auto i : nadj[v])
  42.             if (!in[i])
  43.                 dfs_com(i);
  44.     }
  45.     void Kosaraju()
  46.     {
  47.         for (int i = 0; i < n * 2; ++i)
  48.             if (!in[i])
  49.                 dfs(i);
  50.         fill(in.begin(), in.end(), 0);
  51.         while (s.size())
  52.         {
  53.             int c = s.back();
  54.             s.pop_back();
  55.             if (in[c])
  56.                 continue;
  57.             ++l;
  58.             dfs_com(c);
  59.         }
  60.     }
  61.     void Trace()
  62.     {
  63.         for (int i = 1; i <= l; ++i)
  64.         {
  65.             for (auto j : com[i])
  66.             {
  67.                 res[j] = typ[i];
  68.                 res[(j + n) % (n * 2)] = typ[in[(j + n) % (n * 2)]] = !typ[i];
  69.             }
  70.         }
  71.     }
  72.     bool sat()
  73.     {
  74.         Kosaraju();
  75.         for (int i = 0; i < n; ++i)
  76.             if (in[i] == in[i + n])
  77.                 return false;
  78.         Trace();
  79.         return true;
  80.     }
  81. };
Add Comment
Please, Sign In to add comment