Cod sursa(job #383825)

Utilizator CezarMocanCezar Mocan CezarMocan Data 18 ianuarie 2010 10:51:33
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define maxn 200100
#define ff first
#define ss second

using namespace std;

int n, m, i, j, n1, n2;
vector <int> g[2 * maxn], gt[2 * maxn];
pair <int, int> t[maxn];
int stack[maxn], viz[maxn], ctc[maxn], mark[maxn], rez[maxn], afis[maxn];
int vf, sol, a, b, nr;
vector <int> comp[maxn];

inline int negat(int r) {
	r = r + n;
	if (r > 2 * n)
		r -= 2 * n;
	return r;
}

void df1(int nod, int nr) {
	int i;
	if (viz[nod])
		return;

	viz[nod] = nr;
	for (i = 0; i < g[nod].size(); i++) 
		df1(g[nod][i], nr);	
	
	stack[++vf] = nod;
}

void df2(int nod, int nr) {
	int i;
	if (ctc[nod])
		return;

	comp[nr].push_back(nod);
	ctc[nod] = nr;

	for (i = 0; i < gt[nod].size(); i++)
		df2(gt[nod][i], nr);
}

int main() {
	freopen("2sat.in", "r", stdin);
	freopen("2sat.out", "w", stdout);


	scanf("%d%d", &n, &m);
	for (i = 1; i <= m; i++) {
		scanf("%d%d", &a, &b);
		t[i] = make_pair(a, b);

		n1 = a;
		if (a < 0)
			n1 = -a + n;

		n2 = b;
		if (b < 0)
			n2 = -b + n;


		gt[n1].push_back(negat(n2));
		g[negat(n2)].push_back(n1);
		

		gt[n2].push_back(negat(n1));
		g[negat(n1)].push_back(n2);

	} 

	for (i = 1; i <= 2 * n; i++)
		if (!viz[i])
			df1(i, ++nr);

	nr = 0;
	for (i = vf; i >= 1; i--)
		if (!ctc[stack[i]]) 
			df2(stack[i], ++sol);
	
	for (i = 1; i <= n; i++)
		if (ctc[i] == ctc[i + n]) {
			printf("-1\n");
			return 0;
		}	

//	return 0;
	memset(viz, 0, sizeof(viz));
	for (i = 2 * n; i >= 1; i--) {
		if (!viz[ctc[i]]) {
			rez[ctc[i]] = 1;
			rez[ctc[i + n]] = 0;
		}
	}

//	return 0;
	for (i = 1; i <= sol; i++) {
		for (j = 0; j < comp[i].size(); j++)
			afis[comp[i][j]] = rez[i];
	}

	for (i = 1; i <= n; i++)
		printf("%d ", rez[i]);

	return 0;
}