Link to this code:
https://cses.fi/paste/2105f8fa7fc266d6d9ba3f/#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2e6 + 5;
int dep[MAX_N], par[MAX_N], sub_sz[MAX_N], dist[MAX_N];
vector<int> tree[MAX_N]; // 1-based
void add_edge(int u, int v) {
tree[u].push_back(v);
tree[v].push_back(u);
}
int dfs(int u, int p = -1) {
int ans = 0;
par[u] = p;
sub_sz[u] = 1;
for (int v : tree[u]) {
if (v == p) continue;
dep[v] = dep[u] + 1;
dfs(v, u);
sub_sz[u] += sub_sz[v];
}
return ans;
}
int height(int root, int n) {
dfs(root);
int ht = 0;
for (int i = 1; i <= n; ++i) ht = max(ht, dep[i]);
return ht;
}
pair<int, int> farthest(int root, int root_par = -1) {
int best = root;
dist[best] = 0;
queue<pair<int, int>> q;
q.emplace(root, root_par);
while (!q.empty()) {
auto [u, p] = q.front();
q.pop();
if (dist[u] > dist[best]) best = u;
for (int v : tree[u]) {
if (v == p) continue;
dist[v] = dist[u] + 1;
q.emplace(v, u);
}
}
return {dist[best], best};
}
int diameter() {
auto [ht, fn] = farthest(1); // using BFS
auto [diam, _] = farthest(fn); // using BFS
return diam;
}
// centroid
void reset_tree(int n) {
for (int i = 0; i <= n; ++i) {
tree[i].clear();
dep[i] = sub_sz[i] = par[i] = dist[i] = 0;
}
}
void solve() {
int N;
cin >> N;
for (int i = 0; i < N - 1; ++i) {
int u, v;
cin >> u >> v;
// u++;v++ // for 0-based nodes
add_edge(u, v);
}
// int res = dfs(1);
// int ht = height(1, N);
int diam = diameter();
cout << diam;
// reset_tree(N); // in case of multiple test cases
}
int32_t main() {
solve();
return 0;
}