题解 | #桃花#

桃花

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;
}
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务