Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. /*
  2.     L3-2-SAT
  3.     Agata Latacz
  4. */
  5.  
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <stack>
  10. /*rgaf dwudzielny, ludzie z partii: xi oraz ~xi
  11.  1. Budujemy graf.
  12.  2. Silnie spójnie składowe
  13.  3.2. szukamy Silnie spójnych składowych, za pomocą DFS-a z zapamiętaniem wierzchołków na stosie,
  14.   a następnie DFS w kolejności spamiętanych wierzchołków na grafie odwróconym
  15.  4.
  16.  
  17.   nieparzysty  xi
  18.   parzysty    ~xi
  19. */
  20. using namespace std;
  21. vector<int> V[200001];
  22. vector<int> A[200001];
  23. vector<int> SK[200001];
  24. vector<int> Wynik;
  25. int COL[200001];
  26. int SCC[200001];
  27. int W[200001];
  28. bool BOOL[200001];
  29. stack<int>Stos;
  30. stack<int>GONE;
  31. int DFS(int x)
  32. {
  33.     //printf("DFS, x: %d\n",x);
  34.     COL[x]=1;
  35.     for(int i=0;i<V[x].size(); i++){
  36.         int b=V[x][i];
  37.         if(COL[b]==0)DFS(b);
  38.     }
  39.     Stos.push(x);
  40.     GONE.push(x);
  41. }
  42.  
  43. bool DFS2(int x, int col)
  44. {
  45.     SK[col].push_back(x);
  46.     //printf("DFS2, x: %d, col: %d\n", x, col);
  47.     SCC[x]=col;
  48.     if(SCC[(x+1)/2*2-(x+1)%2]==SCC[x])return false;
  49.     bool CZY=1;
  50.     for(int i=0;i<A[x].size();i++){
  51.         int b=A[x][i];
  52.         if(SCC[b]==0){if(DFS2(b,col)==0) CZY=0;}
  53.     }
  54.     return CZY;
  55. }
  56.  
  57. void WYK(int a){
  58.    
  59.    
  60.    
  61.    
  62. }
  63.    
  64. int main()
  65. {
  66.     int n,m;
  67.     scanf("%d %d",&n,&m);
  68.     for(int i=0;i<m;i++){
  69.         int x,y;
  70.         scanf("%d %d",&x,&y);
  71.         int nx=(x+1)/2*2-(x+1)%2;
  72.         int ny=(y+1)/2*2-(y+1)%2;
  73.         V[x].push_back(ny);
  74.         V[y].push_back(nx);
  75.         A[nx].push_back(y);
  76.         A[ny].push_back(x);
  77.     }
  78.     for(int i=1;i<=2*n;i++)
  79.             if(COL[i]==0)DFS(i);   
  80.    
  81.     int s=1;
  82.     bool O=1;
  83.     while(!Stos.empty()){
  84.         W[s]=-1;
  85.         int a=Stos.top();
  86.         Stos.pop();
  87.         if(DFS2(a,s)==0){printf("NIE\n");O=0;break;}
  88.         s++;
  89.     }
  90.     s--;
  91.     if(O)
  92.     {
  93.         while(!GONE.empty())
  94.         {
  95.             int a=GONE.top();
  96.             GONE.pop();
  97.             if(W[SCC[a]]==0)Wynik.push_back(a);
  98.             if(BOOL[SCC[a]]==0){
  99.                 if(W[SCC[a]]!=-1)
  100.                     for(int i=0;i<SK[SCC[a]].size();i++)
  101.                         W[SCC[(a+1)/2*2-(a+1)%2]]=(W[SCC[a]]+1)%2;
  102.                 else
  103.                 {
  104.                     W[SCC[a]]=1;
  105.                     for(int i=0;i<SK[SCC[a]].size();i++)
  106.                         W[SCC[(a+1)/2*2-(a+1)%2]]=(W[SCC[a]]+1)%2;
  107.                 }
  108.             }
  109.         }
  110.         sort(Wynik.begin(), Wynik.end());
  111.         for(int i=0;i<Wynik.size();i++)
  112.             printf("%d\n",Wynik[i]);
  113.        
  114.        
  115.     }
  116. return 0;  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement