求树上每两点的距离之和
Apale 11/5/2018 c++ACM水题
给定一棵n个节点的树和n-1条边的权值,求每两点间的权值的总和。
暴力做法 求出每两个点的
预处理, 查询),预处理路径前缀和后 求得 数量级的点对,时间复杂度 ,TLE了。 正解:统计每条边被经过的次数,乘以权值,求和
1.每条边连接了两个联通块
主要代码:
int siz[maxn];
void dfs(int u, int fa)
{
siz[u] = 1;
for (auto v:G[u])
{
if (v != fa)
{
dfs(v, u);
siz[u] += siz[v];
}
}
}
for (int i = 1; i <= n; ++i)
ans += 1ll * siz[i] * (n - siz[i]) * w[i];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16