matbensch

2-SAT Implementation

Feb 7th, 2022
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int n;
  8. vector<vector<int>> adj, adjt;
  9. vector<bool> vis;
  10. vector<int> L, comp;
  11.  
  12. void dfs1(int u)
  13. {
  14.     vis[u] = true;
  15.     for(int v : adj[u])
  16.     {
  17.         if(!vis[v])
  18.             dfs1(v);
  19.     }
  20.     L.push_back(u);
  21. }
  22.  
  23. void dfs2(int u, int c)
  24. {
  25.     comp[u] = c;
  26.     for(int v : adjt[u])
  27.     {
  28.         if(comp[v] == -1)
  29.             dfs2(v, c);
  30.     }
  31. }
  32.  
  33. bool solve_2SAT()
  34. {
  35.     L.clear();
  36.     vis.assign(2*n, false);
  37.     adjt.assign(2*n, vector<int>(0));
  38.     for(int i=0;i<2*n;i++)
  39.     {
  40.         for(int j:adj[i])
  41.             adjt[j].push_back(i);
  42.     }
  43.    
  44.     for(int i = 0; i < 2*n; i++)
  45.     {
  46.         if(!vis[i])
  47.             dfs1(i);
  48.     }
  49.    
  50.     reverse(L.begin(),L.end());
  51.     comp.assign(2*n, -1);
  52.     int curComp = 0;
  53.    
  54.     for(int i=0;i<2*n;i++)
  55.     {
  56.         if( comp[L[i]] == -1 )
  57.             dfs2(L[i], curComp++);
  58.     }
  59.    
  60.     for(int i=0;i<n;i++)
  61.     {
  62.         if(comp[i] == comp[n+i])
  63.             return false;
  64.     }
  65.     return true;
  66. }
  67.  
  68. int main()
  69. {
  70.     // ( a v !b ) n ( !a v b ) n ( !a v !b ) n ( a v !c )
  71.    
  72.     // 3 variables
  73.     n = 3;
  74.     // graph with 2*n nodes
  75.     // one for each variable and one for each negation
  76.     adj.assign(2*n, vector<int>(0));
  77.    
  78.     // !a -> !b
  79.     adj[ n+0 ].push_back(n+1);
  80.     // b -> a
  81.     adj[ 1 ].push_back(0);
  82.  
  83.     // a -> b
  84.     adj[ 0 ].push_back(1);
  85.     // !b -> !a
  86.     adj[ n+1 ].push_back(n+0);
  87.    
  88.     // a -> !b
  89.     adj[ 0 ].push_back(n+1);
  90.     // b -> !a
  91.     adj[ 1 ].push_back(n+0);
  92.    
  93.     // !a -> !c
  94.     adj[ n+0 ].push_back(n+2);
  95.     // c -> a
  96.     adj[ 2 ].push_back(0);
  97.    
  98.     cout << (solve_2SAT()?"Satisfiable":"Not Satisfiable") << '\n';
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment