Cod sursa(job #29352)

Utilizator cypryCiprian Oprisa cypry Data 9 martie 2007 09:19:51
Problema Party Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<stdio.h>
#include<string.h>
#define NMAX 101

int n,v[NMAX],uz[NMAX],a[NMAX][NMAX],coada[NMAX];

void citire(void)
{
 int  i,m,x,y,z;
 scanf("%d %d",&n,&m);
 for(i=1;i<=m;++i)
  {
   scanf("%d %d %d",&x,&y,&z);
   if(!z) z=4;
   if(z>=3)
    {
     a[x][y]=z;
     a[y][x]=z;
    }else if(z==1) a[y][x]=1;
     else a[x][y]=1;
  }
}

int sol(int k)
{
 memset(v,0,(n+1)*sizeof(int));
 memset(uz,0,(n+1)*sizeof(int));
 memset(coada,0,(n+1)*sizeof(int));
 v[k]=1;
 uz[k]=1;
 int i,x=0,y=1;
 coada[1]=k;
 while(x<y)
  {
   k=coada[++x];
   for(i=1;i<=n;++i)
    if(a[i][k])
     {
      if(a[i][k]==3 && v[k])
       {
	if(uz[i] && v[i]) return 0;
	v[i]=0;
	if(!uz[i])
	 {
	  uz[i]=1;
	  coada[++y]=i;
	 }
       }else if(a[i][k]==4 && !v[k])
	{
	 if(uz[i] && !v[i]) return 0;
	 v[i]=1;
	 if(!uz[i])
	  {
	   uz[i]=1;
	   coada[++y]=i;
	  }
	}else if(!v[i])//a[i][k]==1
	 {
	  if(uz[i] && v[i]) return 0;
	  v[i]=0;
	  if(!uz[i])
	   {
	    uz[i]=1;
	    coada[++y]=i;
	   }
	 }
     }

  }
 return 1;
}

int solutie(void)
{
 int i=0,nr=0;
 do{++i;}while(!sol(i));
 for(i=1;i<=n;++i)
  nr+=v[i];
 return nr;
}

void afisare(void)
{
 int i;
 printf("%d\n",solutie());
 for(i=1;i<=n;++i)
  if(v[i]) printf("%d\n",i);
}

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