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

2021-09-29 10:02:25 字數 1863 閱讀 2015

x 國有 nn 座城市,n − 1n−1 條長度為 11 的道路,每條道路連線兩座城市,且任意兩座城市都能通過若干條道路相互到達,顯然,城市和道路形成了一棵樹。

x 國國王決定將 kk 座城市欽定為 x 國的核心城市,這 kk 座城市需滿足以下兩個條件:

這 kk 座城市可以通過道路,在不經過其他城市的情況下兩兩相互到達。

定義某個非核心城市與這 kk 座核心城市的距離為,這座城市與 kk 座核心城市的距離的最小值。那麼所有非核心城市中,與核心城市的距離最大的城市,其與核心城市的距離最小。你需要求出這個最小值。

第一行 22 個正整數 n,kn,k。

接下來 n - 1n−1 行,每行 22 個正整數 u,vu,v,表示第 uu 座城市與第 vv 座城市之間有一條長度為 11 的道路。

資料範圍:

一行乙個整數,表示答案。

輸入 #1複製

6 3

1 22 3

2 41 5

5 6

輸出 #1複製

1
【樣例說明】

欽定 1,2,51,2,5 這 33 座城市為核心城市,這樣 3,4,63,4,6 另外 33 座非核心城市與核心城市的距離均為 11,因此答案為 11。

找到樹的直徑中點,以中點為根找每個節點的子樹到新根的深度maxdeep與該節點到新根的深度dep,然後用maxdep[u]-dep[u]就是到u這個核心城市的最遠距離,將maxdep[u]-dep[u]從大到小排序,靠前的k個點就是核心城市,易證他們是相互連通的

#include#include#include#includeusing namespace std;

const int n=2e5+10;

int n,k;

inline int read()

while(ch>='0'&&ch<='9')

return s*f;

}int tot,head[n],nxt[n],adj[n];

void add(int u,int v)

int q,ans=0;//q記錄到1最遠點的距離,ans記錄最遠點到1的距離

int dep[n],f[n];//dep記錄深度

void dfs1(int u,int fa)

for(int i=head[u];i;i=nxt[i]) }

void dfs2(int u,int fa)

for(int i=head[u];i;i=nxt[i]) }

int anss[n],maxdep[n];

inline int mx(int x,int y)

void dfs3(int u,int fa)

}bool cmp(int p,int q)

int main()

dfs1(1,0);

memset(dep,0,sizeof(dep));

ans=0;

dfs2(q,0);

int tx=q;

for(i=1;i<=(dep[q]+1)/2;i++)

tx=f[tx];

memset(dep,0,sizeof(dep));

dfs3(tx,0);

for(i=1;i<=n;i++)

anss[i]=maxdep[i]-dep[i];

sort(anss+1,anss+1+n,cmp);

ans=0;

for(i=k+1;i<=n;i++)

ans=mx(ans,anss[i]+1);

printf("%d\n",ans);

return 0;

}

XR 3 核心城市 樹直徑

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

P5535 XR 3 小道訊息

小道訊息 給定 n,k 每次被感染的數會傳染給 1,n 中與它互質的數。第 0 輪時 k 被感染,求第多少輪所有數都被感染。簽到好題,符合近年 noip 第一題趨勢 csp 2020 除外 首先良心出題人給了你伯特蘭 切比雪夫定理 若整數 n 3 則至少存在乙個質數 p 符合 n。另乙個稍弱說法是 ...

P5534 XR 3 等差數列

小 x 給了你乙個等差數列的前兩項以及項數,請你求出這個等差數列各項之和。等差數列 對於乙個 nn 項數列 aa,如果滿足對於任意 i in 1,n i 1,n 有 a a i dai 1 ai d,其中 dd 為定值,則稱這個數列為乙個等差數列。一行 33 個整數 a 1,a 2,na1 a2 n...