樹形dp,樹上任意兩點間距離總和

2021-09-25 06:22:51 字數 901 閱讀 9430

建完樹後,單獨計算每條邊對答案的貢獻。

貢 獻就

是這條邊

被遍歷的

次數∗這

條邊的權

值貢獻就是這條邊被遍歷的次數*這條邊的權值

貢獻就是這條

邊被遍歷

的次數∗

這條邊的

權值對於一條邊(如 ab邊)來說,端點a和b將這個樹劃分為兩個部分,a部分子樹上的點如果要連線到b部分,必定要經過a-b這條邊,所以某條邊被訪問次數就是兩部分子樹端點之積,所以只需要dfs一遍這個樹就一樣每個點的子節點個數就行了

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

100005

;const ll mod=

1e9+7;

struct nodee[maxn*2]

;int head[maxn]

,tot;

int n;

void

add(

int u,

int v,

int w)

ll sz[maxn]

;ll dp[maxn]

;void

dfs(

int u,

int fa)

}int a[maxn]

,b[maxn]

,c[maxn]

;int

main()

dfs(1,

0); ll ans =0;

printf

("%lld\n"

,dp[1]

);}

計算兩點間距離

匯入math包 import math 定義點的函式 class point def init self,x 0,y 0 self.x x self.y y def getx self return self.x def gety self return self.y 定義直線函式 class ge...

樹上兩點期望距離

對於樹上的節點 i 設 d i 為 i 的度數,fa 為 i 的父親,sum limits j 為 i 的兒子。假設邊權均為 1 分別考慮兒子到父親 父親到兒子的期望。設 f i 表示兒子 i 到父親的期望距離。可以分為 2 種情況 直接到父親。概率為 dfrac 步數為 1 期望為 dfrac 先...

樹上兩點期望距離

求樹上兩點之間的期望距離。設d i 為i節點的度數。fa i 為i節點的父親。我們對於兩種不同的走法分別考慮。part1 兒子到父親 設此時期望步數為f i 顯然,只會有兩種情況 1.直接一步走到父親。2.先走到自己的兒子,再走回自己,再走到父親。對於情況1.概率為 frac 步數為1,期望為 fr...