51nod 1405 樹的距離之和

2021-08-21 20:59:22 字數 1252 閱讀 6426

給定一棵無根樹,假設它有n個節點,節點編號從1到n, 求任意兩點之間的距離(最短路徑)之和。

input

第一行包含乙個正整數n (n <= 100000),表示節點個數。

後面(n - 1)行,每行兩個整數表示樹的邊。

output

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

4

1 23 2

4 2

output示例

535

5

思路:

樹形dp。兩次dfs, 第一次計算出節點1的結果dp[1],和以i為根的子樹的節點數量subtree[i](包括i), 第二次dfs,根據父節點的結果計算子節點的結果:

dp[i] = dp[father] - (subtree[i] - 1) + (n - subtree[i] - 1)) = dp[father] + n - 2*subtree[i];

subtree[i] - 1 為i的子節點數量,這些點到i的距離是到父節點的距離減一。

n - subtree[i] - 1 為需要經過父節點到達i的節點數量,均需加一。

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e5 + 5;

vectoredge[maxn];

int subtree[maxn];

ll dp[maxn];

int n;

bool vis[maxn];

int dfs1(int u, int depth) }

return subtree[u];

}void dfs2(int u, int fa)

for (int i = 0; i < edge[u].size(); i++) }

}int main()

memset(vis, false, sizeof(vis));

dfs1(1, 0);

memset(vis, false, sizeof(vis));

dfs2(1, 0);

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 樹的距離之和

思路 可以先隨便選取節點1作為樹的根節點,然後從根節點遍歷樹,每次儲存k節點的子節點總數 d k s 以及所有子節點都k節點的距離和 d k sum,在遍歷過程就可完成儲存。然後再從根節點遍歷一遍樹,求所有點到k節點的距離,就可以轉換成求k節點的子節點到k節點的距離s1和k節點的頭節點id其所在的另...