Cod sursa(job #2289968)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 25 noiembrie 2018 16:28:22
Problema 2SAT Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
#define N 100010
#define N2 (N*2)
#define g (graf+N)
#define comp (componenta+N)
#define val (valori+N)
#define niv (nivel+N)
#define low (loww+N)
#define inst (instt+N)

using namespace std;

int n, m;
vector<int> graf[N2];
int st[N2];
int lst;
int componenta[N2];
int valori[N2];
int nivel[N2];
int loww[N2];
int instt[N2];
int ind;
int nrcomp = 0;

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

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[-a].push_back(b);
        g[-b].push_back(a);
    }
    for(int i = -n; i <= n; i++)
    {
        if(i == 0) continue;
        val[i] = -1;
        if(niv[i] == 0)
            dfs(i);
    }
    for(int i = 1; i <= n; i++)
    {
        if(comp[i] == comp[-i])
        {
            printf("-1");
            return 0;
        }
    }
    for(int i = 1; i <= n; i++)
        val[i] = comp[i] < comp[-i] ? 1 : 0;
    for(int i = 1; i <= n; i++)
        printf("%d ", val[i]);
    return 0;
}