Cod sursa(job #1509303)

Utilizator timicsIoana Tamas timics Data 23 octombrie 2015 18:18:22
Problema Componente tare conexe Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<stdio.h>
#include<vector>
#include<iostream>
using namespace std;

int M,x,y;

int N,s[210000],curr,c[210000],sol[210000];
vector<int> m[210000],n[210000],v[210000];
bool viz[210000],vz[210000];

// 2*k is v[k], 2*k+1 is -v[k], 1 is false, 2 is true, m is normal graph, n is complementary
void dfs(int x) {
    viz[x] = 1;
    for(auto y: m[x]) {
        if(!viz[y]) dfs(y);
    }
    s[++curr] = x;
}

void dfs2(int x, int comp) {
    viz[x] = 0; c[x] = comp;
    v[comp].push_back(x);
    for(int i=0;i<n[x].size();++i) {
        if(viz[n[x][i]]) {
            dfs2(n[x][i],comp);
        }
    }
}

inline int ng(int x) {
    if(x%2) return x-1; return x+1;
}

bool f(int x, int val) {
    vz[x] = 1;
    for(auto y: v[x]) {
        if(sol[y] && sol[y]!=val) return false;
        sol[y] = val;
    }
    for(auto y: v[x]) {
        y = ng(y);
        if(sol[y] && sol[y]!=3-val) return false;
        if(!sol[y]) return f(c[y],3-val);
    }
    return true;
}

bool sat() {
    int comp = 0;
    for(int i=2;i<=2*N+1;++i) {
        if(!viz[i]) dfs(i);
    }
    for(int i=curr;i>=1;--i) {
        if(viz[s[i]]) {
            dfs2(s[i],++comp);
        }
    }
    for(int i=1;i<=comp;++i) {
        if(!vz[i]) {
            if(!f(i,1)) return false;
        }
    }
    return true;
}

int main() {
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=0;i<M;++i) {
        scanf("%d%d",&x,&y);
        int a = 0, b = 0;
        if(x < 0) {
            a = 1;
            x = -x;
        }
        if(y < 0) {
            b = 1;
            y = -y;
        }
        m[2*x+(1-a)].push_back(2*y+b);
        m[2*y+(1-b)].push_back(2*x+a);
        n[2*y+b].push_back(2*x+(1-a));
        n[2*x+a].push_back(2*y+(1-b));
    }
    if(!sat()) {
        printf("-1");
    } else {
        for(int i=2;i<=2*N;i+=2) {
            printf("%d ",sol[i]-1);
        }
    }

    return 0;
}