Cod sursa(job #467246)

Utilizator AndreyPAndrei Poenaru AndreyP Data 28 iunie 2010 13:29:47
Problema Andrei Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 2 Marime 1.43 kb
#include <cstdio>
#include <cstdlib>
#include <bitset>
#include <vector>
using namespace std;
#define N 100010
#define pb push_back

int n;
char cul[N];
vector< int > a[N][3];
char unde[N];
bitset< 35 > e[3][35];

void scrie(int conf)
{
	--n;
	for(int i=0; i<n; ++i)
	{
		if((conf&(1<<i))!=0)
			printf("1 ");
		else
			printf("0 ");
	}
	if((conf&(1<<n))!=0)
		printf("1\n");
	else
		printf("0\n");
	exit(0);
}

void back(int nod,int conf)
{
	if(nod==n)
		scrie(conf);
	bool ok=true;
	for(int i=0; i<nod && ok; ++i)
	{
		if((conf&(1<<i))!=0)
		{
			if(e[2][nod][i]==1)
				ok=false;
		}
		else
		{
			if(e[0][nod][i]==1)
				ok=false;
		}
	}	
	if(ok && e[0][nod][nod]==1)
		ok=false;
	if(ok)
		back(nod+1,conf);
	
	ok=true;
	for(int i=0; i<nod && ok; ++i)
	{
		if((conf&(1<<i))!=0)
		{
			if(e[1][nod][i]==1)
				ok=false;
		}
		else
		{
			if(e[2][nod][i]==1)
				ok=false;
		}
	}
	if(ok && e[1][nod][nod]==1)
		ok=false;
	if(ok)
		back(nod+1,(conf|(1<<nod)));
}

inline void citire()
{
	int m;
	scanf("%d%d",&n,&m);
	int x,y,z;
	if(n<32)
	{
		for(int i=0; i<m; ++i)
		{
			scanf("%d%d%d",&x,&y,&z);
			--x;
			--y;
			e[z][x][y]=1;
			e[z][y][x]=1;
		}
		back(0,0);
		exit(0);
	}
	
	//for(int i=0; i<m; ++i)
	//{
	//	scanf("%d%d%d",&x,&y,&z);
}

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