Cod sursa(job #1936918)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 23 martie 2017 15:52:27
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <stack>
#define nmax 200005
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[nmax],p[nmax];
bitset <nmax> b;
stack <int> s;
int n,m,sol[nmax];

int cod(int x)
{
    if (x<0)
        return n-x;
    return x;
}
int opus(int x)
{
    if (x<=n)
        return x+n;
    return x-n;
}
void dfs(int x)
{
    int i,y;
    b[x]=1;
    for (i=0;i<v[x].size();i++) {
        y=v[x][i];
        if (b[y]==0)
            dfs(y);
        s.push(x);
    }
}
void dft(int x)
{
    if (sol[x]) {
        sol[0]=-1;
        return ;
    }
    int i,y;
    sol[opus(x)] = 1;
    b[x]=0;
    for (i=0;i<p[x].size();i++) {
        y=p[x][i];
        if (b[y]==1)
            dft(y);
    }
}
void implic(int x,int y)
{
    v[cod(x)].push_back(cod(y));
    p[cod(y)].push_back(cod(x));
}
int main()
{
    int i,j,x,y;
    f>>n>>m;
    for (i=1;i<=m;i++) {
        f>>x>>y;
        implic(-x,y);
        implic(-y,x);
    }
    for (i=1;i<=2*n;i++)
        if (b[i]==0)
            dfs (i);

    while (!s.empty()) {
        i=s.top();
        s.pop();
        if (b[i]==1&&b[opus(i)]==1)
            dft(i);
    }

    if (sol[0]==-1) {
        g<<-1<<'\n';
        return 0;
    }
    for (i=1;i<=n;i++)
        g<<sol[i]<<' ';

    return 0;
}