#include<bits/stdc++.h>
using namespace std;
#define N 50010
int n,m,maxn=0,ans=0,lim,val[N],h[N],cnt=0;
multiset<int>::iterator it,tmp;
int gi(){
int w=0,f=1;char ch;
while(!isdigit(ch)){f=ch=='-'?-1:1;ch=getchar();}
while(isdigit(ch)){w=(w<<1)+(w<<3)+ch-48;ch=getchar();}
return w*f;
}
struct edge{
int v,w,nxt;
}e[N<<1];
void add(int u,int v,int w){
e[++cnt]=(edge){v,w,h[u]};
h[u]=cnt;
}
void dfs(int x,int fx,int w){
multiset<int>s;
s.clear();
val[x]=w;
for(int i=h[x];i;i=e[i].nxt){
if(e[i].v!=fx){
dfs(e[i].v,x,e[i].w);
if(val[e[i].v]>=lim)ans++;
else s.insert(val[e[i].v]);
}
}
int Max=0;
while(!s.empty()){
it=s.begin();
s.erase(it);
tmp=s.lower_bound(lim-(*it));
if(tmp!=s.end()){
ans++;
s.erase(tmp);
}
else Max=max(Max,*it);
}
val[x]+=Max;
}
bool check(int x){
ans=0;lim=x;
dfs(1,0,0);
if(ans>=m)return 1;
else return 0;
}
int main(){
n=gi();m=gi();
for(int i=1;i<n;i++){
int u=gi(),v=gi(),w=gi();
add(u,v,w);
add(v,u,w);
maxn+=w;
}
int l=1,r=maxn;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l<<"\n";
}
这种写法为什么会RE?
调了半天,真找不出来错误,救救蒟蒻吧。。。