思路:可以先隨便選取節點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示例...