其他分享
首页 > 其他分享> > [模板] 基础树上动规

[模板] 基础树上动规

作者:互联网

树的直径

void dfs(int x,int fa){
	f[x] = 1;
	int mx = 0;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(y==fa) continue;
		dfs(y,x);
		f[x] = max(f[x], f[y]+1);
		ans = max(ans, mx+f[y]+1);
		mx = max(mx, f[y]);
	}
	ans = max(ans, f[x]);
}

这里有一个小细节,上面代码求的是点直径,就是直径包含多少个点,如果我们计算边的个数,我们只需要把f[ x ]初始化改为1,令ans=max(ans,mx+f[ y ]+2)。

树的重心

void dfs(int x,int fa){
	siz[x]=1;
	for(int i=head[x];i;i=nxt[i]){
		int y=ver[i];
		if(y==fa) continue;
		dfs(y,x);
		siz[x] += siz[y];
		mx[x] = max(mx[x], siz[y]);
	}
	mx[x] = max(mx[x], n-siz[x]);
}

最后再找到mx[ x ]最小的下标即是答案

标签:siz,int,max,dfs,动规,ans,树上,mx,模板
来源: https://www.cnblogs.com/Liang-sheng/p/15133324.html