int n; structNode { int to, next; } edge[400010]; int head[200010], tot; voidadd(int u, int v){ edge[++tot].to = v; edge[tot].next = head[u], head[u] = tot; } int dp[200010][2], Ans; voiddfs(int u, int fa){ vector<int> v0; for (int i = head[u]; i; i = edge[i].next) { int v = edge[i].to; if (v == fa) continue; dfs(v, u); v0.push_back(dp[v][0]); } sort(v0.begin(), v0.end(), greater<int>()); if (v0.size() >= 3) dp[u][0] = max(dp[u][0], v0[0] + 1); if (v0.size() >= 2 && u != 1) dp[u][1] = max(dp[u][1], v0[0] + 1); if (v0.size() >= 2) dp[u][0] = max(dp[u][0], 1); if (v0.size() >= 1 && u != 1) dp[u][1] = max(dp[u][1], 1); Ans = max({Ans, dp[u][0], dp[u][1]}); if (v0.size() >= 4) Ans = max(Ans, v0[0] + v0[1] + 1); if (v0.size() >= 3 && u != 1) Ans = max(Ans, v0[0] + v0[1] + 1); } voidinit(){ for (int i = 1; i <= n; i++) head[i] = 0; for (int i = 1; i <= tot; i++) edge[i].to = edge[i].next = 0; for (int i = 1; i <= n; i++) dp[i][0] = dp[i][1] = 0; Ans = 0; } voidsolve(){ n = read(); init(); for (int i = 1; i < n; i++) { int u = read(), v = read(); add(u, v), add(v, u); } dfs(1, -1); cout << Ans << endl; }