Cod sursa(job #992975)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 2 septembrie 2013 22:44:02
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.58 kb
#include<fstream>
using namespace std;
typedef struct celula{
           int nod;
           celula *next;
           }*lista;
lista graf[200005],v,tgraf[200005],gtc[200005],tgtc[200005];
int i,n,m,x,y,comp[200005],st[200005],levst,nrcomp,gin[200005],gout[200005],adevar[200005];
bool viz[200005];

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); }

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;
     for (lista p=tgraf[nod]; p; p=p->next) 
      if (comp[p->nod]==0) dfs1(p->nod);
}

bool nuemuchia(int i, int j) {
     bool ok=1;
      for (lista p=gtc[i]; p; p=p->next) 
       if (p->nod==j) { ok=0; break; }
      return(j);
}

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;
           }
    n*=2; bool ok=1;
    for (i=1; i<=n; ++i) 
     if (viz[i]==0) dfs(i);
    for (i=n; i>=1; --i)
     if (comp[st[i]]==0) { ++nrcomp; dfs1(st[i]); }
    
    for (i=1; i<=n; ++i)
     for (v=graf[i]; v; v=v->next)
      if (comp[i]!=comp[v->nod]&&nuemuchia(i,v->nod)) { 
         ++gout[i]; ++gin[v->nod];
           lista p=new celula; p->nod=comp[v->nod]; p->next=gtc[comp[i]]; gtc[comp[i]]=p;
             p=new celula; p->nod=comp[i]; p->next=tgtc[comp[v->nod]]; tgtc[comp[v->nod]]=p;
            }
      else if (v->nod-n==i) ok=0;
    if (ok==0) { fout<<"-1"; return(0); }
   
    while (ok) {
          ok=0;
          for (i=1; i<=nrcomp; ++i)
           if (viz[i]==1&&gout[i]==0) adevar[i]=1;
          for (i=1; i<=nrcomp; ++i)
           if (viz[i]==1&&gin[i]==0) {
                                     ok=1; viz[i]=0;
                                     for (lista p=gtc[i]; p; p=p->next) --gin[p->nod];
                                     }
           else if (viz[i]==1&&gout[i]==0) {
                      viz[i]=0; ok=1;
                      for (lista p=tgtc[i]; p; p=p->next) --gout[p->nod];
                      }
           }
    for (i=1; i<=n/2; ++i) fout<<adevar[comp[i]]<<" ";
 return(0);
}