rt,寄大分。
# include <bits/stdc++.h>
# define I return
# define AK 0
# define IOI ;
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int t, n, x, y, depth[500005], maxdep[500005], l, r, mid1, mid2, minx;
vector <int> v[500005];
void init (const int x, const int f) {
r = max (r, maxdep[x] = depth[x] = depth[f] + 1);
for (const int& i : v[x])
if (i != f)
init (i, x), maxdep[x] = max (maxdep[x], maxdep[i]);
return ;
}
int check (const int mid) {
int sum = 0;
// cerr << mid << ':';
for (int i = 2; i <= n; ++ i)
if (depth[i] > mid || maxdep[i] < mid)
++ sum;
// for (int i = 2; i <= n; ++ i) cerr << i << ':' << depth[i] << ',' << maxdep[i] << ':' << (depth[i] > mid || maxdep[i] < mid) << '\n';
// for (const int& i : v[1]) cerr << i << ':' << maxdep[i] << ',' << s[i] << '\n';
// cerr << sum << '\n';
return sum;
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> n;
for (int i = 1; i <= n; ++ i)
v[i].clear ();
for (int i = 1; i < n; ++ i)
cin >> x >> y, v[x].emplace_back (y), v[y].emplace_back (x);
l = r = 1, init (1, 0);
// cerr << check (3) << '\n';
// I AK IOI
// cerr << l << '~' << r << '\n';
// for (int i = 1; i <= 4; ++ i) cerr << i << ':' << check (i) << '\n';
// for (int i = 1; i <= n; ++ i) cerr << i << ':' << depth[i] << ',' << maxdep[i] << '\n';
// I AK IOI
while (r - l > 2) {
mid1 = l + (r - l) / 3, mid2 = r - (r - l) / 3;
// cerr << l << '~' << r << ':' << mid1 << ',' << mid2 << '\n';
if (check (mid1) > check (mid2))
l = mid1;
else
r = mid2;
}
minx = n - 1;
for (int i = l; i <= r; ++ i)
minx = min (minx, check (i));
cout << minx << '\n';
}
I AK IOI
}
/*
1
7
1 2
1 3
2 4
2 5
4 6
4 7
*/