Cod sursa(job #30178)

Utilizator pocaituDavid si Goliat pocaitu Data 13 martie 2007 02:08:46
Problema Party Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<stdlib.h>

#define nmax 104
#define mmax 1004
int long e[mmax][4],val[nmax],n,m;

int long gaseste(int long x)
{int long i;
 //randomize();

 for(i=x;i<=m;i++)
  {if(e[i][0]==0)
	 {if(!(val[e[i][1]]||val[e[i][2]]))
	   return i;
	  }
   if(e[i][0]==3)
	 {if(val[e[i][1]]&&val[e[i][2]])
		return i;
	 }
   if(e[i][0]==1)
	{if(!val[e[i][1]]&&val[e[i][2]])
	   return i;
	}
   }
 for(i=1;i<x;i++)
  {if(e[i][0]==0)
	 {if(!(val[e[i][1]]||val[e[i][2]]))
	   return i;
	  }
   if(e[i][0]==3)
	 {if(val[e[i][1]]&&val[e[i][2]])
		return i;
	 }
   if(e[i][0]==1)
	{if(!val[e[i][1]]&&val[e[i][2]])
	   return i;
	}
   }

 for(i=1;i<=n;i++)
  if(val[i])
	return m+1;
 //randomize();



 i=rand()%m+1;
 return i;
 }




int main()
{int long i,a,b,c,x,nr=0;
 freopen("party.in","r",stdin);
 scanf("%d%d",&n,&m);
 //randomize();

 for(i=1;i<=m;i++)
  {scanf("%d%d%d",&a,&b,&c);
   if(c==2)
	{e[i][1]=b;
	e[i][2]=a;
	e[i][0]=1;
	}
   else
   {
   e[i][1]=a;
   e[i][2]=b;
   e[i][0]=c;
   }
   //val[i]=0;
   }

 do
  {//randomize();
   i=rand()%m+1;
   x=gaseste(i);
   a=rand()%2;
   if(x!=m+1)
   val[e[x][a+1]]=!val[e[x][a+1]];

   }
   while(x!=m+1);

 freopen("party.out","w",stdout);
 for(i=1;i<=n;i++)
  if(val[i])
	nr++;
 printf("%d\n",nr);
 for(i=1;i<=n;i++)
  if(val[i])
   printf("%d\n",i);
 fclose(stdout);
 return 0;
 }