Cod sursa(job #2417241)

Utilizator GoogalAbabei Daniel Googal Data 29 aprilie 2019 12:21:30
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>

using namespace std;

#define inv(a) (a<=n ? a+n : a-n)
#define NMAX 200006
#define pb push_back

vector<int> v[NMAX],vt[NMAX];

int sol[NMAX],t[NMAX],nrt,n,m;
char viz[NMAX];


void dfs(int nod)
{
    viz[nod]=1;

    int i,vec,lim=v[nod].size();

    for(i=0; i<lim; i++)
        if(!viz[vec=v[nod][i]])
            dfs(vec);

    t[++nrt]=nod;
}

void dfs2(int nod)
{
    if(sol[nod]==1)
    {
        sol[0]=-1;
        return ;
    }

    viz[nod]=1;
    sol[inv(nod)]=1;

    int i,vec,lim=vt[nod].size();

    for(i=0; i<lim; i++)
        if(!viz[vec=vt[nod][i]])
            dfs2(vec);
}

int main ()
{
    int i,a,b;

    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&a,&b);

        if(a<0)
            a=n-a;

        if(b<0)
            b=n-b;

        v[inv(a)].pb(b);
        v[inv(b)].pb(a);

        vt[b].pb(inv(a));
        vt[a].pb(inv(b));
    }
    for(i=1; i<=2*n; i++)
        if(!viz[i])
            dfs(i);

    memset(viz,0,sizeof(viz));

    for(i=2*n; i>=1; i--)
        if(!viz[t[i]] && !viz[inv(t[i])])
            dfs2(t[i]);

    if(sol[0]==-1)
        printf("-1\n");
    else
    {
        for(i=1; i<=n; i++)
            printf("%d ",sol[i]);

        printf("\n");
    }

    return 0;
}