匈牙利算法
2016-06-24 20:22
288 查看
匈牙利算法的原理很简单,就是:随便找个位置,如果位置上被匹配了,让该位置的占有者去找另一个位置,该位置的占有者找不到才占回原来的位置。
还是举个例子,会容易理解些:
现在有五个人A、B、C、D、E和四个座位,每个人都想找个座位休息,但每个人都很挑剔,只喜欢某个桌位。
A只想坐1、3号位,B只想坐1、2号位,C只想坐1、3号位,D只想坐3号位,E只想坐4号位。
他们按照循序选择座位
首先A选择了1号位,
接着B想选择1号位,但被A坐了。于是B让A去找一个新的座位,A选择了3号位。A找到了新座位,所以B选择了1号位。
到了C,C想选择1号位,但被B坐了。于是C让B去找一个新的座位,B选择了2号位。B找到了新座位,所以C选择了1号位。
轮到D,D想选择1号位,但被A坐了。于是D让A去找一个新的座位,A想选择了1号位,但被C坐了。于是A让C去找一个新的座位,C只能去找3号位了,但3号位又被D坐了,D也没别的位坐了。C找到了A,让他把座位还回来。A再去找D,让他把座位还回来。最后,D没找到座位。
接着口味独特的E选择了4号位。
可怜的D。
原理大概就是这样了。
还是举个例子,会容易理解些:
现在有五个人A、B、C、D、E和四个座位,每个人都想找个座位休息,但每个人都很挑剔,只喜欢某个桌位。
A只想坐1、3号位,B只想坐1、2号位,C只想坐1、3号位,D只想坐3号位,E只想坐4号位。
他们按照循序选择座位
首先A选择了1号位,
接着B想选择1号位,但被A坐了。于是B让A去找一个新的座位,A选择了3号位。A找到了新座位,所以B选择了1号位。
到了C,C想选择1号位,但被B坐了。于是C让B去找一个新的座位,B选择了2号位。B找到了新座位,所以C选择了1号位。
轮到D,D想选择1号位,但被A坐了。于是D让A去找一个新的座位,A想选择了1号位,但被C坐了。于是A让C去找一个新的座位,C只能去找3号位了,但3号位又被D坐了,D也没别的位坐了。C找到了A,让他把座位还回来。A再去找D,让他把座位还回来。最后,D没找到座位。
接着口味独特的E选择了4号位。
可怜的D。
原理大概就是这样了。
//xyl[j]表示第j个位置被谁占有。 //used[j]表示第j个位置是否被查看过,如果被查看过,显然就不再去查看了(在每一次进行匈牙利时,把used赋值为true)。 bool find(int x) { int i,j,k,l; for(i=last[x];i;i=next[i]) { j=to[i]; if(used[j]) { used[j]=false; if(xyl[j]==0 || find(xyl[j])) { xyl[j]=x; return true; } } } return false; }
相关文章推荐
- 牛客网编程题:数组中缺失的最小正整数
- git版本管理
- Java的快速I/O
- 一周乱弹(0624 1,maven 添加依赖包.2,sqlserver 删除语句.3..OutOfMemoryError: PermGen space。4,SQL datediff (时间差)
- android实现登录一次,之后不需要登录的方法token,session,sharedpreference
- Pascal Mouse单元
- 作业
- NYOJ71 独木舟上的旅行
- gdb-在GDB中[Ctr+D]和[Ctr+C]的区别
- java计算参数目录大小的递归和迭代实现
- 关于iOS启动图片和AppIcon
- 每天一个Linux命令(09)--touch命令
- myeclipse2016导入maven工程配置文件提示dubbo报错解决
- BZOJ 1927 星际竞速
- 小型电话本
- 最新版FusionCharts3D饼图
- centos 手动升级系统内核
- hdu 2674 n!余数 (找规律)
- 欢迎使用CSDN-markdown编辑器
- 黑马程序员-多线程-在android开发中经常会遇到从子线程切换到主线程,但是频繁地切换会使代码变得很臃肿,也不好维护,想请教一下各位大牛都是怎么处理的?