匈牙利算法(二分图匹配)模板
2015-08-21 20:52
253 查看
在复杂度允许的范围下可以用最大流代替匈牙利算法
bool map[maxn][maxm]; //map[x][y]=true表示点x和点y有边相连 bool road[maxm]; //road[i]记录点i是否已在当前增广路中,防止死循环 int link[maxm]; //link[i]记录增广路上与i相连的前一个节点的编号,即记录已求出的匹配,简单的说link[i]用于记录匹配集合中的边 bool find(int v) //find查找从v点出发是否有可增广路 { int i; for(i=1; i<=m; i++) //可用邻接链表,枚举在下半部分图中与v点相关联的点 { if(map[v][i]&&(!road[i])) //如果该点不在增广路上 { road[i]=true; //把i标记为已讨论,防止死循环 if(link[i]==0||find(link[i])) //i是未匹配点(未盖点)或者从i的匹配点出发有可增广路 { link[i]=v; //修改与i匹配的点为v return true; //则从v出发可找到增广路,返回true } } } return false; //如果从v出发没有增广路,返回false } int main() { //read the graph into array map[] //首先读入图结构到map数组中 for(i=1; i<=n; i++) //依次从上半部图的点出发,寻找增广路 { for(j=1; j<=m; j++)road[j]=false; if(find(i))tot++; //每找到一条增广路,匹配数加1(最多n个匹配) } printf("%d", tot); //输出最大匹配数 }
相关文章推荐
- CodeForces 478B 第八次比赛 B题
- Android VLC 编译总结
- zzdd自留地
- 自己建工具类
- 九度OJ 题目1207:质因数的个数
- 从零开始学Java自己利用接口和集合框架做的简单图书管理系统
- 推送通知流程
- C语言之 进制转换(循环)
- Window
- 获取Delphi所有类的类信息
- android定位服务
- jquery-ui日期时间控件实现
- 如何寻找“真爱”型合伙人
- 讲讲我在Windows10(uwp)开发中遇到的一些坑.
- Codeforces Round #315 (Div. 2) A. Music 解题心得
- hdu 3336 Count the string(next数组)
- SimpleDateFormat使用详解
- 对梯度幅值进行非极大值抑制
- initWithNibName、initWithCoder、awakeFromNib和 loadNibNamed详解
- private和public的问题