BZOJ 1086: [SCOI2005]王室联邦( )

其实合法方案一定存在....(B <= N), 构造答案就可以了...然而我是看题解才会的.....

-----------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
  
using namespace std;
 
const int maxn = 1009;
 
int N, B, Id[maxn], V[maxn], n;
int stk[maxn], Top;
 
struct edge {
int to;
edge* next;
} E[maxn << 1], *pt = E, *head[maxn];
 
inline void AddEdge(int u, int v) {
pt->to = v;
pt->next = head[u];
head[u] = pt++;
}
 
void Init() {
scanf("%d%d", &N, &B);
for(int i = 1; i < N; i++) {
int u, v;
scanf("%d%d", &u, &v);
u--, v--;
AddEdge(u, v);
AddEdge(v, u);
}
Top = n = 0;
}
 
void DFS(int x, int fa = -1) {
int t = Top;
for(edge* e = head[x]; e; e = e->next) if(e->to != fa) {
DFS(e->to, x);
if(Top - t >= B) {
V[++n] = x;
for(; Top > t; Top--)
Id[stk[Top]] = n;
}
}
stk[++Top] = x;
}
 
int main() {
Init();
DFS(0);
for(; Top--; Id[stk[Top]] = n);
printf("%d\n", n);
for(int i = 0; i < N; i++)
printf("%d ", Id[i]);
puts("");
for(int i = 1; i <= n; i++)
printf("%d ", ++V[i]);
puts("");
return 0;
}

----------------------------------------------------------------------- 

1086: [SCOI2005]王室联邦

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 938  Solved: 539
[Submit][Status][Discuss]

Description

“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的你快帮帮这个国王吧!

Input

第一行包含两个数N,B(1<=N<=1000, 1 <= B <= N)。接下来N-1行,每行描述一条边,包含两个数,即这条边连接的两个城市的编号。

Output

如果无法满足国王的要求,输出0。否则输出数K,表示你给出的划分方案中省的个数,编号为1..K。第二行输出N个数,第I个数表示编号为I的城市属于的省的编号,第三行输出K个数,表示这K个省的省会的城市编号,如果有多种方案,你可以输出任意一种。

Sample Input

8 2
1 2
2 3
1 8
8 7
8 6
4 6
6 5

Sample Output

3
2 1 1 3 3 3 3 2
2 1 8

HINT

Source

 

posted @ 2016-01-12 20:01  JSZX11556  阅读(...)  评论(... 编辑 收藏