Cod sursa(job #467307)

Utilizator savimSerban Andrei Stan savim Data 28 iunie 2010 14:01:13
Problema Andrei Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.46 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>

using namespace std;

#define MAX_N 100010

vector <int> G[MAX_N], col[MAX_N];
vector <int> comp[MAX_N];

int n, m, k;
int use[MAX_N], find[MAX_N], sol[MAX_N], bad[MAX_N];
int violet[MAX_N], sir[MAX_N], use_sir[MAX_N];

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

	comp[k].push_back(nod);
	find[nod] = k;
	
	int len = G[nod].size();
	for (int i = 0; i < len; i++)
		if (col[nod][i] == 2)
			dfs(G[nod][i]);
}

void dfs_comp(int comp, int nod) {
	if (use[nod])
		return;
	else {
		use[nod] = 1;

    	int len = G[nod].size();
		for (int i = 0; i < len; i++)
			if (find[G[nod][i]] == find[nod]) {
				sol[G[nod][i]] = 1 - sol[nod];
            	dfs_comp(find[G[nod][i]], G[nod][i]);
			}
	}
}

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

	scanf("%d %d", &n, &m);
	for (int i = 1; i <= m; i++) {
    	int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		G[a].push_back(b); G[b].push_back(a);
		col[a].push_back(c); col[b].push_back(c);

		if (c == 2)
			violet[a] = violet[b] = 1;
	}

	for (int i = 1; i <= n; i++)
		if (!use[i] && violet[i] == 1) {
			k++;
			dfs(i);
		}

    srand(time(0));
	
	for (int i = 1; i <= n; i++)
		if (find[i] == 0 || (find[i] > 0 && i == comp[find[i]][0]))
			sir[++sir[0]] = i;

	for (int i = 1; i <= sir[0]; i++)
		sol[sir[i]] = rand() % 2;
	
	while (true) {
		bad[0] = 0;
		
		for (int i = 1; i <= sir[0]; i++) {
        	int nod = sir[i];

			if (find[nod])
				dfs_comp(nod, find[nod]);
		}	

		for (int i = 1; i <= sir[0]; i++) {
        	int nod = sir[i];
			if (find[nod])
				for (vector<int>::iterator it = comp[find[nod]].begin(); it != comp[find[nod]].end(); ++it)
					use[*it] = 0;
		}

		for (int i = 1; i <= sir[0]; i++) {
        	int fiu = sir[i];
			int len = G[fiu].size();

			for (int j = 0; j < len; j++) {
				if (col[fiu][j] == 0 && sol[fiu] == 0 && sol[G[fiu][j]] == 0) {
					bad[++bad[0]] = sir[i];
                	break;
				}

            	if (col[fiu][j] == 1 && sol[fiu] == 1 && sol[G[fiu][j]] == 1) {
					bad[++bad[0]] = sir[i];
                	break;
				}

				if (col[fiu][j] == 2 && sol[fiu] == sol[G[fiu][j]]) {
					bad[++bad[0]] = sir[i];
					break;
				}
			}
		}

		if (bad[0] == 0)
			break;
		else {
			for (int i = 1; i <= 3; i++) {
	        	int poz = rand() % bad[0] + 1;
				sol[poz] = 1 - sol[poz];
			}
		}
	}

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