Cod sursa(job #479779)

Utilizator CezarMocanCezar Mocan CezarMocan Data 25 august 2010 12:18:03
Problema Andrei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <cstring>
#include <vector>

const int maxN = 200100;

using namespace std;

int N, M;
vector <int> G[maxN], GT[maxN];
int parc[maxN], ctc[maxN];
bool viz[maxN];

inline int neg(int nod) {
	if (nod <= N)	
		return nod + N;
	return nod - N;
}

inline void dfs(int nod) {
	int i, fiu;
	if (viz[nod])	return;
	viz[nod] = 1;
	for (i = 0; i < G[nod].size(); i++) {
		fiu = G[nod][i];
		if (!viz[fiu])	dfs(fiu);
	}

	parc[++parc[0]] = nod;
}

inline void dfs2(int nod) {
	int i, fiu;
	if (viz[nod])	return;

	viz[nod] = 1; 
	ctc[neg(nod)] = 1; 

	for (i = 0; i < GT[nod].size(); i++) {
		fiu = GT[nod][i];
		if (!viz[fiu])	dfs2(fiu);
	}
}

int main() {
	int i, j, a, b, c;
	freopen("andrei.in", "r", stdin);
	freopen("andrei.out", "w", stdout);

	scanf("%d%d", &N, &M);
	for (i = 1; i <= N; i++) {
		scanf("%d%d%d", &a, &b, &c);
		if (c == 0) {
			G[a + N].push_back(b);
			G[b + N].push_back(a);
			GT[b].push_back(a + N);
			GT[a].push_back(b + N);
		}

		if (c == 1) {
			G[a].push_back(b + N);
			G[b].push_back(a + N);
			GT[b + N].push_back(a);
			GT[a + N].push_back(b);
		}

		if (c == 2) {
			G[a].push_back(b);
			G[a + N].push_back(b + N);
			G[b].push_back(a);
			G[b + N].push_back(a + N);
			GT[a].push_back(b);
			GT[b].push_back(a);
			GT[a + N].push_back(b + N);
			GT[b + N].push_back(a + N);
		}
	}

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

	memset(viz, 0, sizeof(viz));
	for (i = parc[0]; i > 0; i--) 
		if (!viz[parc[i]] && !viz[neg(parc[i])]) 
			dfs2(parc[i]);
	
	for (i = 1; i <= N; i++)
		printf("%d ", ctc[i]);

	return 0;
}