Cod sursa(job #1027475)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 12 noiembrie 2013 20:06:04
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>
#include <vector>

#define maxn 200001
#define vint vector<int>::iterator

using namespace std;

ifstream fin("2sat.in");
ofstream fout("2sat.out");

vector<int> G[maxn],CC[maxn];
int index[maxn],lowlink[maxn],stack[maxn];
bool is_in_stack[maxn],atr[maxn];
int n,m,a,b,current,t,na,nb,nr;

void Tarjan (int x)
{
    index[x] = ++current;
    lowlink[x] = index[x];
    stack[++t] = x;
    is_in_stack[x] = 1;

    for (vint it = G[x].begin(); it!=G[x].end(); ++it)
    {
        if (!index[*it])
        {
            Tarjan (*it);
            lowlink[x] = min (lowlink[x],lowlink[*it]);
        }
        else if (is_in_stack[*it])
        {
            lowlink[x] = min (lowlink[x],lowlink[*it]);
        }
    }

    if (index[x] == lowlink[x])
    {
        ++nr;

        while (stack[t]!=x)
        {
            CC[nr].push_back (stack[t]);
            is_in_stack[stack[t]]=0;
            --t;
        }
        CC[nr].push_back (x);
        is_in_stack[x]=0;
        --t;
    }
}

int main()
{
    fin>>n>>m;

    for (int i=1; i<=m; ++i)
    {
        fin>>a>>b;

        if (a < 0)
        {
            na = -a;
            a = na + n;
        }
        else
        {
            na = a + n;
        }

        if (b < 0)
        {
            nb = -b;
            b = -b + n;
        }
        else
        {
            nb = b + n;
        }

        G[na].push_back (b);
        G[nb].push_back (a);
    }

    for (int i=1; i<=2*n; ++i)
    {
        if (!index[i])
            Tarjan (i);
    }

    for (int i=nr; i>=1; --i)
    {
        if (atr[*CC[i].begin()] != 1)
        {
            for (vint it = CC[i].begin(); it != CC[i].end(); ++it)
            {
                if (*it <= n)
                {
                    atr[*it+n] = 1;
                }
                else
                {
                    atr[*it-n] = 1;
                }
            }
        }
    }

    bool ok = 1;

    for (int i=1; i<=n; ++i)
    {
        if ((atr[i]==0) == (atr[i+n]==0))
        {
            ok = 0;
        }
    }

    if (!ok)
    {
        fout<<-1;
        return 0;
    }

    for (int i=1; i<=n; ++i)
    {
        fout<<atr[i]<<" ";
    }
}