給定一棵無根樹,假設它有n個節點,節點編號從1到n, 求任意兩點之間的距離(最短路徑)之和。
input
第一行包含乙個正整數n (n <= 100000),表示節點個數。
後面(n - 1)行,每行兩個整數表示樹的邊。
output
每行乙個整數,第i(i = 1,2,…n)行表示所有節點到第i個點的距離之和。
input示例
4 1 2
3 2
4 2output示例
5 3 5 5
分析父節點和乙個子節點,如果知道了父節點的和,那麼子節點的和是多少呢?
dp[v]=dp[u]-siz[v]+(n-siz[v]);因為子節點所在子樹的所有點到父節點的那條邊都少了1,總共減去siz[v]
通過父節點到子節點的所有節點都經過了這條邊,都加1,總共加上n-siz[v]
#include
using
namespace
std;
typedef
long
long ll;
const
int maxn = 100000+7;
int siz[maxn];
ll dp[maxn];
int n;
vector
e[maxn];
void dfs(int u,int fa)
}void dfs1(int u,int fa)
}int main()
dfs(1,-1);
dfs1(1,-1);
for(int i = 1; i<=n; i++)
printf("%lld\n",dp[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示例...