Cod sursa(job #1078538)

Utilizator hevelebalazshevele balazs hevelebalazs Data 12 ianuarie 2014 11:03:57
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#include <vector>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define N 100000
using namespace std;
int L[2*N],l;
bool COL[2*N+1],cool=true;
bool V[2*N+1];
bool* col=COL+N,*v=V+N;
vector<int>oo[2*N+1],OO[2*N+1];
vector<int>*o=oo+N,*O=OO+N;

void dfs1(int i){
    col[i]=true;
    int s=o[i].size();
    fr(j,0,s) if(!col[o[i][j]]) dfs1(o[i][j]);
    L[--l]=i;
    }
void dfs2(int i){
    col[i]=false;
    v[-i]=true;
    int s=O[i].size();
    fr(j,0,s) if(col[O[i][j]]) dfs2(O[i][j]);
    }

int main(){
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    int n,m,x,y;
    scanf("%i%i",&n,&m);
    int n1=n+1;
    fr(i,0,m){
        scanf("%i%i",&x,&y);
        o[-x].push_back(y);
        o[-y].push_back(x);
        O[x].push_back(-y);
        O[y].push_back(-x);
        }
    l=n<<1;
    fr(i,-n,n1){
        if(!i)continue;
        if(!col[i]) dfs1(i);
        }
    fr(i,0,2*n){
        if(v[-L[i]]||v[L[i]]) continue;
        if(col[L[i]]) dfs2(L[i]);
        }
    fr(i,1,n1) if(v[i]&&v[-i]){cool=false;break;}
    if(cool) fr(i,0,n)printf("%i ",v[i+1]);
    else printf("-1");
    return 0;
    }