其他分享
首页 > 其他分享> > 二分图问题

二分图问题

作者:互联网

二分图问题

一个图G=(V,E)中的V若可以分为两个集合(V1,V2)使得在V1内部和V2内部任意两点不可达,则称这个图为二分图。下面出现的V1,V2即分别表示内部任意两点不可达的两个集合。
开门见山,直接开始介绍二分图中几个关系:
最大匹配=最小点覆盖=|V|-最大独立集=|V|-最小边覆盖
有不详细的地方请参看其余资料,这里只是提供一个简要纲领性质的讲解,更适合用于复习而不是用于学习新算法。


一、最大匹配

1.定义:当一些边不存在公共点,则将这些边及其端点构成的子图M称为一个匹配,其中的点、边称为匹配点、匹配边。边数最大的匹配即为最大匹配,下面求解的就是最大匹配中边集的大小
2.求解方法
一个是匈牙利算法,其思想是在dfs的过程中不断寻找增广路直至不再存在增广路,代码简洁,可以在O(nm)的时间内求出最大匹配
我们给出增广路的含义:若一条路径满足该路径上的边以“非匹配边-匹配边-非匹配边……匹配边-非匹配边”(下面称 “交替排列” )的方式排列,则称该路径为增广路。显然,在这条路径上非匹配边始终比匹配边的数量多1,此时将该路径上非匹配边改为匹配边,将原匹配边改为非匹配边,即可扩大匹配边集的大小
另一个是网络流算法,可以更快地求出最大匹配:建立源点S和汇点T,由S向V1中所有点连接容量为1的边,由V2向T连接容量为1的边,将原图中所有边转化成容量为1的无向边,然后使用Dinic求出最大流即可

接下来我们将看到,掌握了求解最大匹配的方式,即可求解其余三个量:最小点覆盖,最大独立集,最小边覆盖


二、独立集,点覆盖、边覆盖、路径覆盖

1.定义
独立集:若点集D∈V且D中两两不可达,则称D为独立集
点覆盖:用点覆盖图,即:若D∈V且与这些点相连的边构成的边集=E,则称D为点覆盖
边覆盖:用边覆盖图,即:若B∈E且B中每条边对应的端点构成的集合=V,则称B为边覆盖
2.最小点覆盖=最大匹配数
首先,求出最大匹配
我们枚举V2中所有匹配点中尚未被遍历的点,从每个点按照交替排列的方式寻找路径,我们发现,如果将这段路径中属于V1的匹配点加入点覆盖集合,那么该路径可以被全部覆盖。
不断重复上述过程,发现最终所有非匹配点都被覆盖,最后只剩下V2中的匹配点。此时这些点加入点覆盖集合中,就得到了最小点覆盖集合。发现点覆盖集合中的每一个点都恰好属于一个匹配边,于是得出结论:最大匹配=最小点覆盖
3.最大独立集+最小点覆盖=|V|
最大独立集要求每一条边至少有一个点不被选中,最小点覆盖要求每一条边至少一个点被选中,这样每一个最小点覆盖集合与一个最大独立集构成一一对应的关系,可以得出上述结论
也可以这样理解:将点覆盖集合中所有点及连接它们的边删除,最后剩下的点即为一个独立集,因为每一条边都至少有一个端点被删除。这样,我们只要以最小代价执行这种删除操作即可获得最大独立集,最小代价正对应最小点覆盖。
4.对于不存在孤立点的图,最大匹配数+最小边覆盖=|V|
起初将所有点打上标记,表示完成边覆盖至少需要|V|条边。然后将每对匹配点的两个标记转移到连接这两点的匹配边上,再将非匹配点上的标记转移到任意一条连接他们的边上。发现所有有标记的边组成的集合就是一个边覆盖集合,每出现一条匹配边就可以令边覆盖集合的大小-1,于是最小边覆盖+最大独立集=|V|
5.DAG最小路径覆盖
DAG最小路径覆盖,即用尽可能少的路径经过图上每个点,并要求最小化路径条数。特殊地,一个点也算一条路径。
将每一个点拆成两个点(x,y),当出现形如A–>B的边时,将其装化成Ax–>By,这样我们就得到一张二分图,最小路径覆盖就是原图节点数-新图最大匹配数


这就是二分图问题的概述,实际做题时会发现,这类问题不难在算法而难在将原问题转化成二分图问题。还是要多做题啊~

end

标签:二分,匹配,最大,覆盖,路径,最小,问题,边覆盖
来源: https://blog.csdn.net/zixiangzhan/article/details/123043059