rt,求助大佬
#18 WA
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int maxn=2e5+1;
int n,k;
struct ed{
int t,h,w;
}e[maxn<<1];
int last[maxn],cnt=0;
void adde(int x,int y,int z){
e[++cnt].h=last[x];
e[cnt].t=y;
e[cnt].w=z;
last[x]=cnt;
}
int siz[maxn],root,minn,d[maxn],len[maxn],top[maxn],t[maxn],tp,tot,ans=0x7ffffff;
bool vis[maxn];
void get_root(int u,int f,int sn){
siz[u]=1;
int maxx=0;
for(int i=last[u];i;i=e[i].h){
int v=e[i].t;
if(vis[v]||v==f)continue;
get_root(v,u,sn);
siz[u]+=siz[v];
maxx=max(maxx,siz[v]);
}
maxx=max(maxx,sn-siz[u]);
if(maxx<minn){
minn=maxx;
root=u;
}
}
void get_dis(int u,int f){
// cout<<u<<endl;
t[++tot]=u;
top[u]=tp;
len[u]=len[f]+1;
for(int i=last[u];i;i=e[i].h){
int v=e[i].t;
if(v==f||vis[v])continue;
if (d[u]+e[i].w>k)return;
d[v]=d[u]+e[i].w;
get_dis(v,u);
}
}
bool cmp(int x,int y){
if(d[x]==d[y]){
return len[x]<len[y];
}
return d[x]<d[y];
}
void calc(int u){
tot=0,d[u]=0,top[u]=u,t[++tot]=u,len[u]=0;
for(int i=last[u];i;i=e[i].h){
int v=e[i].t;
if(vis[v])continue;
tp=v,d[v]=e[i].w;
len[v]=1;
get_dis(v,u);
}
int l=1,r=tot;
sort(t+1,t+tot+1,cmp);
while(l<r){
// cout<<l<<' '<<r<<endl;
if(d[t[l]]+d[t[r]]<k){
l++;
}else if(d[t[l]]+d[t[r]]>k){
r--;
}else if(top[t[l]]==top[t[r]]){
if(d[t[r]]-d[t[r-1]]<=d[t[l+1]]-d[t[l]])r--;
else l++;
}else{
ans=min(ans,len[t[l]]+len[t[r]]);
if(d[t[r]]-d[t[r-1]]<=d[t[l+1]]-d[t[l]])r--;
else l++;
}
}
}
void dfs(int u){
vis[u]=1;
calc(u);
for(int i=last[u];i;i=e[i].h){
int v=e[i].t;
if(vis[v])continue;
minn=0x7ffffff;
get_root(v,u,siz[v]);
dfs(root);
}
}
signed main(){
cin>>n>>k;
for(int i=1,x,y,z;i<n;i++){
cin>>x>>y>>z;
adde(x+1,y+1,z);
adde(y+1,x+1,z);
}
minn=0x7ffffff;
get_root(1,0,n);
dfs(root);
if(ans==0x7ffffff){
cout<<-1;
}else cout<<ans;
return 0;
}