求樹上結點的兩兩距離和 DFS求解

2021-09-25 09:10:46 字數 730 閱讀 2393

對於一棵n個結點的樹,其n-1條邊有各自的邊權(長度),求樹上所有結點兩兩之間的距離和,即:∑i=

1n−1

∑j=i

+1nd

ista

nce(

i,j)

\sum_^\sum_^distance(i,j)

i=1∑n−

1​j=

i+1∑

n​di

stan

ce(i

,j)要求求一棵n個結點的樹所有的任意兩點之間的距離和

那麼任意一條邊對距離和的貢獻 = 左端結點個數 * 右端結點個數 * 邊權

和求重心類似,一次dfs即可,任選乙個為根結點開始dfs;

對任意一條邊u -> v右端結點個數就是向下遍歷以v為根的子樹的結點個數,那麼左端結點個數就是n - 右端點個數,相乘後再乘上邊權即可。

int

dfs(

int u)

//每次返回以u為根的子樹的結點數量

return sum+1;

//+1為結點u本身

}//ans即為最終答案

求兩點間的距離

煙台大學計算機學院 檔名稱 asdasd.cpp 作 者 劉磊 完成日期 2016年5月20日 版 本 號 vc 6.0 問題描述 分別利用成員函式,友元函式和一般函式求兩點的的距離,並設計main 函式完成測試 程式輸入 無 程式輸出 兩點間的距離 include include using na...

求二叉樹中任意兩結點的距離

與該題的一道相似題為 求二叉樹中結點的最長距離。兩題看似有聯絡,但是做法不同。分析 距離和深度之間存在必然聯絡。如果已知最長距離的兩結點的最低公共根節點r 那麼我們求r 的左右子樹深度相加即最長距離求出。如下圖所示 我們發現a和b是最長距離,他們的最低公共根節點為c,假如我們知道c的左右子樹高度均為...

有序陣列兩兩交換,求最小的交換次數。

1 有序陣列,按照0到n 1的序列編號,順序打亂,請您用最小的交換操作次數,使其重新變成遞增序列。假如 編號儲存在乙個陣列array當中。一次交換操作可以將這個陣列的其中兩個數互換。限制 1 n 100000 例 1 輸入 array 2,0,1 輸出 2 解釋 先交換0和2 一次交換操作 再交換1...