BZOJ-1086
#include<bits/stdc++.h> using namespace std; const int maxn = 1005; int head[maxn],To[maxn<<2],Next[maxn<<2]; int n,b,cnt,type,top; int Stack[maxn],ans[maxn],belong[maxn]; void add(int u,int v){ Next[++cnt]=head[u]; head[u]=cnt; To[cnt]=v; } void dfs(int u,int fa){ int now=top; for(int i=head[u];i;i=Next[i]){ int v=To[i]; if(v==fa) continue; dfs(v,u); if(top-now>=b){ ans[++type]=u; while(top!=now){ belong[Stack[top--]]=type; } } } Stack[++top]=u; } int main(){ scanf("%d %d",&n,&b); for(int i=1;i<n;i++){ int u,v; scanf("%d %d",&u,&v); add(u,v); add(v,u); } dfs(1,0); while(top) belong[Stack[top--]]=type; cout<<type<<" "; for(int i=1;i<=n;i++){ cout<<belong[i]<<" "; } cout<<" "; for(int i=1;i<=type;i++){ cout<<ans[i]<<" "; } return 0; }