51nod 4级算法-1405
来源:互联网 发布:大数据分析用的数据库 编辑:程序博客网 时间:2024/06/01 07:58
1405 树的距离之和
给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和。
Input
第一行包含一个正整数n (n <= 100000),表示节点个数。后面(n - 1)行,每行两个整数表示树的边。
Output
每行一个整数,第i(i = 1,2,...n)行表示所有节点到第i个点的距离之和。
Input示例
41 23 24 2
Output示例
5355
思路:树形dp? dp[u]表示以结点u到其子树所有结点的距离和;
cnt[u]表示包括u在内的子树中所有结点个数;
v为u的子结点,则有:
这个好理解,子节点之和加上自己
这样理解:
所以可以从叶子结点往上进行状态转移,直至算出根节点的dp值又注意到若dp[u]表示u到其他所有结点的距离和,v为u的子结点,则有:
v子树中的所有结点的到v的距离比其到u的距离的各少1,共cnt[v]个结点,则需要减去cnt[v]
不在v子树中的所有结点到v的距离比其到u的距离各多1,共n−cnt[v]个结点,则需要加上n−cnt[v]
http://www.cnblogs.com/mhpp/p/6628548.html
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <vector>#include <cstdio>#include <bitset>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>using namespace std;const int maxn= 1e5+100;vector<int>Node[maxn];long long dp[maxn];long long cnt[maxn];int n;void dp_up(int u,int p){ cnt[u]=1; int v; for(int i=Node[u].size()-1;i>=0;i--){ v=Node[u][i]; if(v!=p){ dp_up(v,u); cnt[u]+=cnt[v]; dp[u]+=dp[v]+cnt[v]; } }}void dp_down(int u,int p){ int v; for(int i=Node[u].size()-1;i>=0;i--){ v=Node[u][i]; if(v!=p){ dp[v]=dp[u]+n-2*cnt[v]; dp_down(v,u); } }}int main (){ memset(dp,0,sizeof(dp)); memset(cnt,0,sizeof(cnt)); cin>>n; for(int i=0;i<n-1;i++){ int x,y; cin>>x>>y; Node[x].push_back(y); Node[y].push_back(x); } dp_up(1,0); dp_down(1,0); for(int i=1;i<=n;i++){ cout<<dp[i]<<endl; }}
阅读全文
0 0
- 51nod 4级算法-1405
- 51nod 1级算法题
- 51nod 2级算法题-1007
- 51nod 2级算法题-1010
- 51nod 2级算法题-1014
- 51nod 2级算法题-1050
- 51nod 2级算法题-1062
- 51nod 2级算法题-1092
- 51nod 2级算法题-1095
- 51nod 2级算法题-1119
- 51nod 2级算法题-1126
- 51nod 2级算法题-1133
- 51nod 2级算法题-1279
- 51nod 2级算法题-1315
- 51nod 2级算法题-1428
- 51nod 3级算法题-1065
- 51nod 5级算法题
- 51nod 3级算法-1102
- 山峰 2016暑假集训结训赛 by JueChen 栈的维护
- [日常训练] 秀姿势
- CodeForces
- Java排序算法之快速排序
- 关于CSS中的样式继承
- 51nod 4级算法-1405
- 内部类
- C语言之单链表(增删改查逆)
- uva694
- Java基础之继承、多态、重载、重写
- poj-1452-按天数卖东西
- cts cmd
- F-POJ-3414 Pots
- textview文本超出部分用省略号表示