首先预处理f[i][j]表示i到j的路径
然后枚举i,j,如果f[i][j]<=s,那么
寻找最大的k,计算路径距离
计算最短的
代码:
#include<bits/stdc++.h> using namespace std; const int N=305; const int oo=1000000007; int ans,s,f[N][N],n; int main() { scanf("%d%d",&n,&s); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i==j)f[i][j]=0; else f[i][j]=oo; for (int i=1;i<n;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); f[x][y]=min(f[x][y],z); f[y][x]=min(f[y][x],z); } for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int k=1;k<=n;k++) f[j][k]=min(f[j][k],f[j][i]+f[i][k]); ans=oo; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (f[i][j]<=s) { int M=0; for (int k=1;k<=n;k++) M=max(M,(f[i][k]+f[j][k]-f[i][j])/2); ans=min(ans,M); } printf("%d",ans); }