• BZOJ 1005: [HNOI2008]明明的烦恼


    BZOJ 1005: [HNOI2008]明明的烦恼

    Description

      自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
    任意两点间连线,可产生多少棵度数满足要求的树?

    Input

      第一行为N(0 < N < = 1000),
    接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

    Output

      一个整数,表示不同的满足要求的树的个数,无解输出0

    Sample Input

    3
    1
    -1
    -1

    Sample Output

    2

    HINT

      两棵树分别为1-2-3;1-3-2

    Source

    Solution

    引出知识点prufer编码(摘抄一段定义):
    [1]树的prufer编码的实现

    ​ 不断 删除树中度数为1的最小序号的点,并输出与其相连的节点的序号 直至树中只有两个节点

    [2]通过观察我们可以发现

    ​ 任意一棵n节点的树都可唯一的用长度为n-2的prufer编码表示

    ​ 度数为m的节点的序号在prufer编码中出现的次数为m-1

    [1] 怎样将prufer编码还原为一棵树??

    ​ 从prufer编码的最前端开始扫描节点,设该节点序号为 u ,寻找不在prufer编码的最小序号且没有被标记的节点 v ,连接 u,v,并标记v,将u从prufer编码中删除。扫描下一节点。

    先考虑没有-1的情况,已知cnt个点的读数,把他们放进n-2个格子的个数​

    [frac{(n-2)!}{(n-2-cnt)!prod_{i=1}^n(d_i-1)!} ]

    剩下的随便放入剩下的n-2-cnt个格子种,即:

    [Ans=frac{(n-2)!}{(n-2-cnt)!prod_{i=1}^n(d_i-1)!}(n-cnt)^{n-2-sum} ]

    注意:高精度可能超时,要分解质因数最后把因数相乘即可。
    代码就不贴了,太丑了。

  • 相关阅读:
    NET VBCSCompiler.exe占用100%,造成项目卡顿的的解决方法
    C#导出word [无规则表结构+模板遇到的坑]
    mysql允许远程连接的命令
    bootstrap-table的一些基本使用及表内编辑的实现
    在 VS2015+EF6.0中使用Mysql 遇到的坑
    NET使用SuperSocket完成TCP/IP通信
    GRPC在NET上的应用
    NET SignaiR 实现消息的推送,并使用Push.js实现通知
    运维自动化之4
    运维自动化之3
  • 原文地址:https://www.cnblogs.com/patricksu/p/7999738.html
Copyright © 2020-2023  润新知