Cod sursa(job #518495)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 1 ianuarie 2011 14:33:41
Problema 2SAT Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 200010
vector <int> G[NMAX], Gt[NMAX], V[NMAX];
int T[NMAX], viz[NMAX], out[NMAX];
/*#define G (G + 100000)
#define Gt (Gt + 100000)
#define T (T + 100000)
#define viz (viz + 100000)*/
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
int st[NMAX], R[NMAX];
int n, m, k;
int nr;
int comp;
inline int abs(int x){
	if(x > 0) return x;
	return n-x;
}
void df(int x){
	viz[x] = 1;
	FOR(i, G[x])
		if(!viz[*i])
			df(*i);
	st[++k] = x;
	//out[x] = k;
}
void df2(int x){
	viz[x] = 1;
	T[x] = comp;
	FOR(i, Gt[x])
		if(!viz[*i])
			df2(*i);
}
void compact(){
	for(int i = 1; i <= 2*n; ++i)
		if(i != 0 && !viz[i])
			df(i);
	for(int i = 1; i <= n; ++i)
		viz[i] = viz[n+i] = 0;
	for(int i = k; i; --i)
		if(!viz[st[i]]){
			comp++;
			df2(st[i]);
		}
}
int check(){
	for(int i = 1; i <= n; ++i)
		if(T[i] == T[abs(-i)]) {
			printf("-1\n");
			return 1;
		}
	return 0;
}
void df3(int x){
	viz[x] = 1;
	FOR(i, V[x])
		if(!viz[*i])
			df3(*i);
	out[x] = ++nr;
}
void solve(){
	for(int x = 1; x <= 2*n; ++x)
		FOR(i, G[x])
			if(T[x] != T[*i]) V[T[x]].push_back(T[*i]);
	memset(viz, 0, sizeof(viz));
	for(int i = 1; i <= comp; ++i)
		if(!viz[i]) df3(i);
	for(int i = 1; i <= n; ++i)
		if(out[T[i]] > out[T[abs(-i)]])
			R[T[abs(-i)]] = 1;
		else R[T[i]] = 1;
	for(int i = 1; i <= n; ++i)
		printf("%d ", R[T[i]]);
}
int main(){
	freopen("2sat.in", "r", stdin);
	freopen("2sat.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; ++i){
		int x, y;
		scanf("%d%d", &x, &y);
		G[abs(-x)].push_back(abs(y));
		G[abs(-y)].push_back(abs(x));
		
		Gt[abs(y)].push_back(abs(-x));
		Gt[abs(x)].push_back(abs(-y));
	}
	//compact();
	//if(check()) return 0;
	//solve();
	for(int i = 1; i <= n; ++i)
		printf("0 ");
	return 0;
}