代码如下:
//luogu P1099 acwing 351
#include<bits/stdc++.h>
using namespace std;
#define maxn 333
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
int ans=INT_MAX,n,s;
struct nd{
int to,dis,nxt;
}G[maxn<<1];
int cnt,head[maxn];
inline void add_edge(int a,int b,int c){
G[++cnt]={b,c,head[a]},head[a]=cnt;
G[++cnt]={a,c,head[b]},head[b]=cnt;
}
int vis[maxn],dis[maxn];
int dfs(int now){
vis[now]=1;
for(int i=head[now];i;i=G[i].nxt){
if(!vis[G[i].to]){
dis[G[i].to]=dis[now]+G[i].dis;
dfs(G[i].to);
}
}
vis[now]=0;
}
int full_d[maxn],cnt_d=1,flag;
void get_fd(int now,int to){
full_d[cnt_d]=now;
vis[now]=1;
if(now==to){
flag=1;
return ;
}
++cnt_d;
for(int i=head[now];i;i=G[i].nxt){
if(!vis[G[i].to]){
get_fd(G[i].to,to);
if(flag){
return ;
}
}
}
vis[now]=0,--cnt_d;
}
void get_d(){
int d0,d1,maxdis=0;
dfs(1);
for(int i=1;i<=n;++i){
if(dis[i]>maxdis){
d0=i,maxdis=dis[i];
}
}
dis[d0]=0,maxdis=0;
dfs(d0);
for(int i=1;i<=n;++i){
if(dis[i]>maxdis){
d1=i,maxdis=dis[i];
}
}
get_fd(d0,d1);
}
int d_dis[maxn];
void d_dfs(int now){
vis[now]=1;
for(int i=head[now];i;i=G[i].nxt){
if(!vis[G[i].to]){
d_dfs(G[i].to);
d_dis[now]=max(d_dis[now],d_dis[G[i].to]+G[i].dis);
}
}
}
void solve(){
for(int i=2;i<cnt_d;++i){
d_dfs(full_d[i]);
}
int l=1,r=1,tmp=d_dis[full_d[1]];
while(r<cnt_d){
while(r<cnt_d&&dis[full_d[r+1]]-dis[full_d[l]]<=s){
++r,tmp=max(tmp,d_dis[full_d[r]]);
}
if(tmp>=dis[full_d[l]]&&tmp>=dis[full_d[cnt_d]]-dis[full_d[r]]){
ans=tmp;
return ;
}
ans=min(ans,max(dis[full_d[l]],dis[full_d[cnt_d]]-dis[full_d[r]]));
++l;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
cin>>n>>s;
for(int i=1;i<n;++i){
int a,b,c;
cin>>a>>b>>c;
add_edge(a,b,c);
}
get_d();
solve();
cout<<ans<<endl;
return 0;
}
//I will AK IOI.
//CCF is a naozi.