zoukankan      html  css  js  c++  java
  • 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);
    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

  • 相关阅读:
    一个比较好用的网络库
    Live Writer Beta 测试
    WinForm中如何设置MDI父窗体的背景图片
    使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现! 转
    关于从剪贴板获得截图
    我的作品图书馆信息管理系统
    很久以前用VB写的小游戏
    Web2.0时代,RSS你会用了吗?_CSDN
    VFP下利用API调用帮助
    VFP中轻松绑定 Windows 事件
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5125459.html
Copyright © 2011-2022 走看看