AcWing 1073 樹的中心

2022-06-10 13:06:08 字數 1035 閱讀 7047

原題鏈結

考察:樹形dp

1072. 樹的最長路徑 該題的延伸

思路:上題求的是父節點往下的最大值+次大值.這道題求的是點與點的最大距離.這個可以是該點往下的最長距離,也可以是該點往上的最長距離.假設某點為根,往下的最長距離上一題已經求出.往上的最大距離是:到父節點的距離+max(父節點往下的最大距離,父節點往上的最大距離).如果父節點往下的最大距離包括該點,我們要找的就是次最大值,如果不包括,那麼就是最大值.

關於如何求往上的最大距離:我們從根開始往下遍歷,對於當前點更新每個子節點的往上距離.

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6const

int n = 10010;7

struct

roadroad[n<<1

];10

struct

maxnmaxn[n];

13int

h[n],idx,f[n];

14void add(int a,int b,int

c)15

18int dfs(int u,int

fa)19

29 maxn[u].maxs = d1,maxn[u].imax =d2;

30return

d1;31}32

int dfs_up(int u,int

fa)3342}

43int

main()

4453 dfs(1,-1

);54 dfs_up(1,-1

);55 ans = maxn[1

].maxs;

56for(int i=2;i<=n;i++) ans =min(max(maxn[i].maxs,maxn[i].up),ans);

57 printf("

%d\n

",ans);

58return0;

59 }

AcWing 1073 樹的中心

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

AcWing1073 樹的中心(樹形dp)

lt s blog 題意 找乙個點,使得他到其他點的最長距離最小,邊權有正有負。最開始的時候我想這個點一定在樹的直徑上的中點位置處,wa了好多次後注意到題目資料範圍,把這個思路直徑否決了。如果我們將這顆樹化為乙個有根樹,那麼乙個點到其他點的最遠距離就是 max 他到子樹某個點的最遠距離,他經過父親節...

acwing 1073 樹的中心 (樹形DP)

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