#include using namespace std; struct Edge { int u; int v; int cost; Edge(int a, int b, int c) : u(a), v(b), cost(c) { } }; using Graph = vector>; vector dp; int max_, max_2; void dfs(const Graph& G, int v, int p, int x, bool flag) { if (x == v) flag = false; for (auto nv : G[v]) { if (nv.v == p) continue; dfs(G, nv.v, v, x, flag); } if (flag) { int max1 = 0, max2 = 0; for (auto c : G[v]) { if (c.v == p) continue; if (max1 < dp[c.v]) { max2 = max1; max1 = dp[c.v]; } else if (max2 < dp[c.v]) { max2 = dp[c.v]; } } max_ = max(max_, max1 + max2 + 1); dp[v] = max1 + 1; } else { int max1 = 0, max2 = 0; for (auto c : G[v]) { if (c.v == p) continue; if (max1 < dp[c.v]) { max2 = max1; max1 = dp[c.v]; } else if (max2 < dp[c.v]) { max2 = dp[c.v]; } } max_2 = max(max_2, max1 + max2 + 1); dp[v] = max1 + 1; } if (x == v) dp[v] = 0; } void dfs2(const Graph& G, int v, int p) { for (auto nv : G[v]) { if (nv.v == p) continue; dfs2(G, nv.v, v); } ; for (auto c : G[v]) { if (c.v == p) continue; dp[v] = max(dp[v], dp[c.v] + 1); } } int main() { int N; cin >> N; Graph G(N); for (int i = 0; i < N - 1; i++) { int a, b; cin >> a >> b; G[a - 1].emplace_back(a - 1, b - 1, 1); G[b - 1].emplace_back(b - 1, a - 1, 1); } bool flag = true; for (int i = 0; i < N; i++) { if (G[i].size() >= 3) flag = false; } if (flag) { cout << N << endl; return 0; } int ans = 0; for (int i = 0; i < N; i++) { dp.assign(N, 0); max_ = 0; max_2 = 0; dfs(G, 0, -1, i, true); ans = max(ans, max_ + max_2); } cout << ans << endl; }