淀粉质75ptsWA求调
查看原帖
淀粉质75ptsWA求调
752628
l56983楼主2025/7/29 14:55
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
const int maxn=2e6;
int head[maxn<<1];
int nxt[maxn<<1];
int val[maxn<<1];
int to[maxn<<1];
int cnt=0;
int dp[maxn];
int size[maxn];
int dis[maxn];
int rev[maxn];
int res[maxn];
int vis[maxn];
int q[maxn];
int tot=0;
int pd[maxn];
int step[maxn];
int ans=LONG_LONG_MAX;
int fl=0;
int sum=0;
int root;
void add(int u,int v,int w)
{
	cnt++;
	to[cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
void getroot(int u,int fa)
{
	size[u]=1;
	dp[u]=0;
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==fa||vis[v]) continue;
		getroot(v,u);
		size[u]+=size[v];
		dp[u]=max(dp[u],size[v]);
	} 
	dp[u]=max(dp[u],sum-size[u]);
	if(dp[u]<dp[root])
	{
		root=u;
	}
}
void getdis(int u,int fa)
{
	if(dis[u]<=k)
	{
		rev[++tot]=dis[u];
		res[tot]=step[u];		
	}
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		if(v==fa||vis[v]) continue;
		dis[v]=dis[u]+val[i];
		step[v]=step[u]+1;
		getdis(v,u);
	}
}
void doit(int u)
{
	int c=0;
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		if(vis[v]) continue;
		tot=0;
		dis[v]=val[i];
		step[v]=1;
		getdis(v,u);
		for(int j=1;j<=tot;j++)
		{
			if(k>=rev[j]&&(pd[k-rev[j]]||k==rev[j]))
			{
				fl=1;
				ans=min(ans,res[j]+res[pd[k-rev[j]]]);
			}
		}
		for(int j=1;j<=tot;j++)
		{
			q[++c]=rev[j];
			pd[rev[j]]=j;
		}
	}
	for(int i=1;i<=c;i++)
	{
		pd[q[i]]=0;
	}
}
void solve(int u)
{
	vis[u]=1;
	doit(u);
	for(int i=head[u];i;i=nxt[i])
	{
		int v=to[i];
		if(vis[v]) continue;
		dp[0]=n;
		sum=size[v];
		root=0;
		getroot(v,u);
		solve(root);
	}
}
signed main()
{
	freopen("p4149_1.in","r",stdin);
	cin>>n>>k;
	dp[0]=sum=n;
	for(int i=1;i<n;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		u++,v++;
		add(u,v,w);
		add(v,u,w);
	}
	getroot(1,0);
	solve(root);
	if(!fl)
	{
		cout<<-1;
		return 0;
	}
	cout<<ans;
	return 0;
}

2025/7/29 14:55
加载中...