Cod sursa(job #2223362)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 19 iulie 2018 22:01:35
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <fstream>
#include <vector>
#define VAL 200005

using namespace std;

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

int N, M, K, i, j, k, Cneg[VAL];
int A, B, neg[VAL], comp[VAL];
int st[VAL], top, CValue[VAL];
int SortTOP[VAL], NR, grad[VAL];
bool ok[VAL];
vector <int> G[VAL], Ginv[VAL], CG[VAL];
vector <int> :: iterator it;

void visit(int nod)
{
    vector <int> :: iterator it;
    ok[nod]=true;
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
        if (ok[*it]==false)
            visit(*it);
    st[++top]=nod;
}

void Assign_Node(int nod)
{
    vector <int> :: iterator it;
    comp[nod]=K;
    for (it=Ginv[nod].begin(); it!=Ginv[nod].end(); it++)
        if (comp[*it]==0)
            Assign_Node(*it);
}

int main()
{
    fin >> N >> M;
    for (i=1; i<=2*N; i++)
    {
        if (i<=N)
            neg[i]=i+N;
        else
            neg[i]=i-N;
    }
    for (i=1; i<=M; i++)
    {
        fin >> A >> B;
        if (A<0)
          A=N-A;
        if (B<0)
          B=N-B;
        G[neg[A]].push_back(B);
        G[neg[B]].push_back(A);
        Ginv[B].push_back(neg[A]);
        Ginv[A].push_back(neg[B]);
    }
    for (i=1; i<=2*N; i++)
        if (ok[i]==false)
            visit(i);
    while (top>0)
    {
        if (comp[st[top]]==0)
        {
            K++;
            Assign_Node(st[top]);
        }
        top--;
    }
    for (i=1; i<=2*N; i++)
    {
        if (comp[i]==comp[neg[i]])
        {
            fout << "-1\n";
            fin.close();
            fout.close();
            return 0;
        }
        Cneg[comp[i]]=comp[neg[i]];
        for (it=G[i].begin(); it!=G[i].end(); it++)
        {
            if (comp[i]!=comp[*it])
            {
                grad[comp[*it]]++;
                CG[comp[i]].push_back(comp[*it]);
            }
        }
    }
    for (i=1; i<=K; i++)
    {
        CValue[i]=-1;
        if (grad[i]==0)
            SortTOP[++NR]=i;
    }
    for (i=1; i<=K; i++)
    {
        A=SortTOP[i];
        for (it=CG[A].begin(); it!=CG[A].end(); it++)
        {
            grad[*it]--;
            if (grad[*it]==0)
                SortTOP[++NR]=*it;
        }
    }
    for (i=1; i<=NR; i++)
    {
        if (CValue[SortTOP[i]]==-1)
        {
            CValue[SortTOP[i]]=0;
            CValue[Cneg[SortTOP[i]]]=1;
        }
    }
    for (i=1; i<=N; i++)
        fout << CValue[comp[i]] << " ";
    fin.close();
    fout.close();
    return 0;
}