二分图,顾名思义,其点可以分成两部分,而与之相连的边一定是由一部分连向另一部分的。特殊的,树也是一种二分图。
实际上,如果设图G=(V,E)是一个无向图,并且点集V可分割为两个互不相交的子集V1,V2,那么称此图G为二分图。
而匹配一词,用比较正规的话来说,是一个边的集合,其中任意两条边都没有公共点。
匹配边:在一个匹配中的边
匹配点:匹配边相连的点
非匹配边:not 匹配边
非匹配点:not 匹配点
最大匹配:一个图中所有匹配中最大的那个
完美匹配:一个图中所有点都是匹配点,这个匹配就是完美匹配
如果我们要在一个图里求最大匹配,一个显然的暴力做法是枚举每一个可能的匹配并维护最大值。这个算法的时间复杂度高到上天。
实际上, 我们可以用匈牙利算法来求一个叫做增广路的东西,以此来求最大匹配。
说增广路之前先说什么叫交替路。 交替路指的是一个这样的路径,从一个非匹配点出发,交替经过匹配边和非匹配边。 增广路指的是从一个非匹配点出发,走交替路,如果途径另外一个非匹配点,这条交替路就称为增广路。
增广路有很多性质,这里不讨论。
我们说一下匈牙利算法。
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。
通俗的讲,这是一个绿与被绿的过程(逃
在我学习匈牙利算法的时候,我看到一个非常生动形象的图,我把它贴在这,大家可以看看
上面那个图就是一个二分图。匈牙利算法是一个基于dfs的过程,只需要枚举一遍第一个集合里的所有点,在所有点都做一次dfs就可以。
首先a去找1,然后b试图找1发现a已经和1配对了,并且a不能去找其他人,所以b不能找1,b要去找2.然后c试图找2,同时c发现就算c连了2也不会影响b,因为b还可以连3.此时连接完毕,算法结束。
超简单的是吧= =