Cod sursa(job #4821)

Utilizator m_dersidanDersidan Mihai m_dersidan Data 7 ianuarie 2007 23:23:55
Problema Party Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
# include <stdio.h>
# include <string.h>
# include <stdlib.h>

# define  _fin  "party.in"
# define  _fout "party.out"

# define  maxn  102
# define  maxm  1002


int part[maxn], cond[maxm][3];
int n, m;


void readf()
{
	freopen(_fin, "r", stdin);
	int i=1;
	
	for (scanf("%d %d", &n, &m); i<=m; i++)
		scanf("%d%d%d", &cond[i][0], &cond[i][1], &cond[i][2]);
}

int  booleq(int x, int y, int type)
{
	switch (type)
	{
		case 0 : return x | y;
		case 1 : return x | (!y);
		case 2 : return (!x) | y;
		case 3 : return (!x) | (!y);
	}
	
	return 270188;	// never
}

void constraint(int num)
{
	if ( num == m+1 )
	{
		int sol[maxn], i;
		for (sol[0]=0, i=1; i<=n; i++)
			if ( part[i]==1 )
				sol[ ++sol[0] ]=i;
		if ( !sol[0] ) return;
		freopen(_fout, "w", stdout);
		for (printf("%d\n", sol[0]),i=1; i<=sol[0]; i++)
			printf("%d\n", sol[i]);

		exit(0);
	}
	
	int i, j, rez, x, y, t;
	x = part[ cond[num][0] ], y = part[ cond[num][1] ], t = cond[num][2];
	
	for ( i=( x==-1?0:x ); i<=( x==-1?1:x ); i++)
		for ( j=( y==-1?0:y ); j<=( y==-1?1:y ); j++)
			if ( booleq(i, j, t) )
			{
				part[ cond[num][0] ] = i, part[ cond[num][1] ] = j;
				constraint(num+1);
			}
	part[ cond[num][0] ] = x,
	part[ cond[num][1] ] = y;
}

void solve()
{
	memset(part, 0xff, sizeof(part));
	constraint(1);
}

int main()
{
	readf();
	solve();
	
	return 0;
}