Cod sursa(job #2290005)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 25 noiembrie 2018 17:22:37
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <bits/stdc++.h>
#define N 100010
#define N2 (N*2)

using namespace std;

int n, m;
vector<int> g[N2];
int st[N2];
int lst;
int comp[N2];
int val[N2];
int niv[N2];
int low[N2];
int inst[N2];
int ind;
int nrcomp = 0;

int id(int n)
{
    return n < 0 ? (-n * 2 - 1) : (n * 2 - 2);
}

void dfs(int nod)
{
    if(niv[nod] != -1) return;
    st[lst++] = nod;
    niv[nod] = ++ind;
    low[nod] = niv[nod];
    inst[nod] = 1;
    for(auto next : g[nod])
    {
        dfs(next);
        if(inst[next])
            low[nod] = min(low[nod], low[next]);
    }
    if(niv[nod] == low[nod])
    {
        while(st[lst - 1] != nod)
        {
            comp[st[lst - 1]] = nrcomp;
            inst[st[lst - 1]] = 0;
            lst--;
        }
        comp[st[lst - 1]] = nrcomp;
        inst[st[lst - 1]] = 0;
        lst--;
        nrcomp++;
    }
}

pair<int, int> v[100010];
int main()
{
    freopen("2sat.in", "r", stdin);
    freopen("2sat.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; i++)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        g[id(-a)].push_back(id(b));
        g[id(-b)].push_back(id(a));
        v[i] = make_pair(a, b);
    }
    for(int i = 0; i < 2 * n; i++)
        niv[i] = -1;
    for(int i = 0; i < 2 * n; i++)
    {
        dfs(i);
    }
    for(int i = 1; i <= n; i++)
    {
        if(comp[id(i)] == comp[id(-i)])
        {
            printf("-1");
            return 0;
        }
    }
    for(int i = 1; i <= n; i++)
        val[i] = comp[id(i)] < comp[id(-i)] ? 1 : 0;
    for(int i = 1; i <= n; i++)
        printf("%d ", val[i]);
    return 0;
}