diff --git a/TangDou/Topic/HuanGenDp/P2896.cpp b/TangDou/Topic/HuanGenDp/P2896.cpp index c4ca2cd..e599379 100644 --- a/TangDou/Topic/HuanGenDp/P2896.cpp +++ b/TangDou/Topic/HuanGenDp/P2896.cpp @@ -1,42 +1,46 @@ #include using namespace std; -const int N = 1e5 + 100; +const int N = 1e5 + 10, M = N << 1; #define int long long #define endl "\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 f[N], sz[N], dis[N], c[N]; -struct edge { - int to, w; -}; -vector g[N]; void dfs1(int u, int fa) { sz[u] = c[u]; - for (int i = 0; i < g[u].size(); i++) { - int v = g[u][i].to; + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; if (v == fa) continue; - dis[v] = dis[u] + g[u][i].w; // 每个点到根节点的距离 + dis[v] = dis[u] + w[i]; // 每个点到根节点的距离 dfs1(v, u); sz[u] += sz[v]; // 以u为根的子树奶牛数量 } } void dfs2(int u, int fa) { - for (int i = 0; i < g[u].size(); i++) { - int v = g[u][i].to; + for (int i = h[u]; ~i; i = ne[i]) { + int v = e[i]; if (v == fa) continue; - f[v] = f[u] + (sz[1] - 2 * sz[v]) * g[u][i].w; + f[v] = f[u] + (sz[1] - 2 * sz[v]) * w[i]; dfs2(v, u); } } signed main() { + // 初始化链式前向星 + memset(h, -1, sizeof h); + int n; cin >> n; for (int i = 1; i <= n; i++) cin >> c[i]; for (int i = 1; i < n; i++) { - int u, v, w; - cin >> u >> v >> w; - g[u].push_back({v, w}); - g[v].push_back({u, w}); + int a, b, c; + cin >> a >> b >> c; + add(a, b, c), add(b, a, c); } dfs1(1, -1); for (int i = 2; i <= n; i++) f[1] += dis[i] * c[i];