图论算法总结之四:二分图

四、二分图

1.二分图判定

二分图的一个等价定义是:不含有「奇数条边的环」的图。

判定算法:

1.选取一个未染色的点u进行染色

2.遍历u的相邻节点v:若v未染色,则染色成与u不同的颜色,并对v重复第2步;若v已经染色,如果 u和v颜色相同,判定不可行退出遍历。

3.若所有节点均已染色,则判定可行。

例题与代码请看这篇博客,写得很棒:点击打开链接


2.二分图最大匹配(匈牙利算法)

①概念

匹配:在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。

最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。

完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。 显然,完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突)。但并非每个图都存在完美匹配。

交错路 : 从一个未匹配点出发,依次遍历未匹配边、匹配边、未匹配边,这样交替下去,这条路径称为交错路

增广路 : 从一个未匹配点出发,依次遍历未匹配边、匹配边、未匹配边,这样交替下去,如果最后一个点是未匹配点,这条路径称为增广路。换句话说,起点和终点都为未匹配点的交错路为增广路(特别提醒,这里的增广路和网络流中的增广路的意义不同)

②增广路的一些特点:

  1. 增广路一定有奇数条边。

  2. 增广路中未匹配边一定比匹配边多一条(因为是从未匹配点出发走交错路到未匹配点结束)

这里其实就表明了研究增广路的意义,如果找到了一条增广路,那么将未匹配点与匹配边的身份调换,那么匹配的边数就多了一条,这样直到找不到增广路为止,那么整个图的匹配的边数一定最大,也就是找到了二分图的最大匹配。

③匈牙利算法原理:

匈牙利算法正是利用了增广路的性质,从X集合中找到一个未匹配点,寻找增广路,找到了,匹配数+1,如果没有找到,那么从X中找到下一个未匹配的点,再次寻找增广路……重复上述过程,直到X集合中的所有节点都被“增广”完毕,无论如何都找不到增广路,那么整个图的匹配数就最大了。

④模板题:

HDU - 2063

POJ - 1469


猜你喜欢

转载自blog.csdn.net/qq_41333528/article/details/80296685
今日推荐