匈牙利算法---解决最大匹配问题
2013-10-31 22:24
344 查看
这是一种用增广路求二分图最大匹配的算法。
讲解的很详细的博客:https://www.byvoid.com/blog/hungary/
至于基础知识,我就不多讲了。其实它就是一直在找出一条路径能把二分图的左半部分的其中一个未匹配节点和右半部分的其中一个未匹配节点加入到已经匹配的节点中去。这就是关键。那个博客讲的很详细了。看了之后都知道是具体情况。
下面我根据自己的理解实现了一下这个算法(DFS方式)。
讲解的很详细的博客:https://www.byvoid.com/blog/hungary/
至于基础知识,我就不多讲了。其实它就是一直在找出一条路径能把二分图的左半部分的其中一个未匹配节点和右半部分的其中一个未匹配节点加入到已经匹配的节点中去。这就是关键。那个博客讲的很详细了。看了之后都知道是具体情况。
下面我根据自己的理解实现了一下这个算法(DFS方式)。
#include<iostream> using namespace std; #define MAX_NUM 1024 int Left=4; int Right=3; int vm[MAX_NUM];//节点对应的匹配节点 int edge[MAX_NUM][MAX_NUM];//左右部分连接情况 int count; bool isVisited[MAX_NUM];//每次找增广路的时候,都要对它进行重置 int index=0; void init() { memset(edge,0,sizeof(edge)); edge[0][4]=1; edge[0][6]=1; edge[1][6]=1; // edge[1][7]=1; edge[2][4]=1; edge[2][5]=1; edge[3][5]=1; edge[3][6]=1; } bool can(int m) { for(int i=Left;i<Left+Right;i++) { if(edge[m][i]) { if(isVisited[i]) continue; isVisited[i]=true; if(vm[i]==-1) { cout<<m<<"->"<<i<<" "; vm[m]=i; vm[i]=m; return true; } else { if(can(vm[i])) { vm[m]=i; vm[i]=m; cout<<m<<"->"<<i<<" "; return true; } } } } return false; } void main() { memset(vm,-1,MAX_NUM); init(); for(int i=0;i<Left;i++) { cout<<"第"<<index++<<"次为: "; memset(isVisited,0,sizeof(isVisited)); isVisited[i]=true; if(can(i)) count++; else cout<<"NULL"; cout<<endl; } cout<<count<<endl; }
相关文章推荐
- 匈牙利算法—解决二分图最大匹配问题
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题
- 匈牙利算法---解决最大匹配问题
- 二分图的基本概念+二分图的最大匹配问题(匈牙利算法)
- HDU 2063 过山车(二分图最大匹配问题,匈牙利算法)
- 二分图最大匹配问题之匈牙利算法
- 二分图的最大匹配问题(匈牙利算法)
- poj3041 最小点覆盖==二分图最大匹配 匈牙利算法求解最大匹配问题(运用DFS)
- 二分图最大匹配问题与匈牙利算法的核心思想
- 二分图最大匹配问题(匈牙利算法)
- 二分图最大匹配问题之匈牙利算法
- 【学会就脱单算法】匈牙利算法之飞行员配对问题(二分图最大匹配)
- POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现)
- HDU 2063 过山车 [匈牙利算法之最大匹配问题]
- 匈牙利算法——最大匹配问题详解
- 二分图最大匹配问题匈牙利算法
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)
- hdu5090 匈牙利算法二分图最大匹配问题
- 二分图的最大匹配问题(匈牙利算法)