洛谷 XR 3 核心城市(樹的直徑,樹形dp)

2022-02-13 12:52:39 字數 1039 閱讀 2759

先考慮乙個點。肯定是在樹的直徑的中間rt。

樹的直徑就是樹上距離最遠的兩個點的路徑。

對於樹的直徑求法,常用的有兩種。

兩遍bfs或dfs,從任意乙個點開始,找到距離這個點最遠的點i,再從i開始,找到距離i這個點距離最遠的點j,則i、j就是樹的直徑的兩個端點(證明略)。

樹形dp也可以求。

再推廣到n個點。以rt為根,樹形dp,dis[i]表示以i為根的子樹的深度,即把城市i作為核心城市後,子樹i中距離i最遠的點到核心城市群的距離。

然後把dis排序,刪去最大的前k個,這k個就是核心城市群。然後第k+1大的dis再+1就是最終的答案。

為什麼要+1呢?因為第k+1大的dis對應的城市到核心城市群還有1的距離,所以要加1.

#include#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100005

;int n,k,dis[maxn][3

],diss[maxn],cnt,p[maxn],d1,d2,rt;

struct

nodee[maxn*2

];void insert(int u,int

v)int dfs(int u,int

id)

for(int i=p[u];i!=-1;i=e[i].next)}}

return

ans;

}void

findd()

}}void dfs2(int u,int

fa)}

intmain()

findd();

dfs2(rt,-1

); sort(diss+1,diss+n+1

); cout

<1

}

XR 3 核心城市 樹直徑

xr 3 核心城市 這題真的難啊.k個核心城市太麻煩,我們假設先找乙個核心城市,應該放在 任意取乙個點,它的最遠端是直徑的端點。所以當這個點是直徑的中點時,可以達到題目的要求 最大距離最小 想求中點,我們就儲存直徑的路徑,中間的點就是中點了。然後該怎麼辦?其餘的k 1個點怎麼選?發現7 8號節點距離...

P5536 XR 3 核心城市(樹的直徑)

x 國有 nn 座城市,n 1n 1 條長度為 11 的道路,每條道路連線兩座城市,且任意兩座城市都能通過若干條道路相互到達,顯然,城市和道路形成了一棵樹。x 國國王決定將 kk 座城市欽定為 x 國的核心城市,這 kk 座城市需滿足以下兩個條件 這 kk 座城市可以通過道路,在不經過其他城市的情況...

洛谷P4408 逃學的小孩 樹的直徑

給出一棵樹,已知有人一開始在c cc點,要到達a aa點和b bb點 那個近先去哪 求最壞的情況所需的時間。轉化題意 求 ma x di s a b min dis c a di s c b 求max dis a b min dis c a dis c b 求max d is a b min dis...