Cod sursa(job #467122)

Utilizator katakunaCazacu Alexandru katakuna Data 28 iunie 2010 11:56:45
Problema Andrei Scor 50
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.44 kb
#include <cstdio>
#include <stdlib.h>
#include <ctime>

#define Nmax 100010
#define Mmax 200010

struct muchie {int x, y, c;} M[Mmax];
int n, m;
int sol[Nmax];

void citire () {
	
	scanf ("%d %d", &n, &m);
	for (int i = 1; i <= m; i++) 
		scanf ("%d %d %d", &M[i].x, &M[i].y, &M[i].c);
}

void rezolva () {
	
	int i, ok = 0, nod;
	for (ok = 0; !ok; ) {
		ok = 1;
		for (i = 1; i <= m; i++) {
			if (M[i].c == 0) {
				if ( !sol[ M[i].x ] && !sol[M[i].y] ) {
					if ( (rand()&1) == 0 ) {
						ok = 0;
						nod = M[i].x;
						break;
					}
					else {
						ok = 0;
						nod = M[i].y;
						break;
					}
				}
			}
			else {
				if (M[i].c == 1) {
					if ( sol[ M[i].x ] && sol[M[i].y] ) {
						if ( (rand()&1) == 0 ) {
							ok = 0;
							nod = M[i].x;
							break;
						}
						else {
							ok = 0;
							nod = M[i].y;
							break;
						}
					}	
				}
				else {
					if ( sol[ M[i].x ] != sol[M[i].y] ) {
						if ( (rand()&1) == 0 ) {
							ok = 0;
							nod = M[i].x;
							break;
						}
						else {
							ok = 0;
							nod = M[i].y;
							break;
						}
					}
				}
			}
		}
		
		if (ok) return ;
		
		if (sol[nod] == 1) sol[nod] = 0;
		else sol[nod] = 1;
	}
}

int main () {

	freopen ("andrei.in", "r", stdin);
	freopen ("andrei.out", "w", stdout);
	
	citire ();
	rezolva ();
	
	for (int i = 1; i <= n; i++)
		printf ("%d ", sol[i]);
	
	return 0;
}