一 最短路
模型一 增加限制
例:给定一个图,求起点到终点的最短路,其中你可以使用最多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