Pagini recente » Cod sursa (job #3204672) | Cod sursa (job #2004190) | Cod sursa (job #2960) | Cod sursa (job #2704077) | Cod sursa (job #2647145)
#include <bits/stdc++.h>
#define DIM 5010
using namespace std;
int a[DIM],b[DIM],c[DIM],sol[DIM],poz[DIM];
int n,i,adancime;
void qsort (int poz[], int n, int val1, int val2, int level){
adancime = max (adancime,level);
if (n <= 1){
if (n)
sol[poz[1]] = val1;
return;
}
int Left[DIM], Right[DIM];
if (a[n] != b[n] && b[n] != c[n] && a[n] != c[n]){
/// pivotul o sa fie val1+1;
sol[poz[b[n]]] = val1+1;
sol[poz[a[n]]] = val1; /// nu stiu cat de ok e asta??
Left[1] = poz[a[n]];
int k = 0;
for (int i=1;i<=n;i++){
if (i != a[n] && i != b[n])
Right[++k] = poz[i];
}
qsort (Left,1,val1,val1,level+1);
qsort (Right,k,val1+2,val2,level+1);
} else {
/// doua sunt egale => pot sa am pivotul == val1
int k = 0;
if (a[n] == b[n] || a[n] == c[n]){
sol[poz[a[n]]] = val1;
for (int i=1;i<=n;i++){
if (i != a[n])
Right[++k] = poz[i];
}
} else { /// b[n] == c[n];
sol[poz[b[n]]] = val1;
for (int i=1;i<=n;i++){
if (i != b[n])
Right[++k] = poz[i];
}}
qsort (Left,0,0,0,level+1);
qsort (Right,k,val1+1,val2,level+1);
}
}
int main (){
ifstream cin ("sortare.in");
ofstream cout ("sortare.out");
cin>>n;
for (i=2;i<=n;i++)
cin>>a[i]>>b[i]>>c[i];
for (i=1;i<=n;i++)
poz[i] = i;
qsort (poz,n,1,n,1);
cout<<adancime<<"\n";
for (i=1;i<=n;i++)
cout<<sol[i]<<" ";
return 0;
}