|
|
|
@ -33,9 +33,9 @@ void dfs2(int u, int fa) {
|
|
|
|
|
for (int i = h[u]; ~i; i = ne[i]) {
|
|
|
|
|
int v = e[i];
|
|
|
|
|
if (v == fa) continue;
|
|
|
|
|
//如果 st[v]=1,说明v的贡献包含在f1[u]里面
|
|
|
|
|
// 如果 st[v]=1,说明v的贡献包含在f1[u]里面
|
|
|
|
|
int val = f2[u] - (st[v] ? f1[v] : 0);
|
|
|
|
|
f2[v] = f1[v] + (val > 0 ? val : 0);
|
|
|
|
|
f2[v] = f1[v] + max(val, 0);
|
|
|
|
|
dfs2(v, u);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -57,10 +57,13 @@ int main() {
|
|
|
|
|
add(a, b), add(b, a);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第一次dfs
|
|
|
|
|
dfs1(1, 0);
|
|
|
|
|
// 它们两个是一个意思
|
|
|
|
|
f2[1] = f1[1];
|
|
|
|
|
// 换根dp
|
|
|
|
|
dfs2(1, 0);
|
|
|
|
|
|
|
|
|
|
// 输出答案
|
|
|
|
|
for (int i = 1; i <= n; i++) printf("%d ", f2[i]);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|