BZOJ1086 [SCOI2005]王室联邦 【树分块】

tonyfang posted @ 2015年8月29日 17:44 in BZOJ with tags c++ OI , 485 阅读

树分块,在常州的时候$wrh$和我们讲过。

这题是个模板题。

参考$PoPoQQQ$大神,写的代码。

实现起来并不那么困难。

 

//bzoj1086
# include <stdio.h>
using namespace std;

int head[1010],next[2020],to[2020],tot=0;
int c[1010],root[1010],s[10001],top,cnt;
inline void add(int u,int v) {to[++tot]=v;next[tot]=head[u];head[u]=tot;}
int n,b;
void g(int x,int from) {
	int bottom=top;
	for(int i=head[x];i;i=next[i]) {
		if(to[i]!=from) {
			g(to[i],x);
			if(top-bottom>=b) {
				root[++cnt]=x;
				while(top!=bottom)
					c[s[top--]]=cnt;
			}
		}
	}
	s[++top]=x;
}
int main() {
	scanf("%d%d",&n,&b);
	for (int i=1,u,v;i<=n-1;++i) scanf("%d%d",&u,&v),add(u,v),add(v,u);
	g(1,0);
	while(top)c[s[top--]]=cnt;
	printf("%d\n",cnt);
	for (int i=1;i<=n;++i)printf("%d ",c[i]);printf("\n");
	for (int i=1;i<=cnt;++i)printf("%d ",root[i]);printf("\n");
	return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter