AcWing1073 樹的中心(樹形dp)

2021-09-29 09:37:22 字數 1221 閱讀 9234

lt』s blog

題意:找乙個點,使得他到其他點的最長距離最小,邊權有正有負。

最開始的時候我想這個點一定在樹的直徑上的中點位置處,wa了好多次後注意到題目資料範圍,把這個思路直徑否決了。

如果我們將這顆樹化為乙個有根樹,那麼乙個點到其他點的最遠距離就是:max(他到子樹某個點的最遠距離,他經過父親節點到其他的點的最遠距離)。

第一部分可以直接一次dfs得到,對於第二部分來說可以再次dfs維護陣列f[u],表示u經過父節點到其他節點的最遠距離,由於他可能通過父節點走回自己(父節點到當前節點距離最遠),故在第一次dfs時候需要維護乙個次大值,並且維護當前點是否在最長路徑中。

#include

using

namespace std;

const

int maxn=

1e4+7;

vectorint,

int>

> g[maxn]

;void

add(

int u,

int v,

int w));

g[v]

.push_back()

;}int fmax[maxn]

,smax[maxn]

,neber[maxn]

;int up[maxn]

;const

int inf=

0x3f3f3f3f

;void

dfs(

int u,

int fa)

else smax[u]

=max

(smax[u]

,val);}

if(fmax[u]

==-inf) fmax[u]

=smax[u]=0

;}void

dfs(

int u,

int fa)

}int

main()

dfs(1,

0);dfs(1

,0);

int res=inf;

for(

int i=

1;i<=n;

++i) res=

min(res,

max(up[i]

,fmax[i]))

;printf

("%d\n"

,res)

;return0;

}

AcWing 1073 樹的中心

原題鏈結 考察 樹形dp 1072.樹的最長路徑 該題的延伸 思路 上題求的是父節點往下的最大值 次大值.這道題求的是點與點的最大距離.這個可以是該點往下的最長距離,也可以是該點往上的最長距離.假設某點為根,往下的最長距離上一題已經求出.往上的最大距離是 到父節點的距離 max 父節點往下的最大距離...

AcWing 1073 樹的中心

題目傳送門 這個問題是樹形dp中的一類經典模型,常被稱作換根dp 同樣,先來想一下如何暴力求解該問題 先列舉目標節點,然後求解該節點到其他節點的最遠距離 時間複雜度為 o n 2 對於本題的資料規模,十分極限,經測試只能過7 11,見最下面 考慮如何優化求解該問題的方法 思考一下 在確定樹的拓撲結構...

acwing 1073 樹的中心 (樹形DP)

我們要列舉每個點到其它點的最遠距離,那麼就會有兩種情況,向上走或者是向下走 假設我們列舉u點,向下走 dfs down u 更新當前節點向下走,葉子節點不需要更新 d1 u 表示 u點向下的最長路徑,d2 u 表示 u 點向下的次長路徑 p1 u 表示 u 的向下最長路徑經過的子節點 那麼我們只要每...