Cod sursa(job #383819)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 18 ianuarie 2010 10:50:31
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <vector>
#include <bitset>
#include <map>
#include <queue>
using namespace std;
#define val(x)		(x < 0) ? (-x + N) : x
#define forI(it,v)	for (vector <int> :: iterator it = v.begin(); it != v.end(); ++ it)
#define maxN	200100

bitset <maxN> viz;
vector <int> G[maxN], V[maxN], CC[maxN], VV[maxN];
int N, M, Nr, Nr2, t[maxN], C[maxN], Grad[maxN], now[maxN], Sol[maxN];
map < int, int > Map[maxN];
queue <int> q;

void df1 (int x) {
	viz[x] = 1;
	forI(it, G[x])
		if (!viz[*it])
			df1(*it);
	t[ ++ Nr] = x;
}

void df2 (int x) {
	viz[x] = 1;
	forI(it, V[x])
		if (!viz[*it])
			df2(*it);
	C[x] = Nr2;
	CC[Nr2].push_back(x);
}

void tsort () {
	int i;

	for (i = 1; i <= Nr2; ++ i)
		if (!Grad[i])
			q.push(i);

	for (i = 1; q.empty(); ++ i) {
		now[i] = q.front(); q.pop();
		forI(it, VV[now[i]]) {
			-- Grad[*it];
			if (!Grad[*it])
				q.push(*it);
		}
	}

	for (i = Nr2, viz.reset(); i; -- i) {
//		printf("%d ", now[i]);
		if (viz[now[i]])	continue;
		viz[now[i]] = 1;
		forI(it, VV[now[i]]) {
			Sol[*it <= N ? *it : *it - N] = (*it <= N);
			viz[C[*it]] = 1;
		}
	}
  //  puts("");

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

}

int main () {
	int i, a, b;

	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);
		
		G[val(-a)].push_back(val(b));
		G[val(-b)].push_back(val(a));

		V[val(b)].push_back(val(-a));
		V[val(a)].push_back(val(-b));
	}

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

	for (viz.reset(); Nr ; Nr --)
		if (!viz[t[Nr]]) {
			++ Nr2;
			df2(t[Nr]);
		}

	for (i = 1; i <= N; ++ i)
		if (C[i] == C[i + N]) {
			printf("-1\n");
			return 0;
		}

	for (i = 1; i <= Nr2; ++ i) {
		forI(it, CC[i]) {
			forI(it2, G[*it])
				if (!Map[i][C[*it2]] && C[*it2] != i) {
					Map[i][C[*it2]] = 1;
					VV[i].push_back(C[*it2]);
					++ Grad[C[*it2]];
				}
		}
	}

	tsort();
}