Cod sursa(job #2337944)

Utilizator LucaSeriSeritan Luca LucaSeri Data 6 februarie 2019 20:36:33
Problema 2SAT Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <bits/stdc++.h>
 
using namespace std;

const int MAXN = 1e5 + 10;

vector< int > gr[2*MAXN];
vector< int > gri[2*MAXN];
bool viz[2*MAXN];
int ctc[2*MAXN];

vector< int > v;

int n, m;
int cnt = 0;
inline int idx(int x) {
	if(x > 0) return x;
	return n - x;
}

void dfs(int node) {
	viz[node] = true;
	for(auto &x : gr[node]) {
		if(!viz[x]) dfs(x);
	}
	v.emplace_back(node);
}

void dfs1(int node) {
	viz[node] = false;
	for(auto &x : gri[node]) {
		if(viz[x]) dfs1(x);
	}

	ctc[node] = cnt;
}

int main() {
	#ifdef BLAT
		freopen("input", "r", stdin);
		#define f cin
		#define g cout
	#else
		ifstream f("2sat.in");
    	ofstream g("2sat.out");
    #endif

    int n, m;
    f >> n >> m;

    for(int i = 1; i <= m; ++i) {
    	int x, y;
    	f >> x >> y;

    	gr[idx(-x)].emplace_back(idx(y));
    	gri[idx(y)].emplace_back(idx(-x));
    	
    	swap(x, y);
    	gr[idx(-x)].emplace_back(idx(y));
    	gri[idx(y)].emplace_back(idx(-x));
    }

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

    reverse(v.begin(), v.end());

    for(auto &x : v) {
    	if(viz[x]) {
    		++cnt;
    		dfs1(x);
    	}
    }

    for(int i = 1; i <= n; ++i) {
    	if(ctc[i] == ctc[n+i]) {
    		g << -1;
    		return 0;
    	}
    }

    for(int i = 1; i <= n; ++i) {
    	cout << (ctc[i] > ctc[n+i]) << ' ';
    }
    return 0;
}