51nod 1405 樹的距離之和

2021-08-22 18:20:56 字數 948 閱讀 2507

思路:可以先隨便選取節點1作為樹的根節點,然後從根節點遍歷樹,每次儲存k節點的子節點總數 d[k].s 以及所有子節點都k節點的距離和 d[k].sum,在遍歷過程就可完成儲存。

然後再從根節點遍歷一遍樹,求所有點到k節點的距離,就可以轉換成求k節點的子節點到k節點的距離s1和k節點的頭節點id其所在的另一樹的節點到k節點的距離s2。

而s1=d[k].sum,s2=(頭結點所在樹的sum-k節點子樹的sum-k節點的所有節點到從k節點到頭結點的距離)+(頭結點所在的另一顆樹到k節點的距離)=(d[id].sum-d[k].sum-d[k].s)+(n-d[k].s); 所有點到k節點的距離d[k].sum=s1+s2=d[id].sum-d[c].s+n-d[c].s;

code :

#include#includeusing namespace std;

typedef long long ll;

struct node;

const int max_n=100005;

int n;

vectore[max_n];

node d[max_n];

void build(int id,int pre);

void dfs(int id,int pre);

int main()

build(1,0);

dfs(1,0);

for(int i=1;i<=n;++i)

cout<

return 0;

}void build(int id,int pre)

d[id]=node;

}void dfs(int id,int pre)

}

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示例...