请求加强数据
查看原帖
请求加强数据
280604
DiDi123楼主2023/7/14 14:39

以下这份代码没有考虑路径端点在重心的情况,但仍能通过:

#include <bits/stdc++.h>
using namespace std;
#define MAXN 400010
#define INF 1e9
typedef long long ll;
struct edge
{
	int to,nex,w;
}Edge[MAXN];
int head[MAXN],cnt;
void add(int u,int v,int w)
{
	Edge[cnt].to=v;
	Edge[cnt].w=w;
	Edge[cnt].nex=head[u];
	head[u]=cnt++;
	//cout<<cnt<<endl;
}
struct node
{
	ll de,dd;
}p[MAXN];
ll st[MAXN],pt,rec[MAXN],tot,minn,pos,n,m;
ll buk[MAXN*10],ans=INF;
void ce()
{
	for(int i=1;i<=tot;i++) buk[rec[i]]=INF;
	tot=0;
}
int gs(int x,int fa)
{
	if(st[x]) return 0;
	int res=1;
	for(int i=head[x];i!=-1;i=Edge[i].nex)
	{
		int y=Edge[i].to;
		if(y==fa) continue;
		res+=gs(y,x);
	}
	return res;
}
int gc(int x,int fa,int ts)
{
	if(st[x]) return 0;
	int res=1,ms=0;
	for(int i=head[x];i!=-1;i=Edge[i].nex)
	{
		int y=Edge[i].to;
		if(y==fa) continue;
		int sl=gc(y,x,ts);
		ms=max(ms,sl),res+=sl;
	}
	ms=max(ms,ts-res);
	if(ms<minn) minn=ms,pos=x;
	return res;
}
void gd(int x,int fa,int de,int dd)
{
	if(st[x]) return;
	p[++pt].de=de,p[pt].dd=dd;
	for(int i=head[x];i!=-1;i=Edge[i].nex)
	{
		int y=Edge[i].to;
		if(y==fa) continue;
		gd(y,x,de+1,dd+Edge[i].w);
	}
}
void insert(node a[],int k)
{
	for(int i=1;i<=k;i++)
	{
		if(a[i].dd>m) continue;
		buk[a[i].dd]=min(buk[a[i].dd],a[i].de);
		rec[++tot]=a[i].dd;
	}
}
void calc(int x)
{
	if(st[x]) return;
	minn=INF,pos=0;
	gc(x,-1,gs(x,-1));
	st[pos]=1;
	//cout<<x<<' '<<pos<<endl;
	ce();
	for(int i=head[pos];i!=-1;i=Edge[i].nex)
	{
		int y=Edge[i].to;
		pt=0;
		gd(y,-1,1,Edge[i].w);
		for(int i=1;i<=pt;i++) 
			if(p[i].dd<=m)
				ans=min(ans,buk[m-p[i].dd]+p[i].de);
		insert(p,pt);
	}
	for(int i=head[pos];i!=-1;i=Edge[i].nex)
		calc(Edge[i].to);
}
int main()
{
	//freopen("P4149_6.in","r",stdin);
	memset(head,-1,sizeof(head));
	memset(buk,0x3f,sizeof(buk));
	buk[0]=0;
	cin>>n>>m;
	int a1,a2,a3;
	for(int i=1;i<n;i++)
	{
		cin>>a1>>a2>>a3;
		add(a1,a2,a3),add(a2,a1,a3);
	}
	calc(0);
	if(ans==INF) puts("-1");
	else cout<<ans;
}
2023/7/14 14:39
加载中...