记录编号 148849 评测结果 AAAAAAAAAA
题目名称 [SCOI 2005]王室联邦 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.316 s
提交时间 2015-02-15 21:45:36 内存使用 8.33 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define Maxn 300010
using namespace std;
int n,B,belong[Maxn],root[Maxn],cnt=0,siz[Maxn],dfsn[Maxn],tot=0;
vector<int> G[Maxn];
void dfs(int x,int tp){
    dfsn[++tot]=x;
    for(int i=0;i<G[x].size();i++){
        if(G[x][i]==tp) continue;
        dfs(G[x][i],x);
        siz[x]+=siz[G[x][i]];
        if(siz[x]>=B){
            root[++cnt]=x;
            for(tot;tot&&dfsn[tot]!=x;tot--) belong[dfsn[tot]]=cnt;
            siz[x]=0;
        }
    }
    siz[x]++;
}
int main(){
	freopen("bzoj_1086.in","r",stdin);
	freopen("bzoj_1086.out","w",stdout);
    scanf("%d%d",&n,&B);
    for(int i=1,x,y;i<n;i++){
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    if(n<B) puts("0");
    else{
        dfs(1,1);
        while(tot) belong[dfsn[tot]]=cnt,tot--;
        printf("%d\n",cnt);
        for(int i=1;i<=n;i++) printf("%d ",belong[i]); printf("\n");
        for(int i=1;i<=cnt;i++) printf("%d ",root[i]); printf("\n");
    }
    return 0;
}