Cod sursa(job #1975993)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 2 mai 2017 16:46:38
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("2sat.in");
ofstream fout ("2sat.out");

const int Nmax = 2e5 + 5;

vector<int> ord;
int n, m, x, y, i, comp[Nmax], nrc;
vector<int> v[Nmax], vv[Nmax];

int id(int x)
{
    if(x<0) return x + 2*n;
    return x-1;
}

void add_edge(int x, int y)
{
    v[id(-x)].push_back(id(y)); vv[id(y)].push_back(id(-x));
    v[id(-y)].push_back(id(x)); vv[id(x)].push_back(id(-y));
}

void dfs1(int node)
{
    comp[node] = 1;
    for(auto it : v[node])
        if(!comp[it]) dfs1(it);
    ord.push_back(node);
}

void dfs2(int node)
{
    comp[node] = nrc;
    for(auto it : vv[node])
        if(!comp[it]) dfs2(it);
}

int main()
{
    fin >> n >> m;
    while(m--)
    {
        fin >> x >> y;
        add_edge(x, y);
    }

    memset(comp, 0, sizeof(comp));
    for(i=0; i<2*n; ++i)
        if(!comp[i]) dfs1(i);

    memset(comp, 0, sizeof(comp));
    for(i=2*n-1; i>=0; --i)
        if(!comp[ord[i]]) ++nrc, dfs2(ord[i]);

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

    for(i=1; i<=n; ++i) fout << ( comp[id(i)] > comp[id(-i)] ) << ' '; fout << '\n';

    return 0;
}