luogu5536 核心城市
题目描述
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 \le k < n \le 10 ^ 51≤k<n≤105。
- 1 \le u,v \le n, u \ne v1≤u,v≤n,u=v,保证城市与道路形成一棵树。
输出格式
一行一个整数,表示答案。
输入输出样例
输入 #1
6 3 1 2 2 3 2 4 1 5 5 6
输出 #1
1
说明/提示
【样例说明】
钦定 1,2,51,2,5 这 33 座城市为核心城市,这样 3,4,63,4,6 另外 33 座非核心城市与核心城市的距离均为 11,因此答案为 11。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 struct edge 5 { 6 int u,v,nxt; 7 }e[maxn<<1]; 8 int head[maxn],js; 9 void addage(int u,int v) 10 { 11 e[++js].u=u;e[js].v=v; 12 e[js].nxt=head[u];head[u]=js; 13 } 14 int n,m; 15 int rd[maxn],dis[maxn]; 16 queue<int>q; 17 int main() 18 { 19 scanf("%d%d",&n,&m); 20 for(int u,v,i=1;i<n;++i) 21 { 22 scanf("%d%d",&u,&v); 23 addage(u,v); 24 addage(v,u); 25 rd[u]++;rd[v]++; 26 } 27 for(int i=1;i<=n;++i)dis[i]=1e5+10; 28 for(int i=1;i<=n;++i) 29 if(rd[i]==1) 30 { 31 dis[i]=1; 32 q.push(i); 33 } 34 int cnt=n; 35 while(!q.empty()) 36 { 37 int u=q.front();q.pop(); 38 cnt--; 39 if(cnt==m) 40 { 41 printf("%d\n",dis[u]); 42 return 0; 43 } 44 for(int i=head[u];i;i=e[i].nxt) 45 { 46 int v=e[i].v; 47 if(rd[v]>1)--rd[v]; 48 if(rd[v]==1&&dis[v]>dis[u]+1) 49 { 50 dis[v]=dis[u]+1; 51 q.push(v); 52 } 53 } 54 } 55 return 0; 56 }