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

2021-09-27 18:48:12 字數 1431 閱讀 8070

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

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

第一行包含乙個正整數n ( n <= 100000 ),表示節點的個數。 後面(n - 1)行,每行兩個整數(u, v)表示樹的邊u-v。

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

4

1 23 2

4 2

535

5

先假定樹的根節點為1。

dis[i]表示結點i所代表子樹上的所有點到結點i的距離之和,

num[i]表示結點i所代表子樹的結點個數。

用dfs1自葉向根回溯得到以上兩個陣列。

ans[i]表示所有點點i的距離之和,則ans[1]=dis[1]。

假設已知ans[x],那麼對於點x的子節點y:

ans[y]=ans[x]-num[y]

+n-num[y]

(子樹y上的所有點都不必從y走到x,所以 -num[y];而不在子樹y上的所有點都要從x走向y,所以 +n-num[y])

用dfs2自根向葉得到ans陣列。

**中的ans數組合在了dis陣列中。

#include

#include

using namespace std;

typedef

long

long ll;

const

int n=

1e5+20;

int n,cs,head[n]

;ll dis[n]

,num[n]

;struct nodeside[n<<1]

;void

add(

int x,

int y)

void

dfs1

(int f,

int x)

return;}

void

dfs2

(int f,

int x)

return;}

intmain()

dfs1(-

1,1)

;dfs2(-

1,1)

;for

(int i=

1;i<=n;i++

)printf

("%lld\n"

,dis[i]);

return0;

}

qduoj 80 樹結構重逢 樹形DP

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

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

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

樹結構 Trie字典樹

trie樹的名字有很多,比如字典樹,字首樹等等。第一 根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。第二 從根節點到某一節點,路徑上經過的字元連線起來,就是該節點對應的字串。第三 每個單詞的公共字首作為乙個字元節點儲存。1 詞頻統計 可能有人要說了,詞頻統計簡單啊,乙個hash或者乙個堆...