Cod sursa(job #467201)

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

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, cul[MAX_N];
vector <pair<int, int> > G[MAX_N];
char viz[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() {
	for(int i = 1; i <= N; ++i) {
		for(int c = 0; c < 2; ++c) {
			memset(cul, -1, sizeof cul);
			memset(viz, 0, sizeof viz);

			cul[i] = c;
			if(dfs(i)) {
				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;
				}
			}
		}
	}
}

int main() {
	citire();
	solve();
}