Cod sursa(job #3137088)

Utilizator Raul_AArdelean Raul Raul_A Data 11 iunie 2023 11:15:14
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>
#define eb emplace_back 
#define cin in
#define cout out 
using namespace std;

const string file_name("2sat");

ifstream in(file_name + ".in");
ofstream out(file_name + ".out");

const int NMAX = 2e5;

vector <int> g[NMAX + 1], rg[NMAX + 1], topsort, comp;
int n, ctc, m, x, y;
bitset <NMAX + 1> viz;

int val_asoc(int x)
{
    return x<0 ? -x+n : x;
}   

int neg(int x)
{
    return x<=n ? x+n : x-n; 
}

void dfs(int k) 
{
    viz[k] = 1;
    for(auto x : g[k])
        if(!viz[x])
            dfs(x);

    topsort.eb(k);
}

void dfs2(int k) 
{
    comp[k] = ctc;
    for(auto x : rg[k])
        if(!comp[x])
            dfs2(x);
}

int main() 
{
    cin >> n >> m;
    
    comp.resize(2*(n+1));
    
    for(int i = 0; i < m; i++) 
    {
        cin >> x >> y;
        
        x = val_asoc(x);
        y = val_asoc(y);
        
        g[neg(x)].eb(y);
        g[neg(y)].eb(x);
        
        rg[y].eb(neg(x));
        rg[x].eb(neg(y));
    }
    
    for(int i = 1; i <= 2 * n; i++)
        if(!viz[i]) dfs(i);
        
    reverse(topsort.begin(), topsort.end());
    
    for(auto x : topsort) 
    {
        if(comp[x]) continue;
        ctc++;
        dfs2(x);
    }
    
    bool ok=1;
    
    for(int i=1;i<=n and ok;i++)
        if(comp[i]==comp[i+n]) ok=0;
     
    if(!ok) cout<<-1;
    else
    {
        for(int i=1;i<=n;i++)
            cout<<(comp[i]>comp[n+i] ? 1 : 0)<<' ';
    }
    return 0;
 }