Cod sursa(job #1966667)

Utilizator lflorin29Florin Laiu lflorin29 Data 15 aprilie 2017 14:41:31
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2 * 1e5 + 9;

int n, m, comp_id, komp[MAX_N];
bool viz[MAX_N];
vector<int>g[MAX_N], gt[MAX_N];
vector<int>ord;

int non(int x)
{
    return x ^ 1;
}

int get(int x)
{
    return x < 0 ? -2 * x : 2 * x + 1;
}

void Read()
{
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; ++i)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        a = get (a), b = get (b);
        g[non(a)].push_back(b);
        g[non(b)].push_back(a);
        gt[b].push_back(non(a));
        gt[a].push_back(non(b));
    }
}

void Dfs1(int nod)
{
    viz[nod] = 1;

    for (auto i : g[nod])
        if (!viz[i])Dfs1(i);

    ord.push_back(nod);
}

void Dfs2(int nod)
{
    komp[nod] = comp_id;
    viz[nod] = 1;

    for (auto i : gt[nod])
        if (!viz[i])Dfs2(i);
}

void TareKonexe()
{
    for (int i = 1; i <= 2 * n; ++i)
        if (!viz[i])Dfs1(i);

    memset(viz, 0, sizeof viz);

    while (!ord.empty())
    {
        int nod = ord.back();
        ord.pop_back();

        if (!viz[nod])
        {
            ++comp_id;
            Dfs2(nod);
        }
    }
}

void Solve()
{
    for (int i = -n; i <= n; ++i)
        if (i != 0 && komp[get(i)] == komp[get(i) ^ 1])
        {
            printf("%d", -1);
            return;
        }

    for (int i = 1;i<=n;++i)
        if (komp[2 * i] > komp[2 * i - 1])printf("%d ", 1);
        else printf("%d ", 0);
}

int main()
{
    freopen("2sat.in", "r", stdin);
    freopen("2sat.out", "w", stdout);
    Read();
    TareKonexe();
    Solve();
}