自己做题的时候没有注意节点度和路径数目之间的关系,赛后和同学沟通才知道- -。
如若是没有重复的将所有的路径都覆盖住。那么必然是从一个叶子节点经过若干节点后又到达另一个节点。
所以一条路径最多包含两个叶子,最少是一个。所以求出叶子点然后+1再ceil除2即可。
另一个又重复的话,就是S(节点度数-1)/2,最后再加1。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<math.h>
#include<ctime>
#include<set>
#include<cstdlib>
#include<map>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
int du[1000010];
int main()
{
int n,m,i,j,k,t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(du,0,sizeof(du));
for(i=1; i<n; i++)
{
scanf("%d",&k);
du[k]++,du[i]++;
}
if(n==1)
{
printf("0 0\n");
continue;
}
int ans=0;
int ans2=0;
for(i=0; i<n; i++)
{
if(1==du[i])
ans++;
else
ans2+=( (du[i]-1)/2);
}
printf("%d %d\n",(ans+1)/2,ans2+1);
}
return 0;
}