Cod sursa(job #2230336)

Utilizator DjokValeriu Motroi Djok Data 9 august 2018 19:14:54
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int nod;
    lnod *next;
}*nod;

int i,x,y,n,m,e[200005],nr;
bool viz[200005],rs[200005],u;
nod lda[200005],ldat[200005];

void add(int x,nod &y) {
    nod p=new lnod;
    p->nod=x;
    p->next=y;
    y=p;
}

int Neg(int x) { return (x<=n ? x+n:x-n); }

void dfs(int x) {
    viz[x]=1;
    for(nod p=lda[x];p;p=p->next)
    if(!viz[p->nod]) dfs(p->nod);
    e[++nr]=x;
}

void tdfs(int x) {
    viz[x]=0;

    if(rs[x]) u=1; else rs[Neg(x)]=1;

    for(nod p=ldat[x];p && !u;p=p->next)
    if(viz[p->nod]) tdfs(p->nod);
}

int main()
{
  ifstream cin("2sat.in");
  ofstream cout("2sat.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  for(cin>>n>>m;m;--m)
  {
    cin>>x>>y;

    if(x<0) x*=-1; else x+=n;
    if(y<0) y*=-1; else y+=n;

    add(x,lda[Neg(y)]);
    add(y,lda[Neg(x)]);
    add(Neg(x),ldat[y]);
    add(Neg(y),ldat[x]);
  }

  for(i=1;i<=n+n;++i) if(!viz[i]) dfs(i);

  for(i=n+n;i;--i) if(viz[e[i]] && viz[Neg(e[i])]) tdfs(e[i]);

  if(u) return cout<<"-1\n",0;

  for(i=n+1;i<=n+n;++i) cout<<rs[i]<<" \n"[i==n];

 return 0;
}