luogu5536 核心城市

题目描述

X 国有 nn 座城市,n − 1n1 条长度为 11 的道路,每条道路连接两座城市,且任意两座城市都能通过若干条道路相互到达,显然,城市和道路形成了一棵树。

X 国国王决定将 kk 座城市钦定为 X 国的核心城市,这 kk 座城市需满足以下两个条件:

  1. 这 kk 座城市可以通过道路,在不经过其他城市的情况下两两相互到达。
  2. 定义某个非核心城市与这 kk 座核心城市的距离为,这座城市与 kk 座核心城市的距离的最小值。那么所有非核心城市中,与核心城市的距离最大的城市,其与核心城市的距离最小。你需要求出这个最小值。

输入格式

第一行 22 个正整数 n,kn,k。

接下来 n - 1n1 行,每行 22 个正整数 u,vu,v,表示第 uu 座城市与第 vv 座城市之间有一条长度为 11 的道路。

数据范围:

  • 1 \le k < n \le 10 ^ 51k<n105。
  • 1 \le u,v \le n, u \ne v1u,vn,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 }
View Code

 

posted on 2021-03-27 08:51  gryzy  阅读(63)  评论(0编辑  收藏  举报

导航