Cod sursa(job #2285978)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 19 noiembrie 2018 17:26:00
Problema 2SAT Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;


/// X will become the node 2 * x, -x will become 2 * x + 1
namespace SAT {
	vector <vector <int>> adia, adiaback;
	vector <int> id, viz, sortop;

	void add_clause(int x, int y) {
		x *= 2, y *= 2;
		if (x < 0)
			x = (-x) ^ 1;
		if (y < 0)
			y = (-y) ^ 1;
		adia[x ^ 1].push_back(y);
		adia[y ^ 1].push_back(x);
		adiaback[x].push_back(y ^ 1);
		adiaback[y].push_back(x ^ 1);
	}

	void add_var(int nr = 1) {
		while (nr--) {
			adia.push_back(vector <int>());
			adia.push_back(vector <int>());
			adiaback.push_back(vector <int>());
			adiaback.push_back(vector <int>());
			id.push_back(0);
			viz.push_back(0);
			id.push_back(0);
			viz.push_back(0);
		}
	}

	void dfs(int nod) {
		viz[nod] = 1;
		for (auto i : adia[nod])
			if (!viz[i])
				dfs(i);
		sortop.push_back(nod);
	}
	void dfsback(int nod, int c) {
		id[nod] = c;
		for (auto i : adiaback[nod])
			if (!id[i])
				dfsback(i, c);
	}

	bool is_solvable() {
		int n = adia.size();
		for (int i = 0; i < n; i++)
			if (!viz[i])
				dfs(i);
		reverse(sortop.begin(), sortop.end());
		int cnt = 0;
		for (auto i : sortop)
			if (!id[i])
				dfsback(i, ++cnt);
		for (int i = 0; i < n; i++)
			if (id[i] == id[i ^ 1])
				return false;
		return true;
	}
}


int main()
{
	ifstream in("2sat.in");
	ofstream out("2sat.out");

	int n, m;
	in >> n >> m;

	SAT::add_var(n + 1);

	while (m--) {
		int a, b;
		in >> a >> b;
		SAT::add_clause(a, b);
	}

	if (!SAT::is_solvable())
		return out << "-1\n", 0;

	for (int i = 1; i <= n; i++)
		out << (SAT::id[2 * i] > SAT::id[2 * i + 1]) << ' ';

	return 0;
}