51nod 1405 树的距离之和 (树形dp)

简介: 51nod 1405 树的距离之和 (树形dp)

给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和。

输入

第一行包含一个正整数n (n <= 100000),表示节点个数。

后面(n - 1)行,每行两个整数表示树的边。

输出

每行一个整数,第i(i = 1,2,…n)行表示所有节点到第i个点的距离之和。

输入样例

4

1 2

3 2

4 2

输出样例

5

3

5

5


先选定节点1作为树的根,然后用num[i]表示以节点i为根的子树上的节点数(包括i)。


dp[x]表示节点x到其他所有节点距离之和,设节点x是节点xx的父节点。


那么我们可以得到dp[xx] = dp[x] + (n-num[xx]) - num[xx]。


因为在xx子树上的节点到xx的距离要比到父节点x的距离要少1,所以减去1,一共有num[xx]个,所以减去num[xx]


不在xx子树上的节点到xx的距离要比到父节点x的距离要多1,所以加上n - num[xx]。


这样我们首先一个dfs处理出dp[1]的大小,就可以推出其他的大小。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
int n;
ll dp[maxn];
int vis[maxn], num[maxn];
vector<int> e[maxn];
void dfs(int x, int s) {
  vis[x] = 1; 
  num[x] = 1;
  dp[1] += s;
  for (int i = 0; i < e[x].size(); i++) {
    int xx = e[x][i];
    if (vis[xx] == 0) {
      dfs(xx, s + 1);
      num[x] += num[xx];
    }
  }
}
void init_dp(int x) {
  vis[x] = 1;
  for (int i = 0; i < e[x].size(); i++) {
    int xx = e[x][i];
    if (vis[xx] == 0) {
      dp[xx] = dp[x] + (n - num[xx]) - num[xx];
      init_dp(xx);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  cin >> n;
  int u, v;
  for (int i = 1; i <= n - 1; i++) {
    cin >> u >> v;
    e[u].push_back(v);
    e[v].push_back(u);
  }
  dp[1] = 0;
  memset(vis, 0, sizeof(vis));
  dfs(1, 0);
  memset(vis, 0, sizeof(vis));
  init_dp(1);
  for (int i = 1; i <= n; i++) {
    cout << dp[i] << endl;
  }
  return 0;
}
相关文章
|
存储 缓存 算法
存储管理
一、存储管理 存储管理是操作系统中的一个核心功能,它负责管理计算机系统中的主存储器(内存)和辅助存储器(硬盘、光盘等)等存储设备,为进程提供存储空间和管理存储资源。存储管理的主要任务包括以下几个方面: 1. 内存分配:操作系统需要为进程分配内存空间,以便进程可以存储和执行程序。内存分配可以采用静态分配或动态分配的方式,静态分配是在编译时确定分配的内存空间大小,动态分配是在运行时根据进程的需求动态分配内存空间。 2. 内存保护:操作系统需要保护进程的内存空间,防止进程之间相互干扰或访问非法内存区域。内存保护可以采用硬件保护或软件保护的方式,硬件保护是通过硬件机制实现内存隔离和保护,软件保护是通过
1035 0
|
5月前
|
JSON API PHP
全球天气预报5天(经纬度版)免费API接口教程
本文介绍接口盒子提供的全球天气预报API,支持通过经纬度获取任意地区未来5天的详细天气数据,包含温度、气压、湿度、风速等12项气象要素。提供每3小时的精细化预报,个人开发者可免费调用(需注册获取KEY)。附请求参数、返回数据说明及PHP、Python调用示例,适用于气象平台、出行类APP、物联网监测等场景。
640 0
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
ReasonRank是一种创新段落重排系统,采用自动化数据合成与两阶段训练(监督微调+强化学习),在BRIGHT等测试中超越更大模型,显著提升信息检索中的推理能力。
195 0
ReasonRank:从关键词匹配到逻辑推理,排序准确性大幅超越传统方法
|
安全 新能源 知识图谱
固态电池:电动汽车的能源革新
【10月更文挑战第15天】固态电池凭借其高能量密度、长续航、卓越安全性和快速充电等优势,正引领新能源汽车领域的技术革命。本文详细探讨了固态电池的技术特点、优势及其对电动汽车产业的影响,展示了其在提升续航里程、增强安全性和降低成本方面的巨大潜力。随着技术的不断进步和成本的降低,固态电池有望成为推动电动汽车行业发展的关键力量,开启一个更加绿色高效的交通新时代。
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
279 2
|
JavaScript Java 测试技术
基于springboot+vue.js的企业OA管理系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的企业OA管理系统附带文章和源代码设计说明文档ppt
279 8
|
网络协议 Linux 网络安全
centos7下最简单的 unison实现文件双向同步图文详解
centos7下最简单的 unison实现文件双向同步图文详解
532 0
|
存储 算法 程序员
探索C/C++ 进制转换之美:从原理到应用(一)
探索C/C++ 进制转换之美:从原理到应用
374 0
|
NoSQL 关系型数据库 MySQL
『GitHub项目圈选03』Star 4.9k! 很全的一款适合开发人员的在线工具集
『GitHub项目圈选03』Star 4.9k! 很全的一款适合开发人员的在线工具集
298 0
|
移动开发 安全 数据安全/隐私保护
iOS代码混淆工具
🔒 这是一篇介绍iOS代码混淆工具的技术博客,旨在帮助开发者提高代码安全性。本工具来自于Github的混淆词库和代码,通过差异化处理和代码合并生成数亿种用于混淆的单词和垃圾代码,确保每次混淆不会出现重复,混淆后的代码跟手写没有任何区别,完美解决代码4.3和2.3.1问题。