From 267d3047f04b85c50862d2da3734718c62addc4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Tue, 16 Jan 2024 13:07:45 +0800 Subject: [PATCH] 'commit' --- TangDou/Topic/HuanGenDp/POJ3585.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/TangDou/Topic/HuanGenDp/POJ3585.cpp b/TangDou/Topic/HuanGenDp/POJ3585.cpp index 7b21b01..bc8b51d 100644 --- a/TangDou/Topic/HuanGenDp/POJ3585.cpp +++ b/TangDou/Topic/HuanGenDp/POJ3585.cpp @@ -13,31 +13,31 @@ void add(int a, int b, int c = 0) { e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; } -int d[N], f[N]; +int f[N], g[N]; +// 以1号点为根, 由子推父,先递归,再统计 void dfs1(int u, int fa) { for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (v == fa) continue; dfs1(v, u); - if (du[v] == 1) - d[u] += w[i]; + if (du[v] == 1) // 如果v的度为1,也就是叶子 + f[u] += w[i]; else - d[u] += min(d[v], w[i]); + f[u] += min(f[v], w[i]); } - return; } void dfs2(int u, int fa) { for (int i = h[u]; ~i; i = ne[i]) { int v = e[i]; if (v == fa) continue; if (du[u] == 1) - f[v] = d[v] + w[i]; + g[v] = f[v] + w[i]; else - f[v] = d[v] + min(f[u] - min(d[v], w[i]), w[i]); + g[v] = f[v] + min(g[u] - min(f[v], w[i]), w[i]); + // 先计算再递归 dfs2(v, u); } - return; } int main() { @@ -50,8 +50,8 @@ int main() { memset(h, -1, sizeof h); idx = 0; memset(du, 0, sizeof du); - memset(d, 0, sizeof d); memset(f, 0, sizeof f); + memset(g, 0, sizeof g); cin >> n; @@ -61,13 +61,15 @@ int main() { add(a, b, c), add(b, a, c); du[a]++, du[b]++; // 记录入度,无向图就不谈入度和出度了 } - + // 第一遍dfs dfs1(1, 0); - f[1] = d[1]; + g[1] = f[1]; + + // 第二遍dfs dfs2(1, 0); int ans = 0; - for (int i = 1; i <= n; i++) ans = max(ans, f[i]); + for (int i = 1; i <= n; i++) ans = max(ans, g[i]); cout << ans << endl; } return 0;