Pagini recente » Cod sursa (job #897794) | Cod sursa (job #862307) | Cod sursa (job #144933) | Cod sursa (job #5136) | Cod sursa (job #163615)
Cod sursa(job #163615)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 5010
#define stop 900000
#define max(a,b) (a > b ? a : b)
int n,m;
int A[maxn];
int sol,rez;
int x[maxn],y[maxn],z[maxn];
int a[maxn],u[maxn],s[maxn];
int v[maxn],b[maxn];
int part(int p,int r)
{
int i = p-1, j, aux = r-p+1;
v[0] = b[p+x[aux]-1], v[1] = b[p+y[aux]-1], v[2] = b[p+z[aux]-1];
sort(v,v+3);
int x = v[1];
for (j=p;j<=r;j++)
if (b[j] <= x)
{
i++;
aux = b[i];
b[i] = b[j];
b[j] = aux;
}
return i;
}
int qsort(int p,int r)
{
if (p<r)
{
int q = part(p,r);
int v1 = qsort(p,q-1);
int v2 = qsort(q+1,r);
return max(v1,v2) + 1;
}
return 1;
}
void check()
{
int i;
for (i=1;i<=n;i++) b[i] = a[i];
rez = qsort(1,n);
if (rez > sol)
{
sol = rez;
for (i=1;i<=n;i++) s[i] = a[i];
}
}
void back(int k)
{
if (k>n) check();
else {
int i;
for (i=1;i<=n;i++)
if (!u[i])
{
u[i] = 1;
a[k] = i;
back(k+1);
u[i] = 0;
}
}
}
void permgen()
{
int t,i,x;
srand(29041989);
for (i=1;i<=n;i++) a[i] = i;
check();
for (i=n;i>0;i--) a[i] = n-i+1;
check();
for (t=1;t*n<=stop;t++)
{
for (i=0;i<n;i++) A[i] = i+1;
m = n;
for (i=1;i<=n;i++)
{
x = rand()%m;
a[i] = A[x];
m--;
A[x] = A[m];
}
check();
}
}
int main()
{
freopen("sortare.in","r",stdin);
freopen("sortare.out","w",stdout);
scanf("%d ",&n);
int i;
for (i=2;i<=n;i++) scanf("%d %d %d ",&x[i],&y[i],&z[i]);
if (n <= 10) back(1);
else permgen();
printf("%d\n",sol);
for (i=1;i<=n;i++) printf("%d ",s[i]);
printf("\n");
return 0;
}