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複製1 22 3
2 41 5
5 6
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...