#include #include #include #include #include #include #include #include #include using namespace std; const int N = 100000; const int M = 18; int n; vector son[N+1]; vector e[N+1]; int F[N+1][M+1]; bool done[N+1][M+1]; int G[N+1]; int G_which[N+1]; void dfs(int cur, int from) { for(int i = 0; i < e[cur].size(); i++) { if(e[cur][i] == from) continue; son[cur].push_back(e[cur][i]); dfs(e[cur][i], cur); } } int f(int cur, int need); int g(int cur); // the answer for subtree rooted at cur int g(int cur) { if(G[cur] != -1) return G[cur]; int maxv = -1, which = 0, cnt = 0; for(int i = 0; i < son[cur].size(); i++) { int v = g(son[cur][i]); if(v > maxv) { maxv = v; which = son[cur][i]; cnt = 0; } if(v == maxv) cnt ++; } if(maxv == -1) G[cur] = 0; else if(cnt > 1) { G[cur] = maxv + 1; } else { if(f(which, maxv) == 0) G[cur] = maxv + 1; else G[cur] = maxv; } return G[cur]; } // what is the max number k such that // if we append a chain with k nodes at cur as parent, the answer is at most need // if even k = 0 is not ok, return -1 int f(int cur, int need) { if(G[cur] != -1) { if(need < G[cur]) return -1; if(need > G[cur] + 17) return (1<<22); } if(done[cur][need - G[cur]]) return F[cur][need - G[cur]]; done[cur][need - G[cur]] = true; int ret = -1; if(son[cur].size() == 0) { ret = (need == 0 ? 0 : (1 << (min(need, 22) - 1))); } else { int which = 0, val = -1; for(int i = 0; i < son[cur].size(); i++) { int v = g(son[cur][i]) + 1; if(v > val) { val = v; which = i; } } int otherMax = 0; int nextF = -1; for(int i = 0; i < son[cur].size(); i++) { if(i == which) { nextF = f(son[cur][i], need) - 1; } else { otherMax = max(otherMax, g(son[cur][i]) + 1); } } if(nextF >= 0 && otherMax <= need) { int lef = need - otherMax; ret = min(nextF, lef == 0 ? 0 : (1 << (min(lef, 22) - 1))); } } F[cur][need - G[cur]] = ret; return ret; } int MAIN() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i = 0; i <= n; i++) { e[i].clear(); son[i].clear(); } for(int i = 0; i < n-1; i++) { int a, b; scanf("%d %d", &a, &b); e[a].push_back(b); e[b].push_back(a); } memset(done, false, sizeof(done)); memset(G, 0xff, sizeof(G)); dfs(1, -1); printf("%d\n", g(1)); } return 0; } int main() { int start = clock(); #ifdef LOCAL_TEST freopen("100000_1.in", "r", stdin); freopen("100000_1.out", "w", stdout); #endif int ret = MAIN(); return ret; }