zoukankan      html  css  js  c++  java
  • 【转】来自GDXB大大大大的小总结

    一  最短路

    模型一 增加限制

    例:给定一个图,求起点到终点的最短路,其中你可以使用最多k次机会使某条边的边权变为x。

    解法:把每个点拆成k个点,分别表示还能使用多少次机会,构造新图。

     

    模型二 一个点集(点非常多,不能两两建边)之间两两可到达,求最短路。

    解法:新开一个点,每个点都连一条无向边到新点。

    二  二分图最大匹配

    二分图最大匹配 = 最小点覆盖 = n-最大点独立集

    最小点覆盖:选取最少的点覆盖所有的边

    最大点独立集:一个点集,其中的点两两不可到达。

    大致证明:

    最大匹配=最小点覆盖:如果还能匹配,那就证明还有边没被覆盖。

    最小点覆盖=n-最大点独立集:如果独立集可以增大k,那就证明有k个点间两两没边,那最小点覆盖就可以删去这k个点。N个点,去掉最小点覆盖的,剩下的两两没边,就是最大点独立集。

    最小边覆盖=n-最大匹配:本来是n条边(每个点要被一条边覆盖),每匹配一对,就相当于减少了一条边。

    三、 无向图 最小边覆盖:选择最少的边,覆盖所有的点。

     拆点,构造二分图,因为额原图是无向边,所以要一次add两条边。然后无向图最小边覆盖=n-最大匹配/2(n是原图总点数,因为拆点,所以要除以二)

    四  最小路径覆盖(有向无环图

    (1)每个点有且只有被一条路径覆盖。

     

    解法:把n个点拆成2n个点,变成二分图建边,然后 最小路径覆盖 = n-二分图最大匹配

    原因:本来是n条路径(每个点作为一条路径),每匹配一对,就相当于减少了一条路径。因为是二分图匹配,所以每个点只会在一条路径上。

    (2)每个点可被多条路径覆盖。

    解法一:在原图中用一次floyd,则上图新建了边(1,5)(2,4)(2,5),再把它当成每个点只能陪一条路径覆盖来做。因为路径2->3->4与路径1->3->5相当于2->3->4与1->5,即一条覆盖了k个点的路径可以看作是覆盖了<=k个点的路径。

    解法二:

     

    用网络流(最大流)跑出最大匹配。在二分图的右边按照原图建边,边权全为正无穷,则原理跟上面一样,路径1-3-5相当于路径1-5,则跑出的最大匹配就是一个点可在多条边上的。

    http://www.cnblogs.com/KonjakJuruo/p/5471008.html

    2016-10-25 21:47:40

  • 相关阅读:
    Centos 卸载Docker
    若依微服务版本 Windows下开发环境搭建
    Iterator 其实很简单(最好理解的工厂模式的例子)
    MySQL replace into详解
    MYSQL事务隔离
    Linux下rpm卸载安装MySQL出现specifies multiple packages
    linux删除文件夹的时候出现设备或者资源忙
    IOS下的safari下localStorage不起作用的问题
    windows下nginx配置报错GetFileAttributesEx
    Linux下增加swap的方法
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/5998380.html
Copyright © 2011-2022 走看看