diff --git a/TangDou/Topic/HuanGenDp/CF1187E.cpp b/TangDou/Topic/HuanGenDp/CF1187E.cpp index 00ea507..90fbd1b 100644 --- a/TangDou/Topic/HuanGenDp/CF1187E.cpp +++ b/TangDou/Topic/HuanGenDp/CF1187E.cpp @@ -1,49 +1,55 @@ #include using namespace std; -const int N = 200010; +const int N = 200010, M = N << 1; #define int long long #define endl "\n" -vector son[N]; -int vis[N], n; +// 链式前向星 +int e[M], h[N], idx, w[M], ne[M]; +void add(int a, int b, int c = 0) { + e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++; +} + +int n; int sz[N]; int f[N]; -void dfs(int u) { +void dfs(int u, int fa) { sz[u] = 1; - vis[u] = 1; - for (int i = 0; i < son[u].size(); i++) { - int v = son[u][i]; - if (!vis[v]) { - dfs(v); + + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v != fa) { + dfs(v, u); sz[u] += sz[v]; } } } -void dp(int u) { - vis[u] = 1; - for (int i = 0; i < son[u].size(); i++) { - int v = son[u][i]; - if (!vis[v]) { +void dp(int u, int fa) { + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; + if (v != fa) { f[v] = f[u] + sz[1] - 2 * sz[v]; - dp(v); + dp(v, u); } } } signed main() { + // 初始化链式前向星 + memset(h, -1, sizeof h); + cin >> n; for (int i = 1; i < n; i++) { - int u, v; - cin >> u >> v; - son[u].push_back(v); - son[v].push_back(u); + int a, b; + cin >> a >> b; + add(a, b), add(b, a); } - dfs(1); + + dfs(1, 0); for (int i = 1; i <= n; i++) f[1] += sz[i]; - memset(vis, 0, sizeof(vis)); - dp(1); + dp(1, 0); int ans = -0x3f; for (int i = 1; i <= n; i++) ans = max(ans, f[i]);