題意:
有n個節點的無根樹,求每個節點分別到其他n-1個節點的距離之和。
思路:
設dp[x]表示節點x到其他n-1個節點的距離和。
乙個dp[x]是很好求的,把x當成根,一遍dfs,把所有點的深度加起來,就可以求出dp[x]。
得知dp[x]如何求得dp[y]呢?此時x是父節點,y是兒子節點。我們再增加乙個兒子節點z,這三個點的聯絡為y–x–z。知道dp[x],求dp[y],那麼,等於dp[y] = dp[x]-son[y]+(n-son[y]),dp[x]即減去y子節點的個數,再加上非y子節點得到個數。
**:
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1e5+5;
vector
edges[maxn];
int n, a, b;
bool vis[maxn];
int son[maxn];
long
long dp[maxn];
void dfs1(int rt, int depth)
}}void dfs2(int rt)
}} int main()
dfs1(1, 0);
memset(vis, 0, sizeof(vis));
dfs2(1);
for(int i=1; i<=n; ++i)
return
0;}
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示例...