Pagini recente » Cod sursa (job #728493) | Cod sursa (job #2546497) | Cod sursa (job #447479) | Cod sursa (job #2694323) | Cod sursa (job #180066)
Cod sursa(job #180066)
#include <stdio.h>
long depth, max, i, n, j, y[5001], x[5001], a[5001], b[5001], c[5001], used[5001];
long egale(long i)
{
if (a[i] == b[i] || b[i] == c[i] || a[i] == c[i])
return 1;
return 0;
}
long min(long a, long b)
{
return a < b ? a : b;
}
void do_(long st, long dr)
{
++depth;
if (st > dr)
{
--depth;
return;
}
max = max < depth ? depth : max;
if (st == dr)
{
--depth;
y[++y[0]] = st;
return;
}
long k = egale(dr - st);
if (k)
{
long i = st;
while (used[i])
++i;
x[st + min(min(a[dr - st], b[dr - st]), c[dr - st]) - 1] = i;
/*if (!x[st + a[dr - st]])
x[st + a[dr - st]] = i;
else
if (!x[st + b[dr - st]])
x[st + b[dr - st]] = i;
else
if (!x[st + c[dr - st]])
x[st + c[dr - st]] = i;*/
//printf("%ld ", i);
used[i] = 1;
do_(st, i - 1);
do_(i + 1, dr);
}
else
{
long i = st, l = 0;
while (used[i] || !l)
{
if (!used[i])
{
/* if (!x[st + a[dr - st]])
x[st + a[dr - st]] = i;
else
if (!x[st + b[dr - st]])
x[st + b[dr - st]] = i;
else
if (!x[st + c[dr - st]])
x[st + c[dr - st]] = i;
*/
l = 1;
}
++i;
}
//printf("%ld ", i);
x[st + min(min(a[dr - st], b[dr - st]), c[dr - st]) - 1] = i;
/*if (!x[st + a[dr - st]])
x[st + a[dr - st]] = i;
else
if (!x[st + b[dr - st]])
x[st + b[dr - st]] = i;
else
if (!x[st + c[dr - st]])
x[st + c[dr - st]] = i;*/
used[i] = 1;
do_(st, i - 1);
do_(i + 1, dr);
}
--depth;
}
int main()
{
freopen ("sortare.in", "rt", stdin);
freopen ("sortare.out", "wt", stdout);
scanf("%ld", &n);
for (i = 1; i < n; ++i)
scanf("%ld %ld %ld", &a[i], &b[i], &c[i]);
do_(1, n);
printf("%ld\n", max);
j = 1;
for (i = 1; i <= n; ++i)
{
if (x[i])
printf("%ld ", x[i]);
else
{
printf("%ld ", y[j]);
++j;
}
}
printf("\n");
return 0;
}