#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k;
vector<int> road[200005];
int maxndis=-0x3fffffff;
int pointa,pointb,pointmid;
int vis[100005],ans[100005],tf;
int maxdep[100005],dep[100005];
int sum[100005];
int final_ans=-1;
bool cmp(int x,int y)
{
return x>y;
}
void dfs(int cur,int step)
{
if(vis[cur]==1){
return;
}
vis[cur]=1;
if(step>maxndis){
maxndis=step;
pointa=cur;
}
for(int i=0;i<(int)road[cur].size();i++){
dfs(road[cur][i],step+1);
}
}
void dfs1(int cur,int step)
{
if(vis[cur]==1){
return;
}
vis[cur]=1;
if(step>maxndis){
maxndis=step;
pointb=cur;
}
for(int i=0;i<(int)road[cur].size();i++){
dfs1(road[cur][i],step+1);
}
}
void getmid(int cur,int step)
{
if(vis[cur]==1){
return;
}
if(tf==1){
return;
}
vis[cur]=1;
ans[step]=cur;
if(cur==pointb){
tf=1;
return;
}
for(int i=0;i<(int)road[cur].size();i++){
getmid(road[cur][i],step+1);
}
}
void dfs2(int cur,int step)
{
if(vis[cur]==1){
return;
}
maxdep[cur]=dep[cur]=step;
vis[cur]=1;
for(int i=0;i<(int)road[cur].size();i++){
dfs2(road[cur][i],step+1);
maxdep[cur]=max(maxdep[cur],maxdep[road[cur][i]]);
}
}
int main()
{
cin>>n>>k;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
road[u].push_back(v);
road[v].push_back(u);
}
dfs(1,0);
memset(vis,0,sizeof(vis));
maxndis=-0x3fffffff;
dfs1(pointa,1);
memset(vis,0,sizeof(vis));
getmid(pointa,1);
pointmid=ans[(maxndis+1)/2];
memset(vis,0,sizeof(vis));
dfs2(pointmid,1);
for(int i=1;i<=n;i++){
sum[i]=maxdep[i]-dep[i];
}
sort(sum+1,sum+1+n,cmp);
cout<<sum[k+1]+1;
return 0;
}
神帖