换根dp,改边权为点权,偶数是2,奇数为1,答案就是距离每个点最远的值
class Solution {
public:
vector<int> timeTaken(vector<vector<int>> &edges) {
int n = edges.size() + 1;
vector<vector<int>> vs(n, vector<int>());
for (auto ve: edges) {
vs[ve[0]].push_back(ve[1]);
vs[ve[1]].push_back(ve[0]);
}
vector<vector<int >> f(n, vector<int>(2));
function<void(int, int)> dfs1 = [&](int u, int fa) {
f[u][0] = f[u][1] = (u % 2 == 0) + 1;
for (auto v: vs[u]) {
if (v == fa) continue;
dfs1(v, u);
if (f[v][0] + (u % 2 == 0) + 1 >= f[u][0]) {
f[u][1] = f[u][0];
f[u][0] = f[v][0] + (u % 2 == 0) + 1;
} else if (f[v][0] + (u % 2 == 0) + 1 >= f[u][1]) {
f[u][1] = f[v][0] + (u % 2 == 0) + 1;
}
}
};/*自下而上更新,最大次大*/
dfs1(0, -1);
function<void(int, int)> dfs2 = [&](int u, int fa) {
for (auto v: vs[u]) {
if (v == fa) continue;
int val;
if (f[v][0] + (u % 2 == 0) + 1 == f[u][0]) {
val = ((v % 2 == 0) + 1 + f[u][1]);
} else {
val = (f[u][0] + (v % 2 == 0) + 1);
}/*先取出从上面下来的且不穿过自己最大值线路*/
if (val >= f[v][0]) {
f[v][1] = f[v][0];
f[v][0] = val;
} else if (val >= f[v][1]) {
f[v][1] = val;
}/*重新跟新最大值次大值*/
dfs2(v, u);
}
};/*自上而下重新最大次大*/
dfs2(0, -1);
vector<int> ans(n);
for (int i = 0; i < n; i++) {
ans[i] = f[i][0] - ((i % 2 == 0) + 1);
}
return ans;
}
};