树形dp

记录Max1,Max2,up,而后便可以得出用经过每个点的最大(小)路径
leecode

class Solution {
public:
    vector<vector<int>> g;
    vector<int> d1, d2, p1, p2, up;

    void dfs1(int u, int father) {
        for(auto x : g[u]) {
            if(x == father) continue;
            dfs1(x, u);
            int d = d1[x] + 1;
            if(d >= d1[u]) {
                d2[u] = d1[u], d1[u] = d;
                p2[u] = p1[u], p1[u] = x;
            } else if(d > d2[u]) {
                d2[u] = d;
                p2[u] = x;
            }
        }
    }

    void dfs2(int u, int father) {
        for(auto x : g[u]) {
            if(x == father) continue;
            if(p1[u] == x) up[x] = max(up[u], d2[u]) + 1;
            else up[x] = max(up[u], d1[u]) + 1;
            dfs2(x, u);
        }
    }

    vector<int> findMinHeightTrees(int n, vector<vector<int>>& edges) {
        g = vector<vector<int>> (n);
        d1 = d2 = p1 = p2 = up = vector<int> (n);
        for(auto& e : edges) {
            int a = e[0], b = e[1];
            g[a].push_back(b), g[b].push_back(a);
        }
        dfs1(0, -1);
        dfs2(0, -1);

        int mind = n + 1;
        for(int i = 0; i < n; i ++) mind = min(mind, max(up[i], d1[i]));
        vector<int> res;
        for(int i = 0; i < n; i ++)
            if(max(up[i], d1[i]) == mind)
                res.push_back(i);
        return res;
    }
};

posted @ 2022-04-06 15:39  兮何其  阅读(24)  评论(0)    收藏  举报