zoukankan      html  css  js  c++  java
  • DAG最小路径点覆盖

    Problem

    给出一个有向无环图 ((DAG)),求出最少使用其中多少条互不相交的路径覆盖所有点。

    Solution

    若有 (n) 个点,对于每个点 (i) ,我们将它拆成两个点 (i)(i'),分别放在一个二分图的两侧,然后,对于有向图中的每条边 ((a,b)) 我们在二分图中将 ((a,b')) 这两个点连在一起。

    当所有边在二分图中已经相应连好之后,我们跑二分图最大匹配,可以使用匈牙利,不过个人更倾向建立一个超级源点连向左侧每个点,建立一个超级汇点被右侧每个点所连,然后跑网络最大流。

    假设最大流为 (maxflow) ,则最小路径覆盖数为 (n-maxflow)

    Confirmation

    由于要求选出的每条路径都要不相交,那么对于每条路径中的点,它的入度与出度均不会大于 (1) 。尤其对于每个起点,入度必定为 (0) ,每个终点出度必定为 (0)

    那么由于 (DAG) 中的每条边都已经放到了二分图里,对于 (DAG) 最小路径选边的情况必定已经能够在二分图里选出来了。

    接着我们考虑一下所要求的问题,显然一条路径只会有一个终点,且一个终点必定属于某条路径。而终点的出度又必定为 (0) 。那么这样对应的选边情况放到二分图里呢?我们就会发现:

    • 对于一个点 (i) ,它指向 (j) 的出边必定在二分图上为 ((i,j'))
    • 对于一个点 (i) ,如果它的出度为 (0) ,那么二分图上的 (i) 必定不与任意一个 (j') 所匹配。
    • 选出的路径最少 (Leftrightarrow) 终点最少 (Leftrightarrow) 二分图左侧的未匹配点最少 (Leftrightarrow) 二分图匹配数最大

    那么根据以上证明,可以得出:最少路径= 最少终点 = 总点数-最大匹配数 = (n-maxflow)

    证毕。

  • 相关阅读:
    IOS系统下虚拟键盘遮挡文本框问题的解决
    ubuntu git的安装更新及配置
    js 画布与图片的相互转化(canvas与img)
    js 图片与base64互相转换
    PHP base64数据与图片的互相转换
    js 判断当前操作系统是ios还是android还是电脑端
    ubuntu下nodejs和npm的安装及升级
    vue中使用html2canvas及解决html2canvas截屏图片模糊问题
    vue文件中引入外部js
    php 执行 命令行命令
  • 原文地址:https://www.cnblogs.com/luoshuitianyi/p/10333993.html
Copyright © 2011-2022 走看看