zoukankan      html  css  js  c++  java
  • hihoCoder #1763 道路摧毁

    题目大意

    A 国一共有 $n$ 个城市且有 $n-1$ 条双向道路,且任意两个城市都可以通过道路互相到达。

    现在 B 国给出了两个城市的集合 $X,Y$,你需要摧毁若干条 A 国的道路,使得任意一个在 X 中的城市无法到达任何一个 Y 中的城市。

    现在给定每条道路摧毁需要付出的代价,求一个代价之和最小的方案。

    数据范围

    $ nle 2 imes 10^5 $
    $ 1 le w le 10^9 $ ($w$ 表示摧毁道路的代价)

    分析

    最小割

    这道题实际上是求无向图最小割,因此可以套网络流的模板。

    建图:

    • 将 $X$ 中的点缩成一点 $s$,将 $Y$ 中的点缩成一点 $t$

    这里我有一个疑问:缩点之后得到的无向图中的每条边 $(u,v)$,在流网络中要加两条有向边 $(u o v) $ 和 $(v o u)$ 吗?
    还是说可以先进行一次 DFS 或 BFS 将边从 $s$ 到 $t$ 定向?

    树形 DP

    这里介绍一个树形 DP 的解法。

    为了便于表述,给树的节点标号。 $X$ 中的节点标号为 1,$Y$ 中的节点标号为 $2$,余下的节点标号为 $0$ 。

    我们称一棵有根树拆了若干条边(也可能一条边都不拆)之后是合法的, 当且仅当拆边之后的图中不存在两个标号分别为 1 和 2 的连通节点。

    我们将所有合法的图分成三类:

    • 存在一个标号为 1 的点与根节点连通
    • 存在一个标号为 2 的点与根节点连通
    • 不属于前两类

    据此不难定义 DP状态,写出转移方程。

    至此,我们将这个问题转化成了一个典型的(子树合并)树形 DP 问题。

  • 相关阅读:
    python线程、线程池
    day10 知识点
    socketserver 进阶之I/O多路复用
    socketserver
    socket
    设计模式
    剑指offer:整数中1出现的次数
    剑指offer:二叉搜索树与双向链表
    剑指offer:扑克牌顺子
    剑指offer:孩子们的游戏(圆圈中最后剩下的数)
  • 原文地址:https://www.cnblogs.com/Patt/p/9166565.html
Copyright © 2011-2022 走看看