中文題面不解釋了,兩次dfs,第一次自下向上,第二次自上向下。
ans[i]表示i節點的答案,cnt[i]表示i節點為root的子樹的節點個數,d[i]表示i節點為root的子樹的答案。
1//#pragma comment(linker, "/stack:102400000, 102400000")
2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include
12 #include 13
using
namespace
std;
14 typedef long
long
ll;15 typedef pair p;
16const
int n = 1e5 + 5;17
ll cnt[n], d[n], ans[n], n;
18 vector edge[n];
1920
void dfs1(int u, int
p) 31}32
33void dfs2(int u, int
p) else
39for(int i = 0; i < edge[u].size(); ++i) 45}
4647
intmain()
4854
for(int i = 1; i < n; ++i)
59 dfs1(1, -1
);60 dfs2(1, -1
);61
for(int i = 1; i <= n; ++i) 64}
65return0;
66 }
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示例...