求助点分树的构建
  • 板块学术版
  • 楼主cainiaoshanglu
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/2/26 22:03
  • 上次更新2023/10/23 23:37:59
查看原帖
求助点分树的构建
367387
cainiaoshanglu楼主2023/2/26 22:03

这是蒟蒻构建点分树的代码,但是WA了,求调

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;

void read(int &x){
	x=0;
	int f=1;
	char c=getchar();
	while(!('0'<=c && c<='9')){
		if(c=='-'){
			f=-1;
		}                     
		c=getchar();
	}
	while('0'<=c && c<='9'){  
		x=(x<<3)+(x<<1)+(c^48);                                                                                                                                                                                                              
		c=getchar();
	}
	x*=f;
}
struct Edge{
	int to,nxt;
	Edge(){}
	Edge(int t,int nx){
		to=t;
		nxt=nx;
	}
} e[200010];
int hs[100010],tot=-1,n,m,res=0,rt=-1,cursiz,rtsiz=-2e9,dfn=0;
int siz[100010],fa[100010];
bool isdiv[100010]={0};
void add(int u,int v){
	e[++tot]=Edge(v,hs[u]);
	hs[u]=tot;
}
int getrt(int k,int f){
	siz[k]=1;
	int mxn=-2e9;
	for(int i=hs[k];~i;i=e[i].nxt){
		if(!isdiv[e[i].to] && e[i].to!=f){
			mxn=max(mxn,getrt(e[i].to,k));
			siz[k]+=siz[e[i].to];
		}
	}
	mxn=max(mxn,cursiz-siz[k]);
	if(!~rt || mxn<rtsiz){
		rtsiz=mxn;
		rt=k;
	}
	return siz[k];
}
void divide(int k){
	//printf("%lld\n",k);
	isdiv[k]=true;
	for(int i=hs[k];~i;i=e[i].nxt){
		if(!isdiv[e[i].to]){
			cursiz=siz[e[i].to];
			rt=-1;
			rtsiz=-2e9;
			getrt(e[i].to,0);
			fa[rt]=k;
			divide(rt);
		}
	}
}
signed main(){
	int u,v;
	memset(hs,-1,sizeof(hs));
	read(n);
	for(int i=1;i<n;i++){
		read(u);
		read(v);
		add(u,v);
		add(v,u);
	}
	cursiz=n;
	getrt(1,0);
	fa[rt]=-1;
	divide(rt);
	for(int i=1;i<=n;i++){
		printf("%lld ",fa[i]);
	}
	return 0;
}
2023/2/26 22:03
加载中...