题解
2023-08-12 18:32:25
发布于:浙江
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+6;
int n,s,dis[N],fa[N],flag[N],far,ans=2e9;
struct edge{
int to,w;
};
vector<edge> G[N];
void dfs(int u,int f){
fa[u]=f;
if(dis[u]>dis[far])far=u;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to, w=G[u][i].w;
if(v==f||flag[v])continue;
dis[v]=dis[u]+w;
dfs(v,u);
}
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>s;
for(int i=2,u,v,w;i<=n;i++){
cin>>u>>v>>w;
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,w});
}
int A,B;
dis[1]=1;dfs(1,0);A=far;
dis[far]=0;dfs(far,0);B=far;
for(int i=B,j=B; i; i=fa[i]){
while(dis[j]-dis[i]>s)j=fa[j];
int x=max(dis[B]-dis[j], dis[i]);
ans=min(ans,x);
}
for(int i=B; i; i=fa[i])flag[i]=1;
for(int i=B; i; i=fa[i]){
dis[i]=0;
dfs(i,fa[i]);
}
for(int i=1;i<=n;i++)
ans=max(ans,dis[i]);
cout<<ans;
return 0;
}
全部评论 1
???????
2023-10-23 来自 广东
0
有帮助,赞一个