Advertisement
Guest User

LOJ_Explosion.cpp

a guest
Apr 7th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define dbg(a)  cerr << __LINE__ << ": " << #a << " = " << a << '\n'
  5.  
  6. struct graph
  7. {
  8.     int n, cnt;
  9.     vector<vector<int>> g, gt;
  10.     vector<int> vis, cno, assignment;   //cno: component number of i
  11.     stack <int> st;
  12.  
  13.     graph(int n): n(n), g(n), gt(n){}
  14.  
  15.     void add_edge(int u, int v){
  16.         g[u].emplace_back(v);
  17.         gt[v].emplace_back(u);
  18.     }
  19.  
  20.     void remove_edge(int u, int v){
  21.         g[u].pop_back();
  22.         gt[v].pop_back();
  23.     }
  24.  
  25.     void dfs1(int v){
  26.         vis[v] = 1;
  27.         for(int u: g[v]){
  28.             if(!vis[u])
  29.                 dfs1(u);
  30.         }
  31.         st.push(v);
  32.     }
  33.  
  34.     void dfs2(int v){
  35.         cno[v]=cnt;
  36.         for(int u: gt[v])
  37.             if(cno[u]==-1)
  38.                 dfs2(u);
  39.     }
  40.  
  41.  
  42.     bool sat(){
  43.         vis.assign(n, 0);
  44.         for (int i = 0; i < n; ++i){
  45.             if(!vis[i])
  46.                 dfs1(i);
  47.         }
  48.  
  49.         cno.assign(n, -1);
  50.         cnt=0;
  51.         while (!st.empty()){
  52.             int u=st.top(); st.pop();
  53.             if(cno[u]==-1){
  54.                 dfs2(u);
  55.                 cnt++;
  56.             }
  57.         }
  58.  
  59.         assignment.clear();
  60.         for (int i = 0; i < n; i+=2){
  61.             if(cno[i]==cno[i+1]){
  62.                 return false;
  63.             }
  64.             if(cno[i]>cno[i+1]){
  65.                 assignment.emplace_back(i/2+1);
  66.             }
  67.         }
  68.         return true;
  69.     }
  70.  
  71.     vector<int> getAssignment(){
  72.         return assignment;
  73.     }
  74. };
  75.  
  76. int main(){
  77.     int T, tc = 0;
  78.     scanf("%d", &T);
  79.     while(T--){
  80.         printf("Case %d: ", ++tc);
  81.         int n, m, k;    scanf("%d %d %d", &n, &m, &k);
  82.         graph g(2*n);
  83.         for (int i = 0; i < m; ++i){
  84.             int tp, u, v;   scanf("%d %d %d",&tp, &u, &v);
  85.             u=2*--u;
  86.             v=2*--v;
  87.             if(tp==1){
  88.                 g.add_edge(u^1, v);
  89.                 g.add_edge(v^1, u);
  90.             }
  91.             else if(tp==2){
  92.                 g.add_edge(u^1, v^1);
  93.                 g.add_edge(v, u);
  94.             }
  95.             else if(tp==3){
  96.                 g.add_edge(u, v^1);
  97.                 g.add_edge(v, u^1);
  98.             }
  99.             else{
  100.                 g.add_edge(u^1, v);
  101.                 g.add_edge(v^1, u);
  102.                 g.add_edge(u, v^1);
  103.                 g.add_edge(v, u^1);
  104.             }
  105.         }
  106.         int mem[k][4];
  107.         for (int i = 0; i < k; ++i){
  108.             scanf("%d %d %d %d", &mem[i][0], &mem[i][1], &mem[i][2], &mem[i][3]);
  109.         }
  110.         bool psbl = true;
  111.         for (int i = 0; i < k; ++i){
  112.             psbl = false;
  113.             if(mem[i][0]==1){
  114.                 for (int j = 1; j < 4; ++j){
  115.                     int u=mem[i][j];
  116.                     u=2*--u;
  117.                     g.add_edge(u^1, u);
  118.                     if(g.sat()){
  119.                         psbl = true;
  120.                         // g.remove_edge(u^1, u);   //since it is valid, we shouldn't remove it
  121.                         break;
  122.                     }
  123.                     g.remove_edge(u^1, u);
  124.                 }
  125.             }
  126.             else{
  127.                 for (int j = 1; j < 4; ++j){
  128.                     int u=mem[i][j];
  129.                     u=2*--u;
  130.                     g.add_edge(u, u^1);
  131.                     if(g.sat()){
  132.                         psbl=true;
  133.                         // g.remove_edge(u, u^1);   //since it is valid, we shouldn't remove it
  134.                         break;
  135.                     }
  136.                     g.remove_edge(u, u^1);
  137.                 }
  138.             }
  139.             if(!psbl)   break; 
  140.         }
  141.         if(!psbl)   printf("Impossible.\n");
  142.         else{
  143.             printf("Possible");
  144.             vector<int> ans = g.getAssignment();
  145.             printf(" %d", (int)ans.size());
  146.             for(int u : ans)
  147.                 printf(" %d", u);
  148.             printf(".\n");
  149.         }
  150.     }
  151.     return 0;
  152. }
  153.  
  154. /*
  155. messages:
  156. type:1------ a or b = a'->b and b'->a
  157. type:2------ a or b' = a'->b' and b->a
  158. type:3------ a' or b' = a->b' and b->a'
  159. type:4------ a xor b = a'->b and b'->a and a->b' and b->a'
  160.  
  161. opinion:
  162. type:1------ a or a = a'->a
  163. type:2------ a' or a' = a->a'
  164. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement