Cod sursa(job #1542880)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 5 decembrie 2015 19:13:08
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#include <vector>
#include <stack>

using namespace std;

struct nod
{
    int val;
};

stack< int > s;
vector < int > lista2[200010],lista[200010];
int n,m,nrc,marcat[200010],viz[200010];

int negat(int a)
{
    if(a > n) return n*2 - a + 1;
    return 2*n - a + 1;
}

void dfs(int n)
{
    unsigned int i;
    viz[n] = 1;

    for(i = 0; i < lista[n].size(); i++)
        if(viz[lista[n][i]] == 0) dfs(lista[n][i]);
    s.push(n);
}

void dfs2(int n)
{
    unsigned int i;
    viz[n] = 0;

    for(i=0; i < lista2[n].size(); i++)
        if(viz[lista2[n][i]] == 1) dfs2(lista2[n][i]);
    marcat[n]=nrc;
}

int opus(int nr)
{
    if(nr >= n) return nr - n;
    return nr + n + 1;
}
int main()
{
    freopen("2sat.in","r",stdin);
    freopen("2sat.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,a,b;
    for(i=0; i<m; i++)
    {
        scanf("%d %d",&a,&b);
        if (a < 0) a = a + n + 1;
        else if(a > 0) a = a + n;
        if (b < 0) b = b + n + 1;
        else if(b > 0) b = b + n;
        lista[negat(a)].push_back(b);
        lista[negat(b)].push_back(a);
        lista2[b].push_back(negat(a));
        lista2[a].push_back(negat(b));
    }

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

    nrc=0;
    int x;
    while(!s.empty())
    {
        x = s.top();

        if (viz[x])
        {
            nrc++;
            dfs2(x);
        }
        s.pop();
    }

    for (i=1; i<=n; i++)
    {
        if(marcat[i]==marcat[ negat(i) ])
        {
            printf("-1\n");
            return 0;
        }
    }

    for(i=n+1; i<=2*n; i++)
    {
        if(marcat[i] < marcat[negat(i)] ) printf("0 ");
        else printf("1 ");
    }
    printf("\n");
    return 0;
}