51Nod 1405 樹的距離之和 dp

2022-08-21 20:03:06 字數 1096 閱讀 6521

1405 樹的距離之和

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 難度:4級演算法題

收藏關注給定一棵無根樹,如果它有n個節點,節點編號從1到n, 求隨意兩點之間的距離(最短路徑)之和。

input

第一行包括乙個正整數n (n <= 100000)。表示節點個數。

後面(n - 1)行,每行兩個整數表示樹的邊。

output

每行乙個整數。第i(i = 1,2,...n)行表示全部節點到第i個點的距離之和。
input演示樣例

4

1 23 2

4 2

output演示樣例

535

5

思路:首先,任選乙個節點。設定為樹的根。

用num[x]表示以節點x為根的子樹的節點總數(包括x自身)

假如設定節點1為根。則先求出dp[1],表示全部節點到節點1的距離之和。

對根而言也是全部節點的深度之和。

若x是y的子結點,則有

dp[x] = dp[y] + (n-num[x]) - num[x];

由於x為根的子樹的全部節點到x的距離比到y的距離少1,所以減num[x]

其餘節點到x的距離比到y的距離多1,所以加 n-num[x]

**:

#include #include #include #include #include #include #pragma comment(linker, "/stack:10240000,10240000")//遞迴太深,導致爆棧,所以使用擴棧語句

using namespace std;

const int n = 100009;

int dp[n] = {}, num[n];

vectorp[n];

bool f[n] = {};

void dfs(int s, int depth)

{ int len = p[s].size();

f[s] = 1;

num[s] = 1;

dp[1] += depth;

for(int i=0; i

51nod 1405 樹的距離之和

給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...

51Nod 1405 樹的距離之和

acm模版 根據題意,這是一顆樹,所以每兩點之間的路徑一定是唯一的。這裡讓求所有點到第i個結點的距離和,其實也就是其他所有結點到第i個結點的距離和。通過觀察發現,只要我們找到了乙個點對應的結果,那麼其他所有的點都可以通過這個結果擴充套件出來,利用邊的關係。比如說,我們知道了第乙個結點對應的結果,並且...

51nod 1405 樹的距離之和

給定一棵無根樹,假設它有n個節點,節點編號從1到n,求任意兩點之間的距離 最短路徑 之和。input 第一行包含乙個正整數n n 100000 表示節點個數。後面 n 1 行,每行兩個整數表示樹的邊。output 每行乙個整數,第i i 1,2,n 行表示所有節點到第i個點的距離之和。input示例...