您的位置:首页 > 其它

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

2016-01-12 20:01 330 查看


其实合法方案一定存在....(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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: