#include using namespace std; using ll = long long; int MN = 1e6; vector> G(MN); int N; vector dp1(MN, 0); vector dist(MN, 0); void dfs(int v, int par) { for (auto nv : G[v]) { if (nv == par) continue; dfs(nv, v); dist[nv] = dist[v] + 1; dp1[v] = max(dp1[v], dp1[nv]+1); } } vector> DP(MN, vector(2, -1)); int res = 1; void dfs2(int v,int par) { multiset st; // cout << v<< " " << DP[v][0] << " " << DP[v][1] << endl; map cnt; for (auto nv : G[v]) { if (nv == par) continue; st.insert(dp1[nv]+1); cnt[dp1[nv]+1]++; } res = max(res, dist[v]+1); int dmx = max(DP[v][0], DP[v][1]); if (dmx != -1) { res = max(res, dmx+1); } for (auto v : cnt) { int d = v.first;int c = v.second; if (d <= dmx) { res = max(res, 1 + (d*(c+1))); } } for (auto nv : G[v]) { if (nv == par) continue; st.erase(st.find(dp1[nv] + 1)); //0 if (!st.empty()) DP[nv][0] = 1 + (*st.rbegin()); //1 if (DP[v][0] != -1) DP[nv][1] = 1 + DP[v][0]; if (DP[v][1] != -1) DP[nv][1] = max(DP[nv][1], 1 + DP[v][1]); st.insert(dp1[nv] + 1); dfs2(nv, v); } } int main() { cin >> N; for (int i = 0;i < N-1;i++) { int u, v;cin >> u >> v; u--;v--; G[u].push_back(v); G[v].push_back(u); } dfs(0, 0); dfs2(0, 0); cout << res << endl; }