Cod sursa(job #3231639)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 27 mai 2024 14:44:15
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("2sat.in");
ofstream fout("2sat.out");
vector < vector <int> > G(200005);
vector < vector <int> > GT(200005);


vector <int> ord;
bitset <200005> viz;
int comp[200005];
int val[100005];
int c;
void dfs(int nod){
    viz[nod] = 1;
    for(auto x : G[nod]){
        if(!viz[x]) dfs(x);
    }
    ord.push_back(nod);
}
void dfs2(int nod){
    comp[nod] = c;
    for(auto x : GT[nod]){
        if(!comp[x]) dfs2(x);
    }
}
int main()
{
    int n,i,m,u,v;
    fin >> n >> m;
    while(m--){
        fin >> u >> v;
        //a si !a sa fie consecutive ca indici
        if(u < 0) u = ((-u - 1) << 1) + 1;
        else u = ((u - 1) << 1);
        if(v < 0) v = ((-v - 1) << 1) + 1;
        else v = ((v - 1) << 1);
        G[u ^ 1].push_back(v);
        G[v ^ 1].push_back(u);
        GT[u].push_back(v ^ 1);
        GT[v].push_back(u ^ 1);
    }
    for(i = 0; i < (n << 1); i++) if(!viz[i]) dfs(i);
    reverse(ord.begin(), ord.end());
    for(auto x : ord){
        if(!comp[x]){
            c++;
            dfs2(x);
        }
    }
    for(i = 0; i < (n << 1); i += 2){
        if(comp[i] == comp[i + 1]){
            fout << "-1";
            return 0;
        }
        val[i >> 1] = comp[i] > comp[i + 1];
    }
    for(i = 0; i < n; i++) fout << val[i] << " ";
    return 0;
}