Cod sursa(job #3041563)

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

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

class SAT
{
    private: vector<vector<int>> vecini,vecinit; int n,e; vector<bool> viz; vector<int> top,what;
    int id(int l)
    {
        if(l < 0) return abs(l) + n;
        else return l;
    }

    int nega(int l)
    {
        if(l < 0) return abs(l);
        else return l + n;
    }

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

        top.emplace_back(nod);
    }

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

    public: SAT(int _n)
    {
        n = _n; vecini.resize(2 * n + 1); what.resize(2 * n + 1,0);
        vecinit.resize(2 * n + 1); viz.resize(2 * n + 1,0);
    }

    void add_or(int a,int b)
    {
        vecini[nega(a)].emplace_back(id(b));
        vecini[nega(b)].emplace_back(id(a));

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


    vector<int> getans()
    {
        for(int i = 1; i <= 2 * n ; i++)
            if(!viz[i]) dfs(i);

        vector<int> r(n + 1);
        for(auto it = top.rbegin(); it != top.rend() ; it++)
            {
                if(!what[*it]) e++,trans(*it);
            }

        for(int i = 1; i <= n ; i++)
            {
                if(what[i] == what[i + n])
                    {
                        r = {-1};
                        return r;
                    }

                if(what[i] > what[i + n]) r[i] = 1;
                else r[i] = 0;
            }

        if(r.size() > 1) r.erase(r.begin());
        return r;
    }
};

int main()
{
    int n,m,a,b; cin >> n >> m;
    SAT g(n); while(m--)
    {
        cin >> a >> b;
        g.add_or(a,b);
    }

    vector<int> ans = g.getans();
    for(auto it : ans) cout << it << " ";
}