Cod sursa(job #467218)

Utilizator Mishu91Andrei Misarca Mishu91 Data 28 iunie 2010 13:07:37
Problema Andrei Scor 0
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 2.32 kb
#include <fstream>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <ctime>

using namespace std;

#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)

const int MAX_N = 100005;
const int MAX_M = 200005;

ifstream fin ("andrei.in");
ofstream fout ("andrei.out");

int N, M, K, cul[MAX_N];
char viz[MAX_N];
vector <pair<int, int> > G[MAX_N];
vector <int> conex[MAX_N];

void citire() {
	fin >> N >> M;

    for(int i = 1; i <= M; ++i) {
		int a, b, c;
		fin >> a >> b >> c;

		G[a].push_back(make_pair(b, c));
		G[b].push_back(make_pair(a, c));
	}
}

int dfs(int nod) {
    int ans = 1;

	foreach(G[nod]) {
		if(cul[nod] == 0) {
			if(cul[it -> first] == 1) {
				if(it -> second == 2)
					return 0;
			}

			if(cul[it -> first] == 0) {
				if(it -> second == 0)
					return 0;
			}

			if(cul[it -> first] == -1) {
                if(it -> second == 0) {
					cul[it -> first] = 1;
					ans &= dfs(it -> first);
				}

				if(it -> second == 1) {
					cul[it -> first] = rand() & 1;
					ans &= dfs(it -> first);
				}

				if(it -> second == 2) {
					cul[it -> first] = 0;
					ans &= dfs(it -> first);
				}
			}
		} else {
			if(cul[it -> first] == 1) {
				if(it -> second == 1)
					return 0;
			}

			if(cul[it -> first] == 0) {
				if(it -> second == 2)
					return 0;
			}

			if(cul[it -> first] == -1) {
				if(it -> second == 0) {
					cul[it -> first] = rand() & 1;
					ans &= dfs(it -> first);
				}

				if(it -> second == 1) {
					cul[it -> first] = 0;
					ans &= dfs(it -> first);
				}

				if(it -> second == 2) {
					cul[it -> first] = 1;
                    ans &= dfs(it -> first);
				}
			}
		}
	}

	return 1;
}

void solve() {
	srand(time(NULL));

	for(int k = 1; k <= K; ++k) {
		foreach(conex[k]) {
			for(int c = 0; c < 2; ++c) {
				memset(cul, -1, sizeof cul);

				cul[*it] = c;
				if(dfs(*it) && k == K) {
					bool ok = true;
					for(int i = 1; i <= N; ++i)
						if(cul[i] == -1)
							ok = false;
				
					if(ok) {
						for(int i = 1; i <= N; ++i)
							fout << cul[i] << " ";
						return;
					}
				}
			}
		}
	}
}

void df(int nod) {
	conex[K].push_back(nod);
	viz[nod] = 1;

	foreach(G[nod]) {
		if(viz[it -> first] == 0)
			df(it -> first);
	}
}

int main() {
	srand(time(NULL));
	citire();

	for(int i = 1; i <= N; ++i) {
		if(viz[i] == 0) {
			++K;
			df(i);
		}
	}
	solve();
}