树上问题
树的直径
树上任意两节点之间最长的简单路径即为树的「直径」
当以某个节点为根时,从这个节点出发,会得到最长路径d1和次长路径d2,则以该节点为根的最长路径为d1 + d2
// 已知树边关系 : vector<vector<int>> graph(n)
int maxLen = 0;
function<int(int)> dfs = [&](int root) {
int maxRootLen = 0;
for (auto next : graph[root]) {
int len = dfs(next) + 1;
// 以当前节点为根节点的最长路径
maxLen = max(maxLen, maxRootLen + len);
// 以当前节点出发的最长路径
maxRootLen = max(maxRootLen, len);
}
return maxRootLen;
};
dfs(0);