1.用弗洛伊德算法求两两点之间的最短距离
2.求出直径是多少
3.暴力枚举找出两个在直径上的点
4.判断是否小于S并更新答案
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000000000
#define MAXN 300+7
int n;
int Ans;
int Max;
int limit;
int w[MAXN][MAXN];
inline void solve()
{
scanf("%d%d",&n,&limit);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
w[i][j]=inf;
for (int a,b,c,i=1;i<=n-1;i++) {
scanf("%d%d%d",&a,&b,&c);
w[a][b]=w[b][a]=c;
} Ans=inf;
for (int i=1;i<=n;i++)
w[i][i]=0;
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j&&j!=k&&k!=i&&w[i][k]+w[k][j]<w[i][j])
w[i][j]=w[i][k]+w[k][j];
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
Max= Max<w[i][j] ? w[i][j] : Max ;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
if (w[i][j]==Max)
for (int k=1;k<=n;k++)
if (w[i][k]+w[k][j]==w[i][j])
for (int l=1;l<=n;l++)
if (w[i][l]+w[l][j]==w[i][j])
if (w[k][l]<=limit)
Ans=min(Ans,max(min(w[i][k],w[i][l]),min(w[j][k],w[j][l])));
printf("%d\n",Ans);
}
int main()
{
solve();
return 0;
}