Cod sursa(job #1247208)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 22 octombrie 2014 13:09:53
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 200010
using namespace std;
vector<int>v[N],c,s;
vector<vector<int>>C;
int n,m,x,y,X,Y,i,j,viz[N],back[N],nc,Comp[N],Val[N],k;
void df(int);
int main()
{
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(;m;m--)
    {
        scanf("%d%d",&x,&y);
        if(x<0)x=n-x;
        if(y<0)y=n-y;
        X=x>n?x-n:x+n;
        Y=y>n?y-n:y+n;
        v[X].push_back(y);
        v[Y].push_back(x);
    }
    for(i=1;i<=2*n;i++)
        if(!viz[i])
            df(i);
    for(i=1;i<=n;i++)
        if(Comp[i]==Comp[i+n])
        {
                printf("-1");
                return 0;
        }
    for(i=nc-1;i>=1;i--)
    {
        if(!C[i].size())continue;
        x=C[i].front();
        X=x>n?x-n:x+n;
        j=Comp[X];
        for(auto it:C[j])
            Val[it]=1;
        C[j].resize(0);
    }
    for(i=1;i<=n;i++)
        printf("%d ",Val[i]);
    return 0;
}
void df(int nod)
{
    viz[nod]=++k;
    back[nod]=k;
    s.push_back(nod);
    for(auto vec:v[nod])
    {
        if(!viz[vec])
            df(vec);
        if(viz[vec]>0)
            back[nod]=min(back[nod],back[vec]);
    }
    if(viz[nod]==back[nod])
    {
        c.resize(0);
        do
        {
            c.push_back(s.back());
            viz[s.back()]=-1;
            Comp[s.back()]=nc;
            s.pop_back();
        }
        while(c.back()!=nod);
        C.push_back(c);
        nc++;

    }
}