Pagini recente » Cod sursa (job #243527) | Cod sursa (job #2948548) | Cod sursa (job #2754555) | Cod sursa (job #1231104) | Cod sursa (job #163619)
Cod sursa(job #163619)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
#define NMAX 5010
int N;
vector <int> poz[NMAX];
int npoz[NMAX];
int lmax[NMAX];
int sol[NMAX];
vector <int> pp[NMAX];
int *perm[NMAX];
inline int MAX(int a, int b) { return (a > b) ? a : b; }
void rec_sol(int N)
{
if (N <= 1) return;
int q = sol[N], w = N - q - 1;
if (q > w) { rec_sol(q); rec_sol(w); }
else { rec_sol(w); rec_sol(q); }
free(perm[N]);
perm[N] = (int *) malloc((N + 1) * sizeof(int));
int i, j;
for (i = 1; i <= N; i++) perm[N][i] = 0;
perm[N][poz[N][0]] = q + 1;
for (i = 1, j = 1; i <= N && j < q; i++) {
if (perm[N][i]) continue;
perm[N][i] = perm[q][j++];
}
if (npoz[N] >= 2 && !perm[N][ poz[N][1] ] && q) perm[N][ poz[N][1] ] = perm[q][j++];
for (; i <= N && j <= q; i++) {
if (perm[N][i]) continue;
perm[N][i] = perm[q][j++];
}
for (i = 1, j = 1; i <= N; i++) {
if (perm[N][i]) continue;
perm[N][i] = perm[w][j++] + q + 1;
}
// printf("%d - %d %d\n", N, q, w);
// for (i = 1; i <= N; i++) printf("%d ", perm[N][i]);
// printf("\n");
if (q != 1) free(perm[q]);
if (w != 1) free(perm[w]);
}
/*
int gen(int N)
{
freopen("sortare.in", "w", stdout);
printf("%d\n", N);
int i, j;
for (i = 2; i <= N; i++) {
for (j = 1; j <= 3; j++) printf("%d ", rand() % i + 1);
printf("\n");
}
fclose(stdout);
return 0;
}
*/
/*
int lvl = 0;
void sort(vector <int> a, int lv)
{
if (lv > lvl) lvl = lv;
int n = a.size(), i;
if (n <= 1) return;
vector <int> b, c;
vector <int> jeg;
for (int i = 0; i < 3; i++) jeg.push_back(a[ pp[n][i] - 1 ]);
sort(jeg.begin(), jeg.end());
int p = jeg[1];
for (i = 0; i < n; i++) if (a[i] < p) b.push_back(a[i]);
for (i = 0; i < n; i++) if (a[i] > p) c.push_back(a[i]);
sort(b, lv + 1);
sort(c, lv + 1);
}
*/
int main()
{
int i, j, q, x, y;
freopen("sortare.in", "r", stdin);
freopen("sortare.out", "w", stdout);
scanf("%d", &N);
for (i = 2; i <= N; i++) {
for (j = 1; j <= 3; j++) {
scanf("%d", &q);
poz[i].push_back(q);
pp[i].push_back(q);
}
sort(poz[i].begin(), poz[i].end());
poz[i].resize(unique(poz[i].begin(), poz[i].end()) - poz[i].begin());
npoz[i] = poz[i].size();
if (npoz[i] == 2) {
for (j = 0, q = 0; j < 3; j++) if (pp[i][j] == poz[i][1]) q++;
if (q == 2) swap(poz[i][0], poz[i][1]);
}
}
lmax[1] = 1;
for (i = 2; i <= N; i++) {
if (npoz[i] <= 2) x = 0, y = i - 1;
else x = 1, y = i - 2;
for (j = x; j <= y; j++) {
q = MAX(lmax[j], lmax[i - j - 1]) + 1;
if (q > lmax[i]) lmax[i] = q, sol[i] = j;
}
}
perm[1] = (int *) malloc(2 * sizeof(int));
perm[1][1] = 1;
rec_sol(N);
printf("%d\n", lmax[N]);
for (i = 1; i <= N; i++) printf("%d ", perm[N][i]);
printf("\n");
/* vector <int> jeg;
for (i = 1; i <= N; i++) jeg.push_back(perm[N][i]);
sort(jeg, 1);
printf("%d %d\n", lvl, lmax[N]);
*/
return 0;
}