Cod sursa(job #386535)

Utilizator tvladTataranu Vlad tvlad Data 25 ianuarie 2010 03:59:43
Problema 2SAT Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <vector>
using namespace std;

const int N_MAX = 200002;

int n,m;
vector<int> g[N_MAX], g2[N_MAX];
int st[N_MAX];
bool used[N_MAX];
bool v[N_MAX];
bool ok;

inline int neg ( int a ) { return a > n ? a-n : a+n; }

void df ( int nod ) {
	used[nod] = true;
	for (vector<int>::iterator i = g[nod].begin(); i != g[nod].end(); ++i)
		if (!used[*i])
			df(*i);
	st[++st[0]] = nod;
}

void df2 ( int nod ) {
	if (v[nod])
		ok = false;
	used[nod] = true;
	v[neg(nod)] = true;
	for (vector<int>::iterator i = g2[nod].begin(); i != g2[nod].end(); ++i)
		if (!used[*i])
			df2(*i);
}

int main() {
	freopen("2sat.in","rt",stdin);
	freopen("2sat.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0, a,b; i < m; ++i) {
		scanf("%d %d",&a,&b);
		if (a < 0) a = -a + n;
		if (b < 0) b = -b + n;
		g[neg(a)].push_back(b);
		g[neg(b)].push_back(a);
		g2[b].push_back(neg(a));
		g2[a].push_back(neg(b));
	}
	ok = true;
	for (int i = 1; i <= 2*n; ++i)
		if (!used[i])
			df(i);
	memset(used, 0, sizeof(used));
	for (int i = 2*n; i >= 0; --i)
		if (!used[st[i]] && !used[neg(st[i])])
			df2(st[i]);
	if (ok)
		for (int i = 1; i <= n; ++i)
			printf("%d ",v[i]); else
		printf("-1\n");
	return 0;
}