Cod sursa(job #2653513)

Utilizator numecompletnume complet numecomplet Data 28 septembrie 2020 12:39:37
Problema 2SAT Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define NMAX 100009
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector<int>g[2*NMAX];
vector<int>gt[2*NMAX];
stack<int>H;
void citire();
vector<int> gr[2*NMAX];
int n,m,nrc,i,j;
int val[NMAX];
int pun(int k)
{
 if(k<0)
     return  k=-k+n;
 return k;
}
int neg(int k)
{
  if(k>n)
      return k-n;
  return k+n;
}
int uz[2*NMAX];
void dfs(int k)
{
   int i;
   uz[k]=1;
   for(i=0;i<g[k].size();i++)
    {
     int vec=g[k][i];
     if(!uz[vec])
            dfs(vec);
    }
    H.push(k);
}
void dfs1(int k)
{
 int i;
 uz[k]=nrc;
 for(i=0;i<gt[k].size();i++)
    {
     int vec=gt[k][i];
     if(!uz[vec])
        dfs1(vec);
    }
}
///gata
int main()
{citire();
 for(i=1;i<=n*2;i++)
      if(!uz[i])
       {dfs(i);}

 memset(uz,0,sizeof(uz));

 while(!H.empty())
    {
     int act=H.top();
     H.pop();
     if(!uz[act])
       {nrc++; dfs1(act);}
    }



for(i=1;i<=n;i++)
      if(uz[i]==uz[i+n])
{fout<<-1;return 0;}
 for(i=1;i<=2*n;i++)
     for(j=0;j< g[i].size();i++)
        {
         int vec=g[i][j];
         if(uz[i]!=uz[vec])
            gr[i].push_back(vec);
        }
for(i=1,j=nrc;i<j;i++,j--)
{val[i]=0;val[j]=1;}
 for(i=1;i<=n;i++)
      fout<< val[  uz[i]]<<" ";
    return 0;
}

void citire()
{
 int i;
 int x,y;
 fin>>n>>m;
 for(i=1;i<=m;i++)
    {
     fin>>x>>y;
     int cx=pun(x);
     int cy=pun(y);
     int nx,ny;
     nx=neg(cx);
     ny=neg(cy);
     g[nx].push_back(cy);
     gt[cy].push_back(nx);
     g[ny].push_back(cx);
     gt[cx].push_back(ny);

    }
}