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;
}
相关文章
|
6月前
|
NoSQL 容器 消息中间件
树的直径、最近公共祖先、树的变形
树的直径、最近公共祖先、树的变形
|
6月前
|
人工智能 BI
【每日一题Day267】LC834树中距离之和 | 换根dp
【每日一题Day267】LC834树中距离之和 | 换根dp
43 0
|
6月前
daimayuan(代码源oj)最长路径(树形dp,无向树换根dp)
daimayuan(代码源oj)最长路径(树形dp,无向树换根dp)
126 0
|
6月前
|
Go 算法
在运势计算中运用BST树
【5月更文挑战第3天】该文介绍了使用树进行简单的运势推算。通过`TaoBstManager`结构体管理运算,包括树的结构、变化节点和爻卦含义。提供了遍历、显示节点的功能以及执行“一变”和“一爻三变”的方法。最终,通过`YaoWithReBuild`生成六爻并形成一卦。代码实现可在给定的GitHub链接中查看。
58 0
在运势计算中运用BST树
|
6月前
|
C++
B. Tree Tag(贪心+树的最长直径)
B. Tree Tag(贪心+树的最长直径)
|
6月前
|
机器学习/深度学习 测试技术
【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离
【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离
|
6月前
|
人工智能 算法 BI
【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目
【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目
|
6月前
|
人工智能 算法 BI
【深度优先搜索】【C++算法】834 树中距离之和
【深度优先搜索】【C++算法】834 树中距离之和
|
6月前
|
算法
【每日一题Day235】LC1483树节点的第 K 个祖先 | 倍增
【每日一题Day235】LC1483树节点的第 K 个祖先 | 倍增
50 1
|
6月前
树上染色(树形dp)
树上染色(树形dp)
30 0