1405 樹的距離之和

2022-08-02 22:39:19 字數 1444 閱讀 9742

1405 樹的距離之和

基準時間限制:1 秒 空間限制:131072 kb

給定一棵無根樹,假設它有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思路:dfs

先選乙個根節點,然後dfs求出所有點到這個點的距離最小值之和,過程中d記錄當前點下所有子節點到這個點的最小距離之和,node

記錄當前的點有多少個子節點,包括本身。然後這樣根節點的答案就有了,然後他的子節點可以根據根節點來更新的得到,d[n]+=d[m]-(d[n]+node[n])+node[m]-node[n];

然後dfs一遍就可以更新了。

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include

8 #include9 #include10

using

namespace

std;

11 typedef long

long

ll;12 vectorvec[100005

];13 ll d[100005

];14 ll node[100005

];15

bool flag[1000005

];16

void dfs(int

n);17

void slove(int

n);18

int main(void)19

31 memset(flag,0,sizeof

(flag));

32 memset(d,0,sizeof

(d));

33 dfs(1

);34 memset(flag,0,sizeof

(flag));

35 slove(1

);36

for(i = 1; i <= n; i++)

37 printf("

%lld\n

",d[i]);

38return0;

39}40void dfs(int

n)4155}

56}57void slove(int

n)5872}

73 }

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示例...