Pagini recente » Cod sursa (job #1290224) | Cod sursa (job #1837985) | Cod sursa (job #1640375) | Cod sursa (job #750751) | Cod sursa (job #163691)
Cod sursa(job #163691)
#include <cstdio>
#include <algorithm>
using namespace std;
#define pb push_back
const int MAX = 5010;
int v[MAX];
int ans[MAX];
int A[MAX][3];
int mx = 0,n,i;
int c,p;
bool comp(int x, int y) { // return x<y
if ( ans[x]==n+1 && ans[y]==n+1 )
if ( c==x ) ans[x] = p++;
else ans[y] = p++;
if ( ans[x]==n+1 ) {
c = x;
} else {
if ( ans[y]==n+1 ) c = y;
}
return ans[x]<ans[y];
}
int pp[3];
int tmp[2][MAX];
void qsort(int st, int dr, int d) {
mx = max(d, mx);
if ( dr<st )
return ;
int piv, n=dr-st+1;
// alegerea pivotului
pp[0] = v[st+A[n][0]];
pp[1] = v[st+A[n][1]];
pp[2] = v[st+A[n][2]];
sort(pp, pp+3, comp);
piv = pp[1];
int ss=0, dd=0, i, vp;
for (i=st; i<=dr; ++i) {
if ( v[i] == piv ) { vp=i; continue; }
if ( comp(v[i],piv) )
tmp[0][ss++]=v[i];
else
tmp[1][dd++]=v[i];
}
for (i=0; i<ss; ++i)
v[st+i] = tmp[0][i];
v[st+ss]=piv;
for (i=0; i<dd; ++i)
v[st+ss+1+i] = tmp[1][i];
qsort(st,st+ss-1, d+1);
qsort(st+ss+1,dr, d+1);
}
int main() {
freopen("sortare.in" ,"r", stdin);
scanf("%d", &n);
for (i=2; i<=n; ++i) {
scanf("%d%d%d", A[i], A[i]+1, A[i]+2);
A[i][0]--; A[i][1]--; A[i][2]--;
}
for (i=0; i<n; ++i)
v[i] = i, ans[i] = n+1;
qsort(0,n-1,1);
freopen("sortare.out","w", stdout);
printf("%d\n", mx-1);
for (i=0; i<n; ++i)
printf("%d ", ans[i]+1);
return 0;
}