Cod sursa(job #602996)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 14 iulie 2011 00:15:15
Problema Andrei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <string.h>

#include <vector>

using namespace std;

int n, m;

int viz[200002], sol[200002], st[200002];
vector <int> v[200002], vt[200002];

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

void add (int x, int y)
{
	v[neg(x)].push_back (y);
	vt[y].push_back (neg (x));

	v[neg(y)].push_back (x);
	v[x].push_back (neg (y));
}

void dfs (int nod)
{
	if (viz[nod])
		return;
	viz[nod] = 1;

	for (vector <int> :: iterator it = v[nod].begin(); it != v[nod].end(); it ++)
		dfs (*it);
	st[++st[0]] = nod;
}

void dfs2 (int nod)
{
	if (viz[nod])
		return;
	viz[nod] = 1;
	sol[neg (nod)] = 1;

	for (vector <int> :: iterator it = vt[nod].begin(); it != vt[nod].end(); it ++)
		dfs2 (*it);
}

int main ()
{
	freopen ("andrei.in", "r", stdin);
	freopen ("andrei.out", "w", stdout);

	scanf ("%d %d", &n, &m);

	int i, x, y, c;

	for (i = 1; i <= m; i ++)
	{
		scanf ("%d %d %d", &x, &y, &c);
		if (c == 0)
			add (x, y);
		if (c == 1)
			add (neg(x), neg(y));
		if (c == 2)
			add (neg(x), y), add (x, neg(y));
	}

	for (i = 1; i <= 2 * n; i ++)
		dfs (i);

	memset (viz, 0, sizeof (viz));
	for (i = 2 * n; i; i --)
		if (!viz[st[i]] && !viz[neg(st[i])])
			dfs2 (st[i]);

	for (i = 1; i <= n; i ++)
		printf ("%d ", sol[i]);
	return 0;
}