思路:
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
#define pb push_back
#define lson p << 1
#define rson p << 1 | 1
#define fi first
#define se second
const int maxn = 1e6 + 5, maxm = 5e3 + 5;
int a[maxn], b[maxn];
int n, m;
string s;
vector<int> G[maxn];
int siz[maxn];
void dfs2(int u){
siz[u] = 1;
for(auto v : G[u]){
dfs2(v);
siz[u] += siz[v];
}
}
int dfs(int u, int k){
int tot = 0;
int id = 0;
for(auto v : G[u]){
tot += siz[v];
if(!id || siz[v] > siz[id]){
id = v;
}
}
if(siz[id] - k <= tot - siz[id]){
return (tot - k) / 2;
}
int add = tot - siz[id];
return add + dfs(id, max(0LL, k + add - 1));
//-1是减去根结点,因为根结点不能再跟子结点配对,所有在已经配对的结点中一定有根结点
}
void solve()
{
int k;
cin >> n;
for(int i = 1; i <= n; i++){
G[i].clear();
}
for(int i = 2; i <= n; i++){
int x;
cin >> x;
G[x].pb(i);
}
dfs2(1);
cout << dfs(1, 0) << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int T = 1;
cin >> T;
// for(int i = 1; i <= T; i++){
// num = i;
// solve();
// }
while (T--)
{
solve();
}
}