萌新求助,50分,改不动了
查看原帖
萌新求助,50分,改不动了
253738
听取MLE声一片楼主2021/3/9 13:06

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<complex>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
const int inf=1e9;
const int N=1000001;
int n,m,ans=inf,dis[N],len[N],f[N],vis[N],siz[N],book[N],root,sum;
struct point{
	int next,to,w;
}a[N<<1];
int head[N],cnt;
void add(int x,int y,int w){
	a[++cnt].to=y;
	a[cnt].next=head[x];
	a[cnt].w=w;
	head[x]=cnt;
}
void find(int x,int y){
	f[x]=0,siz[x]=1;
	for(int i=head[x];i;i=a[i].next){
		int v=a[i].to;
		if(vis[v]||v==y)
			continue;
		find(v,x);
		siz[x]+=siz[v];
		f[x]=max(f[x],siz[v]);
	}
	f[x]=max(f[x],sum-siz[x]);
	if(f[x]<f[root])
		root=x;
}
int tot;
void dep(int x,int y,int l,int r){
	if(l>m)
		return;
	dis[++tot]=l;
	len[tot]=r;
	for(int i=head[x];i;i=a[i].next){
		int v=a[i].to;
		if(v==y||vis[v])
			continue;
		dep(v,x,l+a[i].w,r+1);
	}
}
void calc(int u){
	book[0]=0;
	tot=0;
	for(int i=head[u];i;i=a[i].next){
		int v=a[i].to;
		if(vis[v])
			continue;
		int x=tot;
		dep(v,u,a[i].w,1);
		for(int j=x+1;j<=tot;j++)
			ans=min(ans,book[m-dis[j]]+len[j]);
		for(int j=x+1;j<=tot;j++)
			book[dis[j]]=min(book[dis[j]],len[j]);
	}
	for(int i=1;i<=tot;i++)
		book[dis[i]]=inf;
}
void pd(int k){
	vis[k]=1;
	calc(k);
	for(int i=head[k];i;i=a[i].next){
		int v=a[i].to;
		if(vis[v])
			continue;
		root=0,sum=siz[v];
		find(v,k);
		pd(root);
	}
}
int main()
{
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int x=read()+1,y=read()+1,w=read();
		add(x,y,w),add(y,x,w);
	}
	sum=f[0]=n;
	f[0]++;
	find(1,0);
	for(int i=0;i<=n;i++)
		book[i]=inf;
	pd(root);
	printf("%d",ans>=n?-1:ans);
	return 0;
}
2021/3/9 13:06
加载中...