Cod sursa(job #178291)

Utilizator devilkindSavin Tiberiu devilkind Data 14 aprilie 2008 12:58:46
Problema Sortare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define NMAX 5002
#define pb push_back
#define sz size()

long int a[NMAX][3],pot[NMAX],din[NMAX];
long int aux[NMAX],v[NMAX];
long int n;

void build(long int sh, long int L)
{
        long int i,j;

        
        if (L==0) return;
        if (L==1) {aux[0]=sh+1;return;}
        
        if (!pot[L]) build(2,L-2);
                else build(1,L-1);
        
        memset(v,0,sizeof(v));

        if (pot[L])
                {
                v[ a[L][2] ] = 1;
                }
                else {v[ a[L][2] ] = 2;v[ a[L][1] ] = 1;}

        j=0;
        for (i=0;i<L;i++)
                if (!v[i]) v[i]=aux[j++];

        for (i=0;i<L;i++)
                aux[i]=sh+v[i];
}

int main()
{
	freopen("sortare.in","r",stdin);
	freopen("sortare.out","w",stdout);

	long int i;

	scanf("%ld",&n);

	for (i=2;i<=n;i++)
		{
			scanf("%ld %ld %Ld",&a[i][0],&a[i][1],&a[i][2]);
                        a[i][0]--;a[i][1]--;a[i][2]--;
                        if ( (a[i][0]==a[i][1]) || (a[i][1]==a[i][2]) || (a[i][0]==a[i][2]) ) pot[i]=1;
                        sort(a[i],a[i]+3);                        
		}
	
	din[1]=1;
	for (i=2;i<=n;i++)
		if (pot[i]) din[i]=din[i-1]+1;
			else din[i]=din[i-2]+1;

        printf("%ld\n",din[n]);

        build(0,n);

        for (i=0;i<n;i++)
                printf("%ld ",v[i]);

	return 0;
}