Cod sursa(job #479781)

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

const int maxN = 200100;

using namespace std;

int N, M;
vector <int> G[maxN], GT[maxN];
int st[maxN], value[maxN];
bool viz[maxN];


inline int neg(int val) { return val > N ? val - N : val + N; }

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

void df2(int nod) {
  viz[nod] = true;
  value[neg(nod)] = true;
  for (vector<int>::iterator it = GT[nod].begin(); it != GT[nod].end(); ++it)
    if (!viz[*it]) df2(*it);
}

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 (int i = 1; i <= 2*N; ++i)
    if (!viz[i]) df(i);
  memset(viz, false, sizeof(viz));
  for (int i = 2*N; i; --i)
    if (!viz[st[i]] && !viz[neg(st[i])])
      df2(st[i]);

    for (int i = 1; i <= N; ++i)
      printf("%d ", value[i]);
  return 0;
}