90ptsRE求助
查看原帖
90ptsRE求助
32490
memory_frv楼主2021/10/16 16:02

在12,18RE了,12测试点在找重心的时候就炸了,害,为啥啊,求助

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#define inf 2147483647
using namespace std;
int judge[30000001];
int ttot=0,cnt=0,head[1000001],ans=2147483647,tot=0,n,k,rt,maxp[1000001],siz[1000001],sum,dis[1000001],q[1000001];
pair<int,int> rem[5000001];
bool vis[1000001];
struct edge{
	int v,w,nxt;
}e[1000001];
inline void add(int u,int v,int val){
	e[++tot].v=v,e[tot].w=val,e[tot].nxt=head[u],head[u]=tot;
	e[++tot].v=u,e[tot].w=val,e[tot].nxt=head[v],head[v]=tot;
}
inline void find_balance(int now,int fa){
	siz[now]=1;
	maxp[now]=0;
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(to==fa||vis[to]) continue;
		find_balance(to,now);
		siz[now]+=siz[to];
		maxp[now]=max(maxp[now],siz[to]);
	}
	maxp[now]=max(maxp[now],sum-maxp[now]);
	if(maxp[now]<maxp[rt]) rt=now;
}
inline void getdis(int now,int fa,int depth){
	rem[++cnt].first=dis[now],rem[cnt].second=depth;
	q[++q[0]]=dis[now];
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(to==fa||vis[to]) continue;
		dis[to]=dis[now]+e[i].w;
		getdis(to,now,depth+1);
	}
}
inline void calc(int now){
	q[0]=0;
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(vis[to]) continue;
		cnt=0;
		dis[to]=e[i].w;
		getdis(to,now,1);
		for(int j=cnt;j;--j){
			if(k-rem[j].first>=0&&judge[k-rem[j].first]!=-1)
			ans=min(ans,judge[k-rem[j].first]+rem[j].second);
		}
		for(int j=cnt;j;--j){
			if(judge[rem[j].first]==-1){
				judge[rem[j].first]=rem[j].second;
			}else judge[rem[j].first]=min(judge[rem[j].first],rem[j].second);
		}
	}
	for(int i=1;i<=q[0];i++){
		judge[q[i]]=-1;
	}
}
inline void solve(int now){
	vis[now]=1;judge[0]=0;calc(now);
	for(int i=head[now];i;i=e[i].nxt){
		int to=e[i].v;
		if(vis[to]) continue;
		sum=siz[to];maxp[rt=0]=inf;
		find_balance(to,0);solve(rt);
	}
}
int main(){
	//freopen("1.in","r",stdin);
	memset(judge,-1,sizeof(judge));
	cin>>n>>k;
	for(int i=1;i<n;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		u++,v++;
		add(u,v,w);
	}
	sum=maxp[rt]=n;
	//cout<<n<<endl;
	find_balance(1,0);
	solve(rt);
	if(ans==2147483647){
		cout<<"-1";
	}else cout<<ans;
	return 0;
}
2021/10/16 16:02
加载中...