Cod sursa(job #1542379)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 5 decembrie 2015 12:34:57
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define N 200005
#define D 100000
using namespace std;
vector <int> a[N],a2[N],L,cc;
int v[N],c[N];
int n,m;
int t;
void R()
{
   freopen("2sat.in","r",stdin);
   scanf("%d %d",&n,&m);
   int x,y,i,nx,ny;
   for(i=1; i<=m; i++)
   {
       scanf("%d %d",&x,&y);
       nx=x*-1;
       ny=y*-1;
       x+=D;
       y+=D;
       nx+=D;
       ny+=D;
       a[nx].push_back(y);
       a[ny].push_back(x);
       a2[y].push_back(nx);
       a2[x].push_back(ny);
   }
}
bool nusat=0;
void DFS(int k)
{
    v[k]=1;
    for(int i=0; i<a[k].size(); ++i)
        if(!v[a[k][i]])
        DFS(a[k][i]);
    L.push_back(k);
}
void DFS2(int k,int t)
{
    c[k]=t;
    cc.push_back(k);
    if(k<D && c[(D-k)+D]==t)
         nusat=1;
    if(k>D && c[D-(k-D)]==t ) nusat=1;
    for(int i=0; i<a2[k].size(); ++i)
        if(!c[a2[k][i]])
        DFS2(a2[k][i],t);
}
int sol[N];
void Solve()
{
    int i,nod;
    for(i=D-n-1; i<=D+n; i++) sol[i]=-1;
    for(i=0; i<cc.size(); i++ )
    {
        if(cc[i]<D && sol[(D-cc[i])+D]>-1)
            sol[cc[i]]=1-sol[(D-cc[i])+D];
        else if(cc[i]>D && sol[D-(cc[i]-D)]>-1)
            sol[cc[i]]=1-sol[D-(cc[i]-D)];
       // else if (L[i]<D) sol[L[i]+]=1;
        else sol[cc[i]]=0;

    }
}
int main()
{
    R();
    int i;
    for(i=D-n-1; i<=D+n; i++)
        if(!v[i] && i!=D)
        DFS(i);
        t=1;
    for(i=L.size()-1; i>0; i--)
        if(!c[L[i]])
    {
        DFS2(L[i],t);
        t++;
    }
    freopen("2sat.out","w",stdout);
    if(nusat)
    {
        printf("-1\n");
        return 0;
    }
    Solve();
    //freopen("2sat.out","w",stdout);
    for(i=D+1; i<=D+n; i++)
        printf("%d ",sol[i]);
        //cout<<sol[i]<<"\n";
    return 0;
}