Cod sursa(job #993014)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 2 septembrie 2013 23:40:01
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
using namespace std;
typedef struct celula{
           int nod;
           celula *next;
           }*lista;
lista graf[200005],v,tgraf[200005];
int i,n,m,x,y,comp[200005],st[200005],levst,nrcomp,sol[200005];
bool viz[200005],ok=1;

int negat(int x) { if (x<0) return(-x); else return(n+x); }
int pozitiv(int x) { if (x<0) return(n-x); else return(x); }
int opus(int x) { if (x>n) return(x-n); else return(n+x); }

void dfs(int nod) {
     viz[nod]=1;
      for (lista p=graf[nod]; p; p=p->next)
       if (viz[p->nod]==0) dfs(p->nod);
     ++levst; st[levst]=nod;
}

void dfs1(int nod) {
     comp[nod]=nrcomp;
      if (sol[nod]) ok=0;
     sol[opus(nod)]=1;
     for (lista p=tgraf[nod]; p; p=p->next) 
      if (comp[p->nod]==0&&ok) dfs1(p->nod);
}

int main(void) {
    ifstream fin("2sat.in");
    ofstream fout("2sat.out");
    fin>>n>>m;
    for (i=1; i<=m; ++i) {
           int x1,y1; fin>>x1>>y1; x=negat(x1); y=pozitiv(y1);
           v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
           v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
           x=negat(y1); y=pozitiv(x1);
           v=new celula; v->nod=y; v->next=graf[x]; graf[x]=v;
           v=new celula; v->nod=x; v->next=tgraf[y]; tgraf[y]=v;
           }
    for (i=1; i<=2*n; ++i) 
     if (viz[i]==0) dfs(i);
    for (i=2*n; i>=1; --i)
     if (comp[st[i]]==0&&comp[opus(st[i])]==0) { ++nrcomp; dfs1(st[i]); }
    if (ok==0) fout<<"-1";
     else for (i=1; i<=n; ++i) fout<<sol[i]<<" ";
 return(0);
}