Cod sursa(job #1414064)

Utilizator danalex97Dan H Alexandru danalex97 Data 2 aprilie 2015 12:18:28
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

ifstream F("2sat.in");
ofstream G("2sat.out");

const int N = 200010;

int n,m,ans[N],mark[N];
vector<int> v[N],w[N],stk;

int neg(int x)
{
    return x <= n ? n + x : x - n;
}

void tsort(int x)
{
    mark[x] = 1;
    for (int i=0;i<int(v[x].size());++i)
    {
        int y = v[x][i];
        if ( mark[y] == 0 )
            tsort(y);
    }
    stk.push_back(x);
}

int sol = 1;

void solve(int x)
{
    if ( ans[x] ) return void(sol = 0);

    mark[x] = 1;
    ans[neg(x)] = 1;
    ans[x] = 0;

    for (int i=0;i<int(w[x].size());++i)
    {
        int y = w[x][i];
        if ( mark[y] == 0 )
            solve(y);
    }
}

int main()
{
    F>>n>>m;
    for (int i=1,x,y;i<=m;++i)
    {
        F>>x>>y;
        if ( x < 0 )
            x = -x;
        else
            x += n;
        if ( y < 0 )
            y = -y;
        else
            y += n;

        v[neg(x)].push_back(y);
        v[neg(y)].push_back(x);

        w[y].push_back(neg(x));
        w[x].push_back(neg(y));
    }
    for (int i=1;i<=2*n;++i)
        if ( mark[i] == 0 )
            tsort(i);
    memset(mark,0,sizeof(mark));

    while ( !stk.empty() )
    {
        int x = stk.back();
        stk.pop_back();

        if ( mark[x] == 0 && mark[neg(x)] == 0 )
            solve(x);
    }

    if ( sol == 0 )
    {
        G<<"-1\n";
        return 0;
    }

    for (int i=n+1;i<=2*n;++i)
        G<<ans[i]<<' ';
    G<<'\n';
}