块状数据结构 秒杀一切题目!秒杀一切题目!
代码如下:
#include<ctype.h>
#include<cstdio>
#define N 1050
using namespace std;
inline int read(){
int x=0,f=1;char c;
do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c));
do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c));
return x*f;
}
int n,b,x,y,top,tot;
int fir[N],s[N],belong[N],root[N];
struct Edge{
int to,nex;
Edge(int _=0,int __=0):to(_),nex(__){}
}nex[N<<1];
inline void add(int x,int y){
nex[++top]=Edge(y,fir[x]);
fir[x]=top;
}
void dfs(int x,int fa){
int st=top;
for(int i=fir[x];i;i=nex[i].nex){
if(nex[i].to==fa) continue;
dfs(nex[i].to,x);
if(top-st>=b){
root[++tot]=x;
while(top>st)
belong[s[top--]]=tot;
}
}
s[++top]=x;
}
int main(){
n=read();b=read();
for(int i=1;i<n;i++){
x=read();y=read();
add(x,y);add(y,x);
}
top=0;
dfs(1,0);
while(top) belong[s[top--]]=tot;
printf("%d\n",tot);
for(int i=1;i<=n;i++)
printf("%d ",belong[i]);
printf("\n");
for(int i=1;i<=tot;i++){
printf("%d ",root[i]);
}
return 0;
}