求树上每两点的距离之和
给定一棵n个节点的树和n-1条边的权值,求每两点间的权值的总和。(n≤1e5)
-
暴力做法
求出每两个点的lca(O(nlogn)预处理,O(logn)查询),预处理路径前缀和后O(1)求得
n2数量级的点对,时间复杂度O(n2logn),TLE了。 -
正解:统计每条边被经过的次数,乘以权值,求和
1.每条边连接了两个联通块ab,一个有k个点,一个有n−k个点。
2.因为要求的是任意两点的距离和,故每条边在a中的每一个点与b中的每一个点的路径上出现,即出现了k∗(n−k)次,再乘以权值即可。
3.做一遍预处理,对每个节点求出子树大小,即可在O(n)的时间内求出每两点的权值总和
主要代码:
int siz[maxn];
void dfs(int u, int fa)
{
siz[u] = 1;
ou[u] = ou[fa] ^ 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];
分类:
树上算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义