給定一顆包含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或者乙個堆...