树的直径

树的直径做法:先随便找一个点,跑一个 dfs,记录每一个点的深度,然后找到深度最大的那个点,他就是

直径的一个端点,然后从这个点在跑一遍,找到深度最大的点,这个点就是另一个端点。

for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
    auto bfs = [&](int s) {
        std::queue<int> q;
        std::vector<int> d(n, -1);
        d[s] = 0;
        q.push(s);

        while (!q.empty()) {
            int x = q.front();
            q.pop();

            for (auto it : edge[x]) {
                if (d[it] == -1) {
                    d[it] = d[x] + 1;
                    q.push(it);
                }
            }
        }
        return d;
    };
    auto d0 = bfs(0);
    int s = std::max_element(d0.begin(), d0.end()) - d0.begin();
    auto ds = bfs(s);
    int t = std::max_element(ds.begin(), ds.end()) - ds.begin();
    auto dt = bfs(t);

Last updated