Cod sursa(job #3344934)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 6 martie 2026 19:28:29
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("2sat.in");
ofstream g("2sat.out");
vector <int> v[200009], vt[200009];
int n;
int ctc[200009];
int cnt=0, lin[200009], curr=0;
bool viz[200009];
int get_nod (int x)
{
    if (x<0) return -x+n;
    return x;
}
int neg (int x)
{
    if (x>n)
        return x-n;
    return x+n;
}
void add (int x, int y)
{
    v[x].push_back(y);
    vt[y].push_back(x);
}
void imposibil (int x, int y)
{
    add (x, neg(y));
    add (y, neg(x));
}
void dfs0 (int nod)
{
    viz[nod]=1;
    for (auto y:v[nod])
        if (!viz[y]) dfs0 (y);
    lin[++cnt]=nod;
}
void dfs (int nod)
{
    viz[nod]=1;
    ctc[nod]=curr;
    for (auto y:vt[nod])
        if (!viz[y]) dfs (y);
}
signed main ()
{
    int m;
    f >> n >> m;
    while (m--)
    {
        int x, y;
        f >> x >> y;
        x=get_nod(x), y=get_nod(y);
        imposibil (neg(x), neg(y));
    }
    for (int i=1; i<=2*n; i++)
        if (!viz[i]) dfs0(i);
    for (int i=1; i<=2*n; i++)
        viz[i]=0;
    for (int i=2*n; i>=1; i--)
    {
        if (!viz[lin[i]])
            curr++, dfs (lin[i]);
    }
    for (int i=1; i<=n; i++)
        if (ctc[i]==ctc[i+n])
    {
        g << -1;
        exit(0);
    }
    for (int i=1; i<=n; i++)
    {
        if (ctc[i]<ctc[i+n])
            g << 0<< ' ';
        else g <<"1 ";
    }
}