二分图最大匹配——匈牙利算法

其实所谓的“反色”就是改变mat的标记,mat其实不是叫路径(当然在增广的过程中)它的确起到了“记录前驱”的作用,但是,每趟增广之后,其实他代表的就是匹配
例如 1和6匹配 那么mat[1]=6; mat[6]=1; 它不是前驱的作用
所以严格来讲,增广的过程,是回到它之前的匹配点mat[i],然后要mat[i]重新找一个匹配点,只要能找到一个就立即记录并返回不要再找了,如果这个找不到了,那么其实已经
找不到增广路了
所以对于一个新的起点A,它一定能找到一个匹配点B(除非它是一个孤立点一条边都没有),如果还没有被匹配过,那么它就据为己有,如果已经被匹配了,那么它还是据为己有,并且强行要求B之前的匹配点C另外找一个匹配点D。

而C找D的方法和A的方法是一样的,也就是说,C另外找的那个D如果没被匹配过,那么C据为己有,如果有了,还是据为己有,并且要求D之前的匹配点E去找新的匹配点………………(可以发现这是一个不断迭代的过程)

接上面的,如果C能找到D(准确来说是这个迭代的过程成功),那么说这次增广成功,并且这次增广结束,
新的匹配方案就是A-B,C-D(如果还有后续的迭代的话,就继续下去);否则的话,这次增广失败,B还是和原来的c匹配,A匹配失败,它只好找另一个和它相连的点B'',并且重复上面的操作

在每一递归的时候,若某一层返回了1,那么就会一直返回1,直到主函数中,但是某层返回了0,只是返回到上一层,并且继续寻找另一个匹配点,并且有可能成功,不一定一直返回0直到主函数

posted @ 2012-11-26 21:21  Titanium  阅读(207)  评论(0编辑  收藏  举报