#include using namespace std; using ll = long long; #ifdef LOCAL #include "debug.h" #else #define dbg(...) 0 #define dbgn(...) 0 #endif const int MAXN = 200005; vector adj[MAXN]; int d[MAXN]; ll ans = 0; int N; void dfs1(int u, int p) { d[u] = 0; for (int v : adj[u]) { if (v == p) continue; dfs1(v, u); d[u] = max(d[u], 1 + d[v]); } } void dfs2(int u, int p, int up_val) { vector branches; if (p != 0) { branches.push_back(up_val); } for (int v : adj[u]) { if (v == p) continue; branches.push_back(1 + d[v]); } sort(branches.begin(), branches.end()); for (size_t i = 0; i < branches.size(); i++) { ll len = branches[i]; ll count = branches.size() - i; ans = max(ans, (ll)1 + len * count); } vector> c_paths; for (int v : adj[u]) { if (v == p) continue; c_paths.push_back({1 + d[v], v}); } sort(c_paths.rbegin(), c_paths.rend()); for (int v : adj[u]) { if (v == p) continue; int up_alt = up_val; if (!c_paths.empty()) { if (c_paths[0].second == v) { if (c_paths.size() > 1) { up_alt = max(up_alt, c_paths[1].first); } } else { up_alt = max(up_alt, c_paths[0].first); } } int next_up = 1 + up_alt; dfs2(v, u, next_up); } } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> N; for (int i = 0; i < N - 1; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } ans = 1; dfs1(1, 0); dfs2(1, 0, 0); cout << ans << '\n'; return 0; }