Cod sursa(job #29702)

Utilizator cypryCiprian Oprisa cypry Data 9 martie 2007 19:49:07
Problema Party Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 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 p)
{
 memset(v,0,(n+1)*sizeof(int));
 memset(uz,0,(n+1)*sizeof(int));
 memset(coada,0,(n+1)*sizeof(int));
 v[p]=1;
 uz[p]=1;
 int i,x=0,y=1,k;
 coada[1]=p;
 while(x<y)
  {
   k=coada[++x];
   for(i=1;i<=n;++i)
    if(a[k][i])
     {
      if(a[k][i]==3 && v[k])
       {
	if(v[i]) return 0;
	//v[i]=0;
	if(!uz[i])
	 {
	  uz[i]=1;
	  coada[++y]=i;
	 }
       }else if(a[k][i]==4 && !v[k])
	{
	 if(uz[i] && !v[i]) return 0;
	 if(!uz[i])
	  {
	   v[i]=1;
	   uz[i]=1;
	   coada[++y]=i;
	  }
	}else if(!v[i] && v[k])//a[k][i]==1
	 {
	  if(uz[i]) return 0;
	  v[i]=1;
	  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;
}