传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1086
一开始看神题不会,后来liangjs说是一个奇怪的贪心,再后来看了nilihan1999神犇的题解,于是就A了,呃
Code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
vector<int>G[maxn];
stack<int>S;
int n,B;bool vis[maxn];
int siz[maxn],bel[maxn],cnt,head[maxn];
int dfs(int u){
int tsize=0;
vis[u]=1;
S.push(u);
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!vis[v]){
tsize+=dfs(v);
if(tsize>=B){
head[++cnt]=u;
siz[cnt]=tsize;
while(S.top()!=u){
int top=S.top();S.pop();
bel[top]=cnt;
}tsize=0;
}
}
}return tsize+1;
}
int main(){
scanf("%d%d",&n,&B);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
if(n<B){puts("0");return 0;}
if(n<=3*B){puts("1");for(int i=1;i<=n;i++)printf("%d%c",i," \n"[i==n]);puts("1");}
dfs(1);
for(int i=1;i<=n;i++)
if(!bel[i])siz[bel[i]=cnt]++;
printf("%d\n",cnt);
for(int i=1;i<=n;i++)
printf("%d%c",bel[i]," \n"[i==n]);
for(int i=1;i<=cnt;i++)
printf("%d%c",head[i]," \n"[i==n]);
return 0;
}