考虑good tree 长什么样子, 除了一点可以有2个儿子有儿子以外, 其余点最多只能有一个儿子有儿子。
然后直接dp就好啦。
#include<bits/stdc++.h> #define fi first #define se second #define mk make_pair using namespace std; const int N = (int)3e5 + 7; int n; int dp[N]; int ans; vector<int> G[N]; void update(pair<int, int> &A, int B) { if(B > A.fi) A = mk(B, A.fi); else A = mk(A.fi, max(A.se, B)); } void dfs(int u, int fa) { dp[u] = 1; pair<int, int> mx(-1, -1); int child = 0, gg = 0; for(auto &v : G[u]) { if(v == fa) continue; child++; dfs(v, u); update(mx, dp[v]); } dp[u] = max(dp[u], mx.fi + child); if(child >= 2) ans = max(ans, mx.fi + mx.se + child - 1 + (fa != 0)); ans = max(ans, dp[u]); } void init() { for(int i = 1; i <= n; i++) { G[i].clear(); } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); init(); ans = 1; for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(1, 0); printf("%d ", ans); } return 0; }