Cod sursa(job #1975804)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 2 mai 2017 00:24:31
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;

#define FILE_IO
#define node(x) ( (x) > 0 ? (x) : -(x) + N)
#define value(x) ( (x) <= N ? (x) : -(x) + N)

int N, M;
vector <int> edg[200005], redg[200005];
int O, ord[200005];
int f[200005];
int g[200005];
int ans[200005];
int v[200005];

int C, cmp[200005];
vector <int> scc[200005];

void DFS1(int nod)
{
    if(f[nod] == 1) return;
    f[nod] = 1;
    for(auto nxt: edg[nod])
        DFS1(nxt);
    ord[++O] = nod;
}

void DFS2(int nod)
{
    if(f[nod] == 2) return;
    f[nod] = 2;
    cmp[nod] = C;
    scc[C].push_back(nod);
    for(auto nxt: redg[nod])
        DFS2(nxt);
}

void DFS3(int nod)
{
    if(ans[nod] != -1)  return;

    int x = scc[nod][0];
    int rev = x >= N ? x - N : x + N;
    ans[nod] = 0;
    ans[ cmp[rev] ] = 1;

    for(auto x: scc[nod])
        for(auto nxt: edg[x])
            if(cmp[nxt] != cmp[x])
            {
                g[ cmp[nxt] ]--;
                if(g[ cmp[nxt] ] == 0)
                    DFS3(cmp[nxt]);
            }
}

int main()
{
    #ifdef FILE_IO
    freopen("2sat.in", "r", stdin);
    freopen("2sat.out", "w", stdout);
    #endif

    scanf("%d%d", &N, &M);
    for(int i = 1; i <= M; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        edg[ node(-x) ].push_back( node(y) );
        edg[ node(-y) ].push_back( node(x) );
    }

    for(int i = 1; i <= 2 * N; i++) DFS1(i);
    for(int i = 1; i <= 2 * N; i++)
        for(auto nxt: edg[i])
            redg[nxt].push_back(i);
    reverse(ord + 1, ord + 2 * N + 1);
    for(int i = 1; i <= 2 * N; i++)
        if(f[ ord[i] ] != 2)
            ++C, DFS2(ord[i]);

    for(int i = 1; i <= N; i++)
        if(cmp[node(i)] == cmp[node(-i)])
        {
            printf("-1\n");
            return 0;
        }

    for(int i = 1; i <= 2 * N; i++)
        for(auto nxt: edg[i])
            if(cmp[i] != cmp[nxt])  g[ cmp[nxt] ]++;
    for(int i = 1; i <= C; i++) ans[i] = -1;

    for(int i = 1; i <= C; i++)
        if( g[i] == 0 )
            DFS3(i);

    for(int i = 1; i <= C; i++)
        for(auto x: scc[i])
            v[x] = ans[i];

    for(int i = 1; i <= N; i++)
        printf("%d ", v[i]);

    return 0;
}