Cod sursa(job #569637)

Utilizator rootsroots1 roots Data 1 aprilie 2011 21:33:59
Problema Party Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.15 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define Dim1 101
#define Dim2  1001

struct vector
{
	int x,y,z;
}v[Dim2];

char sol[Dim1];

int main()
{
	int M,N,i,nr,end,pos,cnt;

	freopen("party.in","r",stdin);

	scanf("%d%d",&N,&M);
	for(i=1;i<=M;i++) scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);

	srand(time(NULL));
	cnt=0;
	for(i=1;i<=N;i++)
	{
		sol[i]=rand()%2;
		cnt+=sol[i];
	}

	end=0;
	while(!end)
	{
		end=1;
		pos=rand()%M+1;

		for(i=pos;i<=M;i++)
			if(v[i].z==0)
			{
				if(sol[v[i].x]|sol[v[i].y]==0)
				{
					nr=rand()%2;
					cnt-=sol[v[i].x];
					cnt-=sol[v[i].y];
					if(!nr) sol[v[i].x]=1-sol[v[i].x];
					else sol[v[i].y]=1-sol[v[i].y];
					cnt+=sol[v[i].x];
					cnt+=sol[v[i].y];
					end=0;
					break;
				}
			}
			else
			if(v[i].z==1)
			{
				if(sol[v[i].x]==0&&sol[v[i].y]!=0)
				{
					nr=rand()%2;
					cnt-=sol[v[i].x];
					cnt-=sol[v[i].y];
					if(nr) sol[v[i].x]=1-sol[v[i].x];
					else sol[v[i].y]=1-sol[v[i].y];
					cnt+=sol[v[i].x];
					cnt+=sol[v[i].y];
					end=0;
					break;
				}
			}
			else
			if(v[i].z==2)
			{
				if(sol[v[i].y]==0&&sol[v[i].x]!=0)
				{
					nr=rand()%2;
					cnt-=sol[v[i].x];
					cnt-=sol[v[i].y];
					if(nr) sol[v[i].x]=1-sol[v[i].x];
					else sol[v[i].y]=1-sol[v[i].y];
					cnt+=sol[v[i].x];
					cnt+=sol[v[i].y];
					end=0;
					break;
				}
			}
			else
			if(v[i].z==3)
			{
				if(sol[v[i].x]&sol[v[i].y]==1)
				{
					nr=rand()%2;
					cnt-=sol[v[i].x];
					cnt-=sol[v[i].y];
					if(!nr) sol[v[i].x]=1-sol[v[i].x];
					else sol[v[i].y]=1-sol[v[i].y];
					cnt+=sol[v[i].x];
					cnt+=sol[v[i].y];
					end=0;
					break;
				}
			}

		if(!cnt) end=0;
		if(end)
			for(i=1;i<pos;i++)
				if(v[i].z==0)
				{
					if(sol[v[i].x]|sol[v[i].y]==0)
					{
						nr=rand()%2;
						cnt-=sol[v[i].x];
						cnt-=sol[v[i].y];
						if(!nr) sol[v[i].x]=1-sol[v[i].x];
						else sol[v[i].y]=1-sol[v[i].y];
						cnt+=sol[v[i].x];
						cnt+=sol[v[i].y];
						end=0;
						break;
					}
				}
				else
				if(v[i].z==1)
				{
					if(sol[v[i].x]==0&&sol[v[i].y]!=0)
					{
						nr=rand()%2;
						cnt-=sol[v[i].x];
						cnt-=sol[v[i].y];
						if(nr) sol[v[i].x]=1-sol[v[i].x];
						else sol[v[i].y]=1-sol[v[i].y];
						cnt+=sol[v[i].x];
						cnt+=sol[v[i].y];
						end=0;
						break;
					}
				}
				else
				if(v[i].z==2)
				{
					if(sol[v[i].y]==0&&sol[v[i].x]!=0)
					{
						nr=rand()%2;
						cnt-=sol[v[i].x];
						cnt-=sol[v[i].y];
						if(nr) sol[v[i].x]=1-sol[v[i].x];
						else sol[v[i].y]=1-sol[v[i].y];
						cnt+=sol[v[i].x];
						cnt+=sol[v[i].y];
						end=0;
						break;
					}
				}
				else
				if(v[i].z==3)
				{
					if(sol[v[i].x]&sol[v[i].y]==1)
					{
						nr=rand()%2;
						cnt-=sol[v[i].x];
						cnt-=sol[v[i].y];
						if(!nr) sol[v[i].x]=1-sol[v[i].x];
						else sol[v[i].y]=1-sol[v[i].y];
						cnt+=sol[v[i].x];
						cnt+=sol[v[i].y];
						end=0;
						break;
					}
				}
	}

	freopen("party.out","w",stdout);

	printf("%d\n",cnt);
	for(i=1;i<=N;i++) if(sol[i]) printf("%d\n",i);

	return 0;
}