Cod sursa(job #173817)

Utilizator DorinOltean Dorin Dorin Data 8 aprilie 2008 09:25:38
Problema Sortare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
# include<stdio.h>

# define input "sortare.in"
# define output "sortare.out"

# define max 5001

int u[max],i,n,pos[max],j,pas,m,add;
int res, N;

struct pozitii
{
	   int x,y,z;
}p[max];

void solve(int n)
{
     res++;
     if( n == 1)
     {
		u[pos[1]] = 1;
        return;
     }
     if(n == 2)
	 {
		 if(p[2].x == p[2].y || p[2].x == p[2].z)
			 u[pos[p[2].x]] = 2;
		 else
			 u[pos[p[2].y]] = 2;
		j = 0;
		for(i=1;i<=N;i++)
			if(!u[i])
				pos[++j] = i;
         solve(n-1);
         return;
     }
     if ( p[n].x != p[n].y && p[n].y != p[n].z)
	 {
          u[pos[ p[n].x ]] = n;
          u[pos[ p[n].y ]] = n-1;
		  j = 0;
		  for(i=1;i<=N;i++)
			  if(!u[i])
				 pos[++j] = i;
		  solve(n-2);
	 }
	 else
	 {
		 if(p[n].x == p[n].y || p[n].x == p[n].z)
			 u[pos[ p[n].x ]] = n;
		 else
			 u[pos[ p[n].y ]] = n;
		 j = 0;
		 for(i=1;i<=N;i++)
			 if(!u[i])
                 pos[++j] = i;
         solve (n-1);
     }
        
}

int main()
{
	freopen(input,"r",stdin);
	freopen(output,"w",stdout);

    scanf("%d",&n);
    m = n;
    for(i=2;i<=n;i++)
	   scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);

   for ( i =1; i<= n; i++)
	   pos[i] = i;

   N=n;
   
   solve(n);

   printf("%d\n",res);

   for(i = 1; i<=n;i++)
   {
//	 if(!u[i]) u[i] = 2;
	 printf("%d ",u[i]);
	}
    
	return 0;
}