先考慮乙個點。肯定是在樹的直徑的中間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...