Cod sursa(job #1760198)

Utilizator valiro21Valentin Rosca valiro21 Data 20 septembrie 2016 15:05:04
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

#define NMax 100000

using namespace std;

int n, m;
vector<int> v[2*NMax+5];
vector<int> v_m[2*NMax+5];
int comp[2*NMax+5];
vector<bool> comp_val;
bool viz[2*NMax+5];
vector<int> q;
bool sol[NMax+5];

#define v (v+NMax)
#define v_m (v_m+NMax)
#define comp (comp+NMax)
#define viz (viz+NMax)

void kosaraju_visit(int nod) {
	if (nod == 0 || viz[nod])
		return;
	viz[nod] = true;
	for (int i = 0; i < v[nod].size(); i++)
		kosaraju_visit(v[nod][i]);
	q.push_back (nod);
}

void kosaraju_assign(int nod, int component) {
	if (nod == 0 || comp[nod] != 0)
		return;
	
	comp[nod] = component;
	for (int i = 0; i < v_m[nod].size (); i++) {
		kosaraju_assign(v_m[nod][i], component);	
	}
}

bool sat2() {
	for (int i = -n; i <= n; i++)
		kosaraju_visit(i);
	
	comp_val.push_back (0);
	for (int i = q.size () - 1; i >= 0; i--) {
		int node = q[i];
		if (comp[node] == 0) {
			kosaraju_assign(node, comp_val.size ());
			comp_val.push_back(0);
		}
	}

	for (int i = 1; i <= n; i++) {
		if (comp[i] == comp[-i])
			return false;
		else if (comp[i] < comp[-i])
			comp_val[comp[-i]] = 1;
		else
			comp_val[comp[i]] = 1;
	}

	for (int i = 1; i <= n; i++)
		sol[i] = comp_val[comp[i]];

	return true;
}

void add (int x, int y) {
	v[x].push_back (y);
	v_m[y].push_back (x);
}

int main ()
{
	ifstream fin ("2sat.in");
	ofstream fout("2sat.out");
	int x, y;
	fin >> n >> m;
	for (int i = 0; i < m; i++) {
		fin >> x >> y;

		add(-x, y);
		add(-y, x);
	}

	if (sat2()) {
		for (int i = 1; i <= n; i++)
			fout << sol[i] << ' ';
		fout << '\n';
	}
	else {
		fout << -1 << '\n';
	}

	return 0;
}