【转】来自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

posted @ 2016-10-25 21:42  konjak魔芋  阅读(282)  评论(0编辑  收藏  举报