zoukankan      html  css  js  c++  java
  • Codeforces Round #190 (Div. 2) E. Ciel the Commander 题目与题解翻译

    E. Ciel the Commander
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    现在Fox Ciel成为了Tree Land的指挥官。

    Tree Land,正如它的名字所说,有n个城市由n-1条无向道路连接,并且其中任意两个城市之间总是存在一条路径。

    Fox Ciel需要在每个城市分配一个官员。每个官员都有一个等级---一个’A’到’Z’之间的字母。所以会有26个不同的等级,’A’是最高的,’Z’是最低的。

    每个等级都有足够的官员。但是必须遵守一个特殊的规则:

    ——如果x和y是两个不同的城市并且他们的官员拥有相同的等级,那么x和y之间的简单路径中一定存在一个城市z有更高等级的官员。

    这个规则可以保证两个同等级官员之间的通信会由较高等级的官员监控。

    帮助Ciel制定一个有效的计划,如果这是不可能的,输出"Impossible!"。

    Input

           第一行包含一个整数n (2 ≤ n ≤ 105)---Tree Land的城市数。

    接下来的n-1行包含两个整数a和b (1 ≤ a, b ≤ n, a ≠ b)---表示a和b之间有一条无向的道路。城市的编号从1到n。

           保证题目给出的图是一棵树。

    Output

           如果存在一个有效的计划,在一行里输出由空格分隔的n个字符,第i个字符表示第i个城市里官员的等级。

           否则输出"Impossible!"。

    ----

    这是一个树上的问题,对于这种问题,通常有两种方法:自上而下或自下而上。对于每种方法有一种解决方案。

    up-down construction

    假设我们在点x分配一个等级为A的官员。对以x为根的两个子树T1、T2来说,不能有任何一个无效的路径通过它们,因为它们被节点x封锁。

    (很显然,我们不能分配两个等级为A的官员)

    因此我们可以独立的处理这些子树。唯一不同的是,我们不可以再使用等级A。

    然后,问题是:x是哪个节点?如果所有的子树都尽肯能的小更好。

    如果你知道什么是树的中心,那么你就可以快速找到x,如果x是一颗树的中心,那么子树不会超过原树的一半。

    所以我们只需要log2(n)个等级,26个字母足够了。

    down-up construction

    假设我们选择1为根节点并且把树当做有向树。

    我们有一些根节点为T1,T2…..,Tk的子树,并且他们已经指派了官员,我们需要指派一个官员到点x将它们连接。

    那么,正常的想法是,选择一个最尽可能最低的等级。

    x的等级应该满足:

    如果Ti中有一个点等级为t并且Tj中有一个点为t(i!=j),那么x的等级必须高于t。(否则它们之间的路径将是无效的)

    如果Ti中有一个点等级为t,那么x的等级不能为t。

    因此我们可以采用这个规则选择尽可能低的等级。






  • 相关阅读:
    Bone Collector HDU
    Super Jumping! Jumping! Jumping! HDU
    147. 对链表进行插入排序
    C++ Program to Implement Sorted Circularly Doubly Linked List
    344. 反转字符串
    1360. 日期之间隔几天
    剑指 Offer 62. 圆圈中最后剩下的数字
    1441. 用栈操作构建数组
    594. 最长和谐子序列
    836. 矩形重叠
  • 原文地址:https://www.cnblogs.com/cyendra/p/3226350.html
Copyright © 2011-2022 走看看