RT,自己口胡了一份代码()
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
struct edge
{
int to,k;
};
vector<edge>c[maxn];
multiset<int>mp[maxn];
int n,m;
int a[maxn];
int dfs(int x,int f,int val)
{
mp[x].clear();
int s=0;
for(int i=0;i<c[x].size();i++)
{
if(c[x][i].to==f)
continue;
s+=dfs(c[x][i].to,x,val);
mp[x].insert(a[c[x][i].to]+c[x][i].k);
}
int mx=0;
while(!mp[x].empty())
{
if(mp[x].size()==1)
{
if(*mp[x].begin()<val)
mx=max(mx,*mp[x].begin()),mp[x].erase(mp[x].find(*mp[x].begin()));
else
s++,mp[x].erase(mp[x].find(*mp[x].begin()));
}
else
{
multiset<int>::iterator it=mp[x].lower_bound(val-*mp[x].begin());
if(it==mp[x].begin()&&mp[x].count(*it)==1)
it++;
if(it==mp[x].end())
{
if(*mp[x].end()+*mp[x].begin()<val)
mx=max(mx,*mp[x].begin()),mp[x].erase(mp[x].find(*mp[x].begin()));
else
s++,mp[x].erase(mp[x].find(*mp[x].begin())),mp[x].erase(mp[x].find(*it));
}
else
s++,mp[x].erase(mp[x].find(*mp[x].begin())),mp[x].erase(mp[x].find(*it));
}
}
a[x]=mx;
return s;
}
int check(int x)
{
int t=dfs(1,0,x);
if(t>=m)
return 1;
else
return 0;
}
int main()
{
// ios::sync_with_stdio(false);
int sum=0;
cin>>n>>m;
for(int i=1;i<=n-1;i++)
{
int u,v,w;
cin>>u>>v>>w;
sum+=w;
c[u].push_back(edge{v,w});
c[v].push_back(edge{u,w});
}
int l=1,r=sum;
while(l<=r)
{
memset(a,0,sizeof(a));
int mid=(l+r)/2;
if(check(mid))
l=mid+1;
else
r=mid-1;
}
cout<<l-1;
return 0;
}