不得不承认算法的的第一感觉的重要性,我这道题一看就形成了定势思维从叶子向根推,然后还很高兴的写代码,用快排,然后发现漏洞百出的,然后看了一眼别人的分析,才发现用递归从根到叶子才是正解啊,结果又是几乎拷贝了别人的代码,还是做的题太少了,要培养题感啊!
#include<iostream>
#include<cstdlib>
using namespace std;
int N[201][201];
int cmp(const void *a, const void *b)
{
return *(int *)b-*(int *)a;//降序排列的
}
int fun(int n)
{
int max,i;
int num[201];
if(N[n][0]==0)
return 1;
else
{
for(i=1; i<=N[n][0]; i++)
num[i-1]=fun(N[n][i]);//递归的方法计算的
qsort(num,N[n][0],sizeof(int),cmp);
max=-1;
for(i=0; i<N[n][0];i++)
if(num[i]+i>max)
max=num[i]+i;
}
return max;
}
int main()
{
int m,n,i,j;
cin>>m;
while(m--)
{
cin>>n;
for(i=1; i<=n; i++)
{
int p;
cin>>p;
cin>>N[i][0];//每一行的第一数代表的是这行的其他数的个数
for(j=1; j<=N[i][0]; j++)
cin>>N[i][j];
}
cout<<fun(1)<<endl;;
}
return 0;
}