zoukankan      html  css  js  c++  java
  • noi.ac 2021 七一挑战赛 T2

    大致题意(有简化)

    给定一个 (n) 个点,(m) 条边的 DAG,边有边权。

    选出一棵根向生成森林。其中有 (X)(Y) 两种权值:

    • 选择一条边对 (X) 的贡献为边权;
    • 对于 (u) 的第 (i) 个孩子,对 (X) 还有 (n - i + 1) 的贡献;
    • (Y) 定义为叶子个数。

    最小化 (dfrac{X^k}{Y}),其中 (k in {1, 2})

    做法

    思路大致来自 (n) 次费用流限制 (Y) 值的讨论。

    构造最大费用流模型。

    定义 (infty) 是一个远大于最短路长度的有限数

    • 将每个点拆为入点 (u)、出点(u')
    • (S) 向所有 (u) 连容量 (1) ,价值 (-n) 的边,用于提供叶子的流量,且 (S) 无其他出边;(这保证了 (operatorname{flow}(S) = Y)
    • 非叶子节点的流量由孩子提供;对于边 ((u, v, w)),连接 (u' o v),容量 (1),价值 (w) 的边;
    • 每个点的入点和出点之间存在一条容量为 (1) 的边,价值为 (n + infty) (其中 (+infty) 保证了由 (S) 的流量(叶子)构造的森林包含了每一个点;(n) 用于提供 (u) 的第一个孩子的贡献,若 (u) 是叶子,则用 (S o u)(-n) 价值抵消)
    • 对于 (u)(T) (注意不是 (u'))依次连接容量为 (1),边权依次为 (n - 1, n - 2, dots, 1) 的边,用于消除 (1) 个以上孩子的流量,以及计算贡献;
    • 对于 (u')(T) 连价值 (0) 的边,若 (u) 为某棵树的根,那么这条边用于保证 (u,u') 的边存在 (1) 的流量,保证正确。

    通过这个模型,我们可以准确控制当前 (Y) 值,且如果价值大于 (n imes infty),那么可以保证构造出合法的森林。

    因此只需要 (n) 次增广来枚举 (Y) 值即可计算出答案。

    如果使用 Dijkstra 费用流,动态加入 (n - 1, n - 2, dots, 1) 的边,复杂度 (mathcal O(n(n + m) log n))

  • 相关阅读:
    Scrapy爬虫的基本使用
    scrapy 常见问题
    yield 关键字的使用
    Scrapy 爬虫框架
    股票数据爬虫
    为什么CNN需要固定输入图像的尺寸
    实战 7 淘宝商品信息定向爬虫
    正则表达式
    w​x​F​o​r​m​B​u​i​l​d​e​r​初​体​验
    wxwidget wxpython 可视化开发工具
  • 原文地址:https://www.cnblogs.com/RiverHamster/p/sol-noiac2021-71-t2.html
Copyright © 2011-2022 走看看