Cod sursa(job #2869133)

Utilizator marcpopPop Marc Alexandru marcpop Data 11 martie 2022 12:44:45
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin ("2sat.in");
ofstream fout ("2sat.out");

vector<int> v[200002];
vector<int> vt[200002];

vector<int> s;
vector<bool> viz;

int n, m, a, b, nr;

int comp[200002];
bool val[100001];

void dfs1(int start) {

    viz[start] = 1;

    for (int i=0; i<v[start].size(); i++) {

        if (!viz[v[start][i]]) {
            dfs1(v[start][i]);
        }
    }

    s.push_back(start);

}

void dfs2(int start, int nr) {

    viz[start] = 1;

    for (int i=0; i<vt[start].size(); i++) {

        if (!viz[vt[start][i]]) {
            dfs2(vt[start][i], nr);
        }
    }

    comp[start] = nr;

}

int main()
{

    fin>>n>>m;

    for (int i=1; i<=m; i++) {

        fin>>a>>b;

        /// -a -> b
        /// -b -> a

        if (a > 0  and b > 0) {

            v[n+a].push_back(b);
            v[n+b].push_back(a);

            vt[b].push_back(n+a);
            vt[a].push_back(n+b);

        }
        else if (a < 0 and b > 0) {

            v[-a].push_back(b);
            v[n+b].push_back(n-a);

            vt[b].push_back(-a);
            vt[n-a].push_back(n+b);

        }
        else if (a > 0 and b < 0) {

            v[n+a].push_back(n-b);
            v[-b].push_back(a);

            vt[n-b].push_back(n+a);
            vt[a].push_back(-b);

        }
        else if (a < 0 and b < 0) {

            v[-a].push_back(n-b);
            v[-b].push_back(n-a);

            vt[n-b].push_back(-a);
            vt[n-a].push_back(-b);

        }

    }

    viz = vector<bool>((2*n)+2, 0);

    for (int i=1; i<=2*n; i++) {
        if (!viz[i]) {
            dfs1(i);
        }
    }

    viz = vector<bool>((2*n)+2, 0);

    for (int i=s.size()-1; i>=0; i--) {

        if (!viz[s[i]]) {
            nr++;
            dfs2(s[i], nr);
        }

    }

//    fout<<"nr = "<<nr<<"\n";
//
//    for (int i=1; i<=nr; i++) {
//        fout<<"componenta "<<i<<": ";
//        for (int j=1; j<=2*n; j++) {
//
//            if (comp[j] == i) {
//                if (j <= n) {
//
//                    fout<<j<<" ";
//                }
//                else {
//
//                    fout<<n-j<<" ";
//                }
//            }
//
//        }
//        fout<<"\n";
//    }


    for (int i=1; i<=n; i++) {

        if (comp[i] == comp[n+i]) {
            fout<<"-1\n";
            return 0;
        }

        val[i] = comp[i] > comp[n+i];

        fout<<val[i]<<" ";

    }

    return 0;
}