“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成
员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条
直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个
城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经
过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的
你快帮帮这个国王吧!
第一行包含两个数N,B(1<=N<=1000, 1 <= B <= N)。接下来N-1行,每行描述一条边,包含两个数,即这
条边连接的两个城市的编号。
如果无法满足国王的要求,输出0。否则输出数K,表示你给出的划分方案中省的个数,编号为1..K。第二行输
出N个数,第I个数表示编号为I的城市属于的省的编号,第三行输出K个数,表示这K个省的省会的城市编号,如果
有多种方案,你可以输出任意一种。
1 #include <bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 inline int read(){
5 int x=0;int f=1;char ch=getchar();
6 while(!isdigit(ch)) {if(ch==‘-‘) f=-1;ch=getchar();}
7 while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
8 return x*f;
9 }
10 const int MAXN=1e6+10;
11 namespace zhangenming{
12 struct node{
13 int y,next;
14 }e[MAXN];
15 int linkk[MAXN],b,len=0,n,stark[MAXN],top=0,tot,ine[MAXN],d[MAXN];
16 inline void insert(int xx,int yy){
17 e[++len].y=yy;e[len].next=linkk[xx];linkk[xx]=len;
18 }
19 void init(){
20 n=read();b=read();
21 for(int i=1;i<n;i++){
22 int xx=read();int yy=read();
23 insert(xx,yy);insert(yy,xx);
24 }
25 }
26 void dfs(int st,int father){
27 int topp=top;
28 for(int i=linkk[st];i;i=e[i].next){
29 if(e[i].y!=father){
30 dfs(e[i].y,st);
31 if(top-topp>=b){
32 tot++;
33 d[tot]=st;
34 while(top>topp){
35 ine[stark[top--]]=tot;
36 }
37 }
38 }
39 }
40 stark[++top]=st;
41 }
42 void solve(){
43 dfs(1,0);
44 while(top){
45 ine[stark[top--]]=tot;
46 }
47 printf("%d\n",tot);
48 for(int i=1;i<n;i++){
49 printf("%d ",ine[i]);
50 }
51 printf("%d\n",ine[n]);
52 for(int i=1;i<tot;i++){
53 printf("%d ",d[i]);
54 }
55 printf("%d\n",d[tot]);
56 }
57 }
58 int main(){
59 using namespace zhangenming;
60 init();
61 solve();
62 return 0;
63 }
代码