二分图最大匹配(匈牙利算法)
来源:互联网 发布:sql参考手册 编辑:程序博客网 时间:2024/04/29 18:57
文字与图来自:http://blog.csdn.net/cdy1206473601/article/details/77387334
讲解
匈牙利算法,(俗称“找妹子算法”),是一种求二分图最大匹配的常用算法。
为什么叫“找妹子算法”呢?
这是因为它的实现原理很像在找妹子:
首先,我们把一堆点分成两边(这才是“二分”,不是真正的“二分”):
男女生两个点之间连一条线表示他们互相喜欢
现在我们要求尽量每个人都找到妹子的最大匹配。
我们首先看,Boy1(我们以后都这样称呼),首先看一下Girl5:“还是单身,不错不错,好了,就是她了!”
于是,Girl5就有男朋友Boy1了。(我们把它标红)
然后轮到Boy2了,当然首选Girl5,但是Girl5说:“我已经有男朋友了Boy1了,你如果要我,就把他踢掉吧。”
于是Boy2就把Boy1踢掉了,Boy1很伤心,就去找别的,但是发现没有看得上的了,所以就又回来把Boy2踢掉了。Boy2就不可能选Girl5了,我们把它表示绿:
Boy2只好找下一个,结果没有了,就很伤心,找不到女朋友了。
然后到Boy3了,他同样找到了Girl6做女朋友:
到Boy4了,他首先看中了Girl6,于是同样去把Boy3踢走,于是Boy3很爽快的让给了他,“看你这么可怜,让给你吧。”,于是又去找了Girl8.
最终Boy2和Girl7没有了对象,只好不匹配了。
原理就是这样。
总结:每次找可以与当前点匹配的点,如果它被别人选了,就让别人去找另一个,自己占有它,如果别人没了,就换一个(因为我们要最大匹配)。直到全部匹配完为止。
代码如下,只是核心代码:
bool love[max][max];bool use[max];int girl[max];bool dfs(int v){ int i; for(i=m+1;i<=n;i++){//girl编号m+1~n;boy编号1~m; if(lave[v][i]&&!use[i]){ use[i]=true; if(girl[i]==0||dfs(girl[i])){//强调这是或||,不是&& girl[i]=v;//girl i 与 boy v 配对; return true; } } } return false; } int main(){ for(int i=1;i<=n;i++){ memset(use,0,sizeof(use)) ; if(dfs(i)) ans++;//ans就是最大匹配数 } }
原博客代码:
bool Matching(int x){ int i,xx,p; for (i=1;i<=m;++i) { if (bz[i]==false) { bz[i]=true; p=las[i]; las[i]=x;//las表示这个点的前驱。 if (p==0||Matching(p)) return true; las[i]=p; } } return false;}
阅读全文
0 0
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 匈牙利算法(二分图最大匹配)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 二分图最大匹配(匈牙利算法)
- 匈牙利算法(二分图最大匹配)
- 二分图最大匹配算法-匈牙利算法
- (算法)二分图的最大匹配(匈牙利算法)
- 图算法之:匈牙利算法(最大二分匹配)
- 图算法之:匈牙利算法(最大二分匹配)
- 图算法之:匈牙利算法(最大二分匹配)
- 最大二分图匹配(匈牙利算法)
- 数字翻转
- Linux(Cent OS7.2)下启动停止memcached方法及ps命令使用讲解
- pycharm2017.2.1中的修改工程文见列表的名字的字体大小以及文件列表的背景颜色
- 【物联网安全】应用层(安全、服务层)对终端设备的标识管理服务
- 【HTML5学习笔记】31:CSS3变形效果 上
- 二分图最大匹配(匈牙利算法)
- LeetCode之3. Longest Substring Without Repeating Characters
- PP代码生成器(四) 使用解决方案生成代码
- 数学逻辑习题集(1)
- Android WebView缓存机制详解
- Leetcode
- SQL server视频总结
- hdu 1251
- 进程创建通知回调通知例程的学习笔记