qduoj 樹結構重逢 (兩遍深搜)

2021-08-04 09:15:15 字數 1171 閱讀 2017

描述

給定一顆包含n個節點的無根樹,並且把節點從1-n編號。

現在讓你求對於每個點,求出所有點到這個點的距離的和(距離當然是最短距離了..)。

輸入 第一行包含乙個正整數n ( n <= 100000 ),表示節點的個數。

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

輸出 每行乙個整數,第i(i = 1,2,…n)行表示所有節點到第i個點的距離之和。(i到i節點的距離為0)

樣例輸入1 複製

4 1 2

3 2

4 2

樣例輸出1

5 3

5 5

分析:

以1號節點為根建樹。

第一遍深搜,記錄乙個點子節點到達這個節點的距離之和子節點的個數。在回溯的時候,當前節點的所有子節點和它的距離之和就是他直接子節點和值(其子節點距離之和)加上其子節點的數目。這樣深搜完之後就可以得出根節點的結果。

第二遍深搜就是用根節點的答案推出子節點的答案。如果知道了父節點的答案,那麼子節點的答案就是父節點的答案減去其對父節點的貢獻,其實就是得出了除去以當前節點為根節點的子樹之後父節點的答案,再用這個值加上除去這個子樹的節點數。就是當前節點的答案了。

可以畫畫圖,就顯而易見了。

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

struct node p[200000];

vector

a[200000];

int vis[200000];

int n, m;

void dfs(int k)

}}void dfs1(int k, int fa)

for(int i = 0; i < a[k].size(); i++)

}}int main()

dfs(1);

memset(vis, 0, sizeof(vis));

p[1].ans = p[1].up;

dfs1(1, -1);

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

return

0;}

qduoj 80 樹結構重逢 樹形DP

題意 給定一顆包含n個節點的無根樹,並且把節點從1 n編號。現在讓你求對於每個點,求出所有點到這個點的距離的和 距離當然是最短距離了.思路 跟hdu3899一毛一樣的思路,注意sum要開long long。include include include includeusing namespace ...

QDU 80 樹結構重逢 樹形dp 模板

給定一顆包含n個節點的無根樹,並且把節點從1 n編號。現在讓你求對於每個點,求出所有點到這個點的距離的和 距離當然是最短距離了 第一行包含乙個正整數n n 100000 表示節點的個數。後面 n 1 行,每行兩個整數 u,v 表示樹的邊u v。每行乙個整數,第i i 1,2,n 行表示所有節點到第i...

繪製樹結構

樹的表示方法有雙親表示法 孩子表示法 雙親孩子表示法 孩子兄弟表示法,具體請參考其中前三種基於陣列,最後一種基於鍊錶。我定義的數節點資料結構為 typedef struct treenode treenode,ptreenode 也就是孩子兄弟表示法,附加乙個指向父節點的指標。參考上圖,發現第乙個子...