Cod sursa(job #3041457)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 31 martie 2023 15:26:35
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;

ifstream cin("2sat.in");
ofstream cout("2sat.out");

constexpr int NMAX = 2e5 + 1;

vector<int> vecini[NMAX]; int n,m;
vector<int> vecinit[NMAX],topsort;
bitset<NMAX> viz; int what[NMAX],e;

int id(int lit)
{
    if(lit < 0) return abs(lit) + n;
    else return lit;
}

int negativ(int lit)
{
    if(lit < 0) return abs(lit);
    else return lit + n;
}

void dfs(int nod)
{
    viz[nod] = 1;
    for(auto it : vecini[nod])
        if(!viz[it])
            dfs(it);
    topsort.emplace_back(nod);
}

void trans(int l)
{
    what[l] = e;
    for(auto it : vecinit[l])
        if(!what[it])
            trans(it);

}

int main()
{
    int a,b; cin >> n >> m;
    for(int i = 1; i <= m ; i++)
        {
            cin >> a >> b;

            vecini[negativ(a)].emplace_back(id(b));
            vecini[negativ(b)].emplace_back(id(a));

            vecinit[id(b)].emplace_back(negativ(a));
            vecinit[id(a)].emplace_back(negativ(b));
        }

    for(int i = 1; i <= 2 * n ; i++) if(!viz[i]) dfs(i);
    for(auto it = topsort.rbegin(); it != topsort.rend() ; it++)
        {
            if(what[*it]) continue;
            e++; trans(*it);
        }

    bool yass = 1; vector<int> ans;
    for(int i = 1; i <= n ; i++)
        {
            if(what[i] == what[i + n]) yass = 0;
            if(what[i] < what[i + n]) ans.emplace_back(0);
            else ans.emplace_back(1);
        }

    if(!yass) cout << -1;
    else for(auto it : ans) cout << it << " ";
}