///对于树的每一层来说,将这一层每一个节点的需要的石头的数目计算并存储,然后对这些数目进行排序 ///从最大的数目开始例如a1,a2 。。。a1满足,若a1大于a2,则除去a1之后应该还剩a1-1个石头,又因为 ///a1大于a2所以a1-1个石头必然满足a2。若a1等于a2,则a1-1小于a2,应该添加一个石头,如此考虑。。 ///排序 #include<stdio.h> #include<algorithm> using namespace std; int tree[205][205]; int cmp(const void* _a,const void* _b) { int* a=(int *)_a; int* b=(int *)_b; return -(*a-*b); } int f(int p) { int i,j; int temp[205],max=0; if(tree[p][1]==0) return 1; for(i=1;i<=tree[p][1];i++) temp[i]=f(tree[p][i+1]); qsort(&temp[1],i-1,sizeof(temp[1]),cmp); for(i=1;i<=tree[p][1];i++) if(temp[i]+i-1>max)max=temp[i]+i-1; return max; } int main() { int cas; scanf("%d",&cas); while(cas--) { int n,i,j,ans; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d%d",&tree[i][0],&tree[i][1]); for(j=2;j<=tree[i][1]+1;j++) scanf("%d",&tree[i][j]); } ans=f(1); printf("%d/n",ans); } return 0; }