Cod sursa(job #2509100)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 13 decembrie 2019 19:45:15
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 100000;
vector <long long> v[200005];
bool ver[NMAX*2+5];
int low[NMAX*2+5],rasp[NMAX*2+5],nivel[200005];
int apart[NMAX*2+5];
stack <int> q;
bool afis_minus_unu=false;
int d=0,comp=0;
int n,m,x,y;

int opus(int nod)
{
    if(nod<0) return (-1)*nod;
    if(nod<NMAX) return nod+NMAX;
    return nod-NMAX;
}

int transf(int nod)
{
    if(nod<0) return (-1)*nod+NMAX;
    return nod;
}

void dfs(int nod)
{
    q.push(nod);
    low[nod]=nivel[nod]=++d;
    for(int i=0;i<v[nod].size();i++)
    {
        int vecin=v[nod][i];
        if(nivel[vecin]==0) dfs(vecin);
        if(nivel[vecin]>0) low[nod]=min(low[nod],low[vecin]);
    }
    if(nivel[nod]==low[nod])
    {
        comp++;
        while(q.top()!=nod)
        {
            int vecin=q.top();
            q.pop();
            nivel[q.top()]*=-1;
            apart[vecin]=comp;
            if(apart[opus(vecin)]!=0 and apart[opus(vecin)]==apart[vecin])
            {
                afis_minus_unu=true;
                return;
            }
            if(rasp[vecin]==0)
            {
                rasp[vecin]=1;
                rasp[opus(vecin)]=-1;
            }
        }
    }
}

int main()
{
    fin >> n >> m;
    /// avb <=> (~a -> b) ^ (~b -> a)
    for(int i=1;i<=m;i++)
    {
        fin >> x >> y;
        if(x<0 and y<0){
            v[x*(-1)].push_back((-1)*y+NMAX);
            v[y*(-1)].push_back((-1)*x+NMAX);
        }
        if(x<0 and y>0){
            v[x*(-1)].push_back(y);
            v[y+NMAX].push_back((-1)*x+NMAX);
        }
        if(x>0 and y<0){
            v[y*(-1)].push_back(x);
            v[x+NMAX].push_back((-1)*y+NMAX);
        }
        if(x>0 and y>0){
            v[x+NMAX].push_back(y);
            v[y+NMAX].push_back(x);
        }
    }
    for(int i=1;i<=n;i++) if(nivel[i]==0) dfs(i);
    for(int i=1;i<=n;i++) if(nivel[i+NMAX]==0) dfs(i+NMAX);
    if(afis_minus_unu==true){
        fout << -1;
        return 0;
    }
    for(int i=1;i<=n;i++) fout << max(0,rasp[i]) << ' ';
    return 0;
}