题目:树网的核
思路:
floyd求多点最短路。
枚举路径端点,暴力的算每个点到路径的距离。
一个点k到路径(i,j)的距离为:(d[i][k]+d[j][k]-d[i][j])/2
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 300
#define read(x) scanf("%d",&x)
#define inf (1e9)
int n,S;
int d[maxn+5][maxn+5];
int main() {
read(n),read(S);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) d[i][j]=inf;
for(int i=1;i<n;i++) {
int x,y,z;
read(x),read(y),read(z);
d[x][y]=d[y][x]=z;
}
for(int k=1;k<=n;k++) {
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
int ans=inf;
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j++) {
if(d[i][j]>S) continue;
int s=0;
for(int k=1;k<=n;k++) {
s=max(s,(d[i][k]+d[j][k]-d[i][j])/2);
}
ans=min(ans,s);
}
}
printf("%d",ans);
return 0;
}