二分匹配之匈牙利算法
一、概念
二分图:把点分为两个集合,在同一个集合的点之间不能有边,也就是说边只能存在于分别来自两个集合的点间,这样的图就是二分图。
最大二分匹配:在原二分图上通过删除一些边,来保证每个点只能与一个点相连(一一对应),能保留最多的边数,这个边数就是最大二分匹配
二、算法步骤
1)初始化,存图。
2)选定其中一个集合,依次对集合中的每个点dfs搜索增广路,成功搜到即匹配数加一,搜索的过程中也对前面的进行了更新。(最后的M图就是最大二分匹配图,搜索过程每搜索一次,M图的边数加1)。
三、具体分析
这里的增广路概念:
1、以非M图中的点出发,到非M图中的点结束。
2、所经过的边,交替是M图中的边(第一条边不属于M图,第二条属于,第三条不属于,......)
*M图:初始化M图为空,(所以第一次搜索产生的增广路就是一条边),每次搜索后产生的增广路与旧M图做异或操作(有相同重复的边就去掉) 就是新的M图。
四、匹配顺序
有些图不止一个最大二分匹配图,所以可能会对输出有要求。
1)邻接表存的图,所以从先建立连接的点开始读取,搜索。
2)后面的搜索会有更新,所以先建立连接的点一般不是最后的点。
处理:建立邻接表之前先排序。改变搜索增广路的顺序。
实例,图解后续再补......