Processing math: 100%

求树上每两点的距离之和

给定一棵n个节点的树和n-1条边的权值,求每两点间的权值的总和。(n1e5)

  • 暴力做法
    求出每两个点的lca(O(nlogn)预处理,O(logn)查询),预处理路径前缀和后O(1)求得
    n2数量级的点对,时间复杂度O(n2logn),TLE了。

  • 正解:统计每条边被经过的次数,乘以权值,求和

1.每条边连接了两个联通块ab,一个有k个点,一个有nk个点。
2.因为要求的是任意两点的距离和,故每条边在a中的每一个点与b中的每一个点的路径上出现,即出现了k(nk)次,再乘以权值即可。
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];
posted @   Apale  阅读(1184)  评论(0编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示