题解 | #桃花#
桃花
https://www.nowcoder.com/practice/1412d30c54644fd49d21894c2967fe85
直接求一下直径后 即可。直径是最基础的求法:
- 任选一个点深搜,找最远的点
。
- 从最远的点
开始深搜,找最远的点
。
即为树的直径。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii array<int, 2>
#define endl "\n"
struct Tree {
int n;
vector<vector<int>> ver;
Tree(int n) {
this->n = n;
ver.resize(n + 1);
}
void add(int x, int y) {
ver[x].push_back(y);
ver[y].push_back(x);
}
int getlen(int root) {
vector<int> dep(n + 1);
function<void(int, int)> dfs = [&](int x, int fa) -> void {
for (auto y : ver[x]) {
if (y == fa) continue;
dep[y] = dep[x] + 1;
dfs(y, x);
}
if (dep[x] > dep[root]) {
root = x;
}
};
dfs(root, 0);
int st = root;
dep.assign(n + 1, 0);
dfs(root, 0);
int ed = root;
return dep[root];
}
};
void solve() {
int n;
cin >> n;
Tree tr(n);
for (int i = 1, u, v; i < n; ++i) {
cin >> u >> v;
tr.add(u, v);
}
cout << tr.getlen(1) + 1 << endl;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
// cin >> t;
for (int i = 0; i < t; ++i) {
solve();
}
return 0;
}