Cod sursa(job #1713655)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 6 iunie 2016 09:01:05
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<cstdio>
#include<vector>
#define MAXN 100010
using namespace std;
vector<int> g[2*MAXN],gt[2*MAXN];
vector<int> order;
int n,seen[2*MAXN],which[2*MAXN],current=0;
int Not(int x){
    if(x<=n)
        return x+n;
    return x-n;
}
void FirstDFS(int node){
    int i;
    seen[node]=1;
    for(i=0;i<g[node].size();i++)
        if(seen[g[node][i]]==0)
            FirstDFS(g[node][i]);
    order.push_back(node);
}
void SecondDFS(int node){
    int i;
    which[node]=current;
    for(i=0;i<gt[node].size();i++)
        if(which[gt[node][i]]==0)
            SecondDFS(gt[node][i]);
}
int main(){
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    int m,i,a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        if(a<0)
            a=n-a;
        if(b<0)
            b=n-b;
        g[a].push_back(Not(b));
        g[b].push_back(Not(a));
        gt[Not(a)].push_back(b);
        gt[Not(b)].push_back(a);
    }
    for(i=1;i<=2*n;i++)
        if(seen[i]==0)
            FirstDFS(i);
    for(i=2*n-1;i>=0;i--)
        if(which[order[i]]==0){
            current++;
            SecondDFS(order[i]);
        }
    for(i=1;i<=n;i++)
        if(which[i]==which[i+n]){
            printf("-1");
            return 0;
        }
    for(i=1;i<=n;i++)
        if(which[i]>which[i+n])
            printf("0 ");
        else
            printf("1 ");
    return 0;
}