Cod sursa(job #1704358)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 18 mai 2016 17:50:06
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<iterator>

using namespace std;

ifstream f("2sat.in");
ofstream g("2sat.out");

int const NMax = 200005;
vector <int> G[NMax], GT[NMax];
int use[NMax], Ord[NMax], Sol[NMax];
int n, m, k, ok = 1;

int Non(int nod)
{
    if(nod <= n)
        return (nod + n);
    return (nod - n);
}

void Read()
{
    int x, y, nx, ny;

    f>>n>>m;
    for(int i=1; i<=m; i++){
        f>>x>>y;
        nx = n + x;
        ny = n + y;
        if(x < 0){
            x = n - x;
            nx = x - n;
        }
        if(y < 0){
            y = n - y;
            ny = y - n;
        }
        G[nx].push_back(y);
        GT[y].push_back(nx);
        G[ny].push_back(x);
        GT[x].push_back(ny);
    }
}

void DFSP(int nod)
{
    use[nod] = 1;
    vector <int>::iterator it;
    for(it = G[nod].begin(); it!=G[nod].end(); it++)
        if(!use[*it])
            DFSP(*it);

    Ord[++k] = nod;
}

void DFSM(int nod)
{
    use[nod] = 2;
    use[Non(nod)] = 2;

    Sol[nod] = 0;
    Sol[Non(nod)] = 1;

    vector <int>::iterator it;
    for(it = GT[nod].begin(); it != GT[nod].end(); it++)
        if(use[*it] == 1)
            DFSM(*it);
}

void Solve()
{
    int i;

    for(i=1; i<=2*n; i++)
        Sol[i] = -1;

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

    for(i=2*n; i>0; i--)
        if(use[Ord[i]] == 1)
            DFSM(Ord[i]);
}

void Print()
{
    int i;
    vector <int>::iterator it;

    for(i=1; i<=2*n; i++)
        for(it = G[i].begin(); it != G[i].end(); it++)
            if((!Sol[i] || Sol[*it]) == 0){
                g<<-1<<"\n";
                return;
            }

    for(i=1; i<=2*n; i++)
        if(Sol[i] == -1){
            g<<-1<<"\n";
            return;
        }

    for(i=1; i<=n; i++)
        g<<Sol[i]<<" ";
    g<<"\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}