最近发现二分图问题挺好玩的
也挺考验思维,所以专门做了个小汇总
这里只贴出主要定理及证明
1 最大匹配
最大匹配是二分图问题中的基础
概念
在二分图中最多能选多少条边,使得所有被选中的边中无相同节点
求法
目前有两种较为高效的算法,分别是匈牙利算法与网络流Dinic算法
匈牙利算法
匈牙利算法思想十分简单,就是能取则取,当当前指向点未被匹配时,匹配成功,当目前指向点已被匹配时,为指向点之前配对的点找一个新的配对点,如若成功则当前匹配成功,整个流程呈现贪心的思想,但使用DFS实现
网络流Dinic算法
直接将所有的左节点连向一个超级源点,所有右节点连向一个超级汇点,边权设为 1 1 ,然后就转化为了最大流模板,这里采用适于二分图的Dinic算法
证明
贪心的思想应该很好懂
2 最小点覆盖
概念
选取最少的点,使得所有的点与至少一个被选取点距离不超过
或
选取最少的点,使得所有边都至少与一个被选取点相连
求法
最小点覆盖 = 最大匹配
证明
当最大匹配时,一条边的两端必定至少有一个点被选取,所以我们只要选取其中的一个点便可以将这条边控制,而同样的被选取的点应该与最大匹配时选取的边存在一定的关系(一个点连接至少一条边)
3 最大独立集
概念
选取最多的点,使得其中任意两点互不相达
求法
最大独立集 = 点总数 - 最大匹配
证明
对于一个二分图最大匹配残图,其点分为两种,一种是被匹配边连接到另外一个点上的点,是已匹配点,相反的,未连接的点是未匹配点,所有未匹配点全数可选,但剩下的已匹配点中,每对点对中只能选一个,防止与另外一个冲突,而这种状况只有可能在最大匹配下实现未匹配点之间互补干扰
所以
4 最小边覆盖
概念
选取最少的边使得所有的点被至少一条边覆盖
解法
最小边覆盖 = 总点数 - 最大匹配
证明
首先这题肯定是满足贪心原则的,对于能连两点的边绝不放过,因为一条边可以解决两个点,至于剩下的点由于不能使用能解决两点的边,所以剩下的点中每个点需要一条边覆盖
所以我们得到了与最大独立集相同但思想不同的公式
5 最小路径覆盖
5.1 最小不相交路径覆盖
概念
在一张有向图中,选取最少的不相交路径使得所有的点都被访问
解法
对于原图中的每一个点 i i ,我们把它拆分成和 Bi B i ,对于原图中每一条有向边 (ui,vi) ( u i , v i ) ,我们将 ui u i 左图中对应的点 Aui A u i 连向 vi v i 右图中对应点 Bvi B v i ,最后
证明
因为对与一张有向图,最坏情况下就是每个点作为一条路径,但谁都知道我们不会傻到一条路径解决一个点,所以这时我们从最坏情况考虑,逐步减少总路径数
我们发现,只有当两个点之间有联通关系且它们仍未被联通时才可以将其合并为一条路径
自然地想到并查集,但是由于并查集之间的元素无方向性,所以只有带权并查集加上一些玄学操作才能解决问题
但我们懒(ben)呀,所以我们巧妙地使用二分图解决这个问题:
因为每个点既可以作为出发点,也可以作为到达点,而它在作为到达点时只能作为一条路径的到达点,作为出发点时也是只能作为一条路径的出发点,但实际上很难将这个点的出发状态与到达状态区分,所以我们使用二分图区分状态
对于每一条匹配成功的边都表示着可以减少一条最坏情况下(每个点都是一条路)的路
所以最终我们得到的结论是
5.2 最小可相交路径覆盖
概念
应该根据与楼上名字的区别区分这两条吧
好吧,这就是取得随意的多条路径使得点被全部覆盖(路径可以相交)
求法
根据有向图传递闭包,然后将所有连通性作图中的边来建立二分图,余下求法与最小不相交路径覆盖相同
证明
由于这种路径可以相交,所以指向性啥的就不用管了,中间经过的边由于可重,可以忽略
离NOIP2017还有最后十天,我竟然还在这里颓二分图,真是没救了/(ㄒoㄒ)/~~