Pagini recente » Cod sursa (job #1176227) | Cod sursa (job #1182303) | Cod sursa (job #446124) | Cod sursa (job #94002) | Cod sursa (job #163519)
Cod sursa(job #163519)
#include <stdio.h>
#define Nmax 50005
int N,i;
int A[Nmax],B[Nmax],C[Nmax];
int set[Nmax],P[Nmax];
int maxdepth;
inline int maxim(int a,int b) { return a>b?a:b; }
void citire()
{
freopen("sortare.in","r",stdin);
scanf("%d",&N);
for (i=2;i<=N;++i)
scanf("%d %d %d",&A[i],&B[i],&C[i]);
}
void solve(int lvl,int poz,int max,int depth)
{
int i,j,where;
maxdepth=maxim(depth,maxdepth);
if (lvl==1)
{
for (i=max;set[i]==1;--i);
P[poz]=i;
set[i]=1;
return;
}
if (A[lvl]==B[lvl] || A[lvl]==C[lvl] || B[lvl]==C[lvl])
{
set[max]=1;
if (A[lvl]==B[lvl] || A[lvl]==C[lvl]) P[poz+A[lvl]-1]=max;
else if (B[lvl]==C[lvl]) P[poz+B[lvl]-1]=max;
solve(lvl-1,poz,max-1,depth+1);
}
else
{
//cauta elementul mijlociu
for (j=max;set[j]==1;--j);
for (i=j-1;set[i]==1;--i);
//pune elementul in permutare
set[i]=1;
where=maxim(A[lvl],maxim(B[lvl],C[lvl]));
P[poz+where-1]=i;
//rezolva pt intervalele ramase
if (where==lvl) where-=2;
solve(1,poz+where,j,depth+1);
solve(lvl-2,poz,i-1,depth+1);
}
}
int main()
{
citire();
solve(N,1,N,1);
freopen("sortare.out","w",stdout);
printf("%d\n",maxdepth);
for (i=1;i<=N;++i)
printf("%d ",P[i]);
fclose(stdout);
return 0;
}