zoukankan      html  css  js  c++  java
  • AGC018F

    题意

    有两棵节点数均为 n 的有根树,你需要构造一个序列 (X_1,X_2,...,X_n)。使得对于每一棵树的每一个节点, 若令它所有的后代(包括它本身)为 (a_1,a_2,...,a_k),则都有 (abs(X_{a_1} + X_{a_2} +···+ X_{a_k}) = 1)。 判断是否可行,若可行输出一种可行方案。

    做法

    (-1equiv 1(mod~2)),这启示我们将(a_i)赋为({-1,0,1})
    根据儿子的数量可确定一个点的奇偶性

    显然得两树各点的奇偶性均相同才有可能行
    有个更强的结论是:奇偶性相同一定能构造出可行方案

    这样构造:将所有奇点在两棵树上对应位置连边,建立一个虚点连向两棵树根节点,保留原来的边;跑欧拉回路,对于一条路径,我们设立方向(本身一条路径是没有方向的);若存在某奇点第一棵树跑向第二棵树,设为(-1),否则设为(1),所以偶点设为(0)

    定义横叉边为两棵树间的边
    将欧拉回路拆成若干个有向环。
    1类环表示从当前节点向儿子走,然后又从儿子走回当前点
    2类环表示从当前节点向儿子走,从父亲边走回当前点(反向也是一样的)
    3类环表示从当前节点向父亲边或横叉边走,又从这两个中另一个走回来
    4类环表示从当前节点向儿子走,从横叉边走回当前点(反向也是一样的)
    这样拆分的好处是可以发现一个环上各点和为(0),然后分奇偶点简单讨论一下就可以了。这里不详细展开,可以看这里

  • 相关阅读:
    第四章、Vue组件
    第三章、Vue实例
    第二章、Vue指令
    Python练习实例012
    Python练习实例011
    Python练习实例010
    Python练习实例009
    Python练习实例008
    Python练习实例007
    Python练习实例006
  • 原文地址:https://www.cnblogs.com/Grice/p/12374585.html
Copyright © 2011-2022 走看看