四、二分图
1.二分图判定
二分图的一个等价定义是:不含有「奇数条边的环」的图。
判定算法:
1.选取一个未染色的点u进行染色
2.遍历u的相邻节点v:若v未染色,则染色成与u不同的颜色,并对v重复第2步;若v已经染色,如果 u和v颜色相同,判定不可行退出遍历。
3.若所有节点均已染色,则判定可行。
例题与代码请看这篇博客,写得很棒:点击打开链接
2.二分图最大匹配(匈牙利算法)
①概念:
匹配:在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。
最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。
完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。 显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。但并非每个图都存在完美匹配。
交错路 : 从一个未匹配点出发,依次遍历未匹配边、匹配边、未匹配边,这样交替下去,这条路径称为交错路
增广路 : 从一个未匹配点出发,依次遍历未匹配边、匹配边、未匹配边,这样交替下去,如果最后一个点是未匹配点,这条路径称为增广路。换句话说,起点和终点都为未匹配点的交错路为增广路(特别提醒,这里的增广路和网络流中的增广路的意义不同)
②增广路的一些特点:
增广路一定有奇数条边。
增广路中未匹配边一定比匹配边多一条(因为是从未匹配点出发走交错路到未匹配点结束)
这里其实就表明了研究增广路的意义,如果找到了一条增广路,那么将未匹配点与匹配边的身份调换,那么匹配的边数就多了一条,这样直到找不到增广路为止,那么整个图的匹配的边数一定最大,也就是找到了二分图的最大匹配。
③匈牙利算法原理:
匈牙利算法正是利用了增广路的性质,从X集合中找到一个未匹配点,寻找增广路,找到了,匹配数+1,如果没有找到,那么从X中找到下一个未匹配的点,再次寻找增广路……重复上述过程,直到X集合中的所有节点都被“增广”完毕,无论如何都找不到增广路,那么整个图的匹配数就最大了。
④模板题: