cincout

2sat class

Apr 9th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.61 KB | None | 0 0
  1. class _2sat {
  2. public:
  3. int n;
  4. vector <int> used, comp;
  5. vector <vector<int>> g, rev;
  6. vector <int> tp;
  7. _2sat(int sz) : n(sz * 2) {
  8. used.resize(n);
  9. comp.resize(n);
  10. g.resize(n);
  11. rev.resize(n);
  12. }
  13. void addEdge(int u, int add1, int v, int add2) {
  14. g[u * 2 + add1].push_back(v * 2 + add2);
  15. rev[v * 2 + add2].push_back(u * 2 + add1);
  16. }
  17. void dfs(int u) {
  18. used[u] = 1;
  19. for (auto to : g[u]) {
  20. if (used[u]) continue;
  21. dfs(to);
  22. }
  23. tp.push_back(u);
  24. }
  25. void paint(int u, int cl) {
  26. comp[u] = cl;
  27. for (auto to : rev[u]) {
  28. if (comp[to]) continue;
  29. paint(to, cl);
  30. }
  31. }
  32. vector <int> solve() {
  33. tp.clear();
  34. fill(used.begin(), used.end(), 0);
  35. fill(comp.begin(), comp.end(), 0);
  36. for (int i = 0; i < n; ++i) {
  37. if (!used[i]) {
  38. dfs(i);
  39. }
  40. }
  41. int c = 1;
  42. for (int i = 0; i < n; ++i) {
  43. int v = tp[n - i - 1];
  44. if (comp[v] != 0) continue;
  45. paint(v, c);
  46. c++;
  47. }
  48. vector <int> ret, cool;
  49. for (int i = 0; i < n; i += 2) {
  50. if (comp[i] == comp[i + 1]) return cool;
  51. ret.push_back(comp[i] > comp[i + 1]);
  52. }
  53. return ret;
  54. }
  55. };
Advertisement
Add Comment
Please, Sign In to add comment