Cod sursa(job #469249)

Utilizator hendrikHendrik Lai hendrik Data 7 iulie 2010 03:52:00
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
//Type: 2SAT
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;

#define pb push_back
#define sz size()
#define N 200010
#define FORE(it,v) for (typeof(v.begin()) it=v.begin();it!=v.end();it++)
int n,m,a,b,c,num,com[N],res[N];
vector<int>g[N],g2[N];
bool used[N];

inline int neg(int a){
	if (a<=n) return a+n;
	return a-n;
}

void add(int a,int b){
	g[neg(a)].pb(b);
	g[neg(b)].pb(a);
	g2[a].pb(neg(b));
	g2[b].pb(neg(a));
}

void dfs(int x){
	used[x]=1;
	FORE(it,g[x]){
		if (used[*it]) continue;
		dfs(*it);
	}
	com[num++]=x;
}

void dfs2(int x){
	used[x]=1;
	res[x]=0;
	res[neg(x)]=1;
	FORE(it,g2[x]){
		if (used[*it]) continue;
		dfs2(*it);
	}
}

void solve(){
	num=0;
	for (int i=1;i<=2*n;i++){
		if (used[i]) continue;
		dfs(i);
	}
	memset(used,0,sizeof(used));
	for (int i=0;i<num;i++){
		if (used[com[i]] || used[neg(com[i])]) continue;
		dfs2(com[i]);
	}
}

void output(){
	bool print_space=0;
	for (int i=1;i<=n;i++){
		if (print_space) printf(" ");
		print_space=1;
		printf("%d",res[i]);
	}
	printf("\n");
}

void open(){
	freopen("andrei.in","r",stdin);
	freopen("andrei.out","w",stdout);
}

int main(){
	open();
	scanf("%d%d",&n,&m);
	for (int i=0;i<m;i++){
		scanf("%d%d%d",&a,&b,&c);
		if (c==0){
			add(a,b);
			continue;
		}
		if (c==1){
			add(neg(a),neg(b));
			continue;
		}
		add(a,neg(b));
		add(neg(a),b);
	}
	solve();
	output();
	//system("pause");
	return 0;
}