求助,开O2RE,不开O2100pts
查看原帖
求助,开O2RE,不开O2100pts
681115
wsx10楼主2023/11/29 15:10
#include<bits/stdc++.h>
using namespace std;
struct point{
	int to,w;
};
vector<point> mp[500001];
int dist[500001],fa[500001],flag[500001];
int far=0;
int ans=1e9;
int s;
int A,B;
int n;
int dfs(int u,int f)
{
	fa[u]=f;
	if(dist[u]>dist[far]) far=u;
	for(int i=0;i<mp[u].size();++i)
	{
		int v=mp[u][i].to,w=mp[u][i].w;
		if(v==f||flag[v]) continue;
		dist[v]=dist[u]+w;
		dfs(v,u);
	}
}
int main()
{
	
	cin>>n>>s;
	for(int i=1;i<=n-1;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		mp[a].push_back({b,c});
		mp[b].push_back({a,c});
	}
	
	dist[1]=1;
	dfs(1,0);
	A=far;
	dist[A]=0;
	dfs(far,0);
	B=far;
	//cout<<dist[B]<<endl;
	//memset(flag,0,sizeof(flag));
	for(int i=B,j=B;i;i=fa[i])
	{
	    while(dist[j]-dist[i]>s) j=fa[j];
	    int x=max(dist[B]-dist[j],dist[i]);
	    ans=min(ans,x);
	}
	for(int i=B;i!=0;i=fa[i]) flag[i]=1;
	for(int i=B;i!=0;i=fa[i])
	{
		dist[i]=0;
		dfs(i,fa[i]);
	}
	for(int i=1;i<=n;i++) ans=max(ans,dist[i]);
	cout<<ans;
	return 0;
 } 

0分

100分

2023/11/29 15:10
加载中...