Cod sursa(job #1225326)

Utilizator sebinechitasebi nechita sebinechita Data 2 septembrie 2014 13:57:55
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
#define MAX 200010

vector<int> G[MAX*2];
typedef vector <int> :: iterator iter;
bool viz[MAX*2], rez[MAX*2];

#define viz (viz + MAX)
#define rez (rez + MAX)
#define G (G + MAX)


int e1[2*MAX], e2[2*MAX];

int st[2*MAX];
int n;
void df(int nod)
{
    viz[nod]=1;
    for(iter it=G[nod].begin();it!=G[nod].end();it++)
    {
        if(!viz[*it])
            df(*it);
    }
    st[++st[0]]=nod;
}

int main()
{
    int m, i, x, y;
    fin>>n;
    fin>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        G[-x].push_back(y);
        G[-y].push_back(x);
        e1[i]=x;
        e2[i]=y;
    }
    for(i=1;i<=n;i++)
        if(!viz[i])
            df(i);
    for(i=1;i<=n;i++)
        if(!viz[-i])
            df(-i);
    for(i=2*n;i>=1;i--)
    {
        if(!rez[st[i]] && !rez[-st[i]])
        {
            rez[-st[i]]=1;
        }
    }
    bool imp=0;
    for(i=1;i<=m;i++)
    {
        if(!rez[e1[i]] && !rez[e2[i]])
            imp=1;
    }
    if(imp)
    {
        fout<<"-1\n";
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            fout<<rez[i]<<" ";
        }
    }
}