Files
OI-source/1.5021.cpp
2023-08-03 09:22:52 +08:00

88 lines
1.5 KiB
C++

#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=50005;
int n,m,cnt;
vector<int> G[maxn],W[maxn];
multiset<int> s[maxn];
int dep[maxn];
void DFS(int u,int d)
{
dep[u]=d;
for(int i=0;i<G[u].size();i++)
{
int &v=G[u][i];
if(!dep[v]) DFS(v,d+W[u][i]);
}
}
int dfs(int u,int fa,int lim)
{
s[u].clear();
int val=0;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(v==fa) continue;
val=dfs(v,u,lim)+W[u][i];
if(val>=lim) cnt++;
else s[u].insert(val);
}
int maxd=0;
while(!s[u].empty())
{
multiset<int>::iterator bg=s[u].begin();
if(s[u].size()==1) return max(maxd,*bg);
multiset<int>::iterator it=s[u].lower_bound(lim-*bg);
if(it==bg&&s[u].count(*it)==1) ++it;
if(it==s[u].end())
{
maxd=max(maxd,*bg);
s[u].erase(bg);
}
else
{
cnt++;
s[u].erase(it);
s[u].erase(s[u].begin());
}
}
return maxd;
}
inline bool check(int lim)
{
cnt=0;
dfs(1,0,lim);
return cnt>=m;
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
int L=1,R,M,res=1;
for(int i=1;i<=n-1;i++)
{
int u,v,w; scanf("%d%d%d",&u,&v,&w);
G[u].push_back(v); G[v].push_back(u);
W[u].push_back(w); W[v].push_back(w);
}
DFS(1,1);
int rt=1;
for(int i=2;i<=n;i++) if(dep[i]>dep[rt]) rt=i;
memset(dep,0,sizeof(dep)); DFS(rt,1);
R=dep[1];
for(int i=2;i<=n;i++) R=max(R,dep[i]); R--;
while(L<=R)
{
M=(L+R)>>1;
if(check(M)) res=M,L=M+1;
else R=M-1;
}
printf("%d\n",res);
return 0;
}