以下这份代码没有考虑路径端点在重心的情况,但仍能通过:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 400010
#define INF 1e9
typedef long long ll;
struct edge
{
int to,nex,w;
}Edge[MAXN];
int head[MAXN],cnt;
void add(int u,int v,int w)
{
Edge[cnt].to=v;
Edge[cnt].w=w;
Edge[cnt].nex=head[u];
head[u]=cnt++;
//cout<<cnt<<endl;
}
struct node
{
ll de,dd;
}p[MAXN];
ll st[MAXN],pt,rec[MAXN],tot,minn,pos,n,m;
ll buk[MAXN*10],ans=INF;
void ce()
{
for(int i=1;i<=tot;i++) buk[rec[i]]=INF;
tot=0;
}
int gs(int x,int fa)
{
if(st[x]) return 0;
int res=1;
for(int i=head[x];i!=-1;i=Edge[i].nex)
{
int y=Edge[i].to;
if(y==fa) continue;
res+=gs(y,x);
}
return res;
}
int gc(int x,int fa,int ts)
{
if(st[x]) return 0;
int res=1,ms=0;
for(int i=head[x];i!=-1;i=Edge[i].nex)
{
int y=Edge[i].to;
if(y==fa) continue;
int sl=gc(y,x,ts);
ms=max(ms,sl),res+=sl;
}
ms=max(ms,ts-res);
if(ms<minn) minn=ms,pos=x;
return res;
}
void gd(int x,int fa,int de,int dd)
{
if(st[x]) return;
p[++pt].de=de,p[pt].dd=dd;
for(int i=head[x];i!=-1;i=Edge[i].nex)
{
int y=Edge[i].to;
if(y==fa) continue;
gd(y,x,de+1,dd+Edge[i].w);
}
}
void insert(node a[],int k)
{
for(int i=1;i<=k;i++)
{
if(a[i].dd>m) continue;
buk[a[i].dd]=min(buk[a[i].dd],a[i].de);
rec[++tot]=a[i].dd;
}
}
void calc(int x)
{
if(st[x]) return;
minn=INF,pos=0;
gc(x,-1,gs(x,-1));
st[pos]=1;
//cout<<x<<' '<<pos<<endl;
ce();
for(int i=head[pos];i!=-1;i=Edge[i].nex)
{
int y=Edge[i].to;
pt=0;
gd(y,-1,1,Edge[i].w);
for(int i=1;i<=pt;i++)
if(p[i].dd<=m)
ans=min(ans,buk[m-p[i].dd]+p[i].de);
insert(p,pt);
}
for(int i=head[pos];i!=-1;i=Edge[i].nex)
calc(Edge[i].to);
}
int main()
{
//freopen("P4149_6.in","r",stdin);
memset(head,-1,sizeof(head));
memset(buk,0x3f,sizeof(buk));
buk[0]=0;
cin>>n>>m;
int a1,a2,a3;
for(int i=1;i<n;i++)
{
cin>>a1>>a2>>a3;
add(a1,a2,a3),add(a2,a1,a3);
}
calc(0);
if(ans==INF) puts("-1");
else cout<<ans;
}