對於一棵n個結點的樹,其n-1條邊有各自的邊權(長度),求樹上所有結點兩兩之間的距離和,即:∑i=
1n−1
∑j=i
+1nd
ista
nce(
i,j)
\sum_^\sum_^distance(i,j)
i=1∑n−
1j=
i+1∑
ndi
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...