匈牙利算法
匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于
简介:
设
如果一个匹配中,
概念:
在介绍匈牙利算法之前还是先提一下几个概念,下面
若
- 重复
2 操作直到找不出增广路径为止
复杂度:
时间复杂度邻接矩阵:最坏为
空间复杂度 邻接矩阵:
标程:
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
vector<int>tu[1003];
bool bf[1003];
int match[1003];
int n,m,e,x,y,ans;
bool dfs(int pos) {
for(register int i=0; i^tu[pos].size(); ++i) {
if(!bf[tu[pos][i]]) {
bf[tu[pos][i]]=1;
if(!match[tu[pos][i]]) {
match[tu[pos][i]]=pos;
return 1;
} else if(dfs(match[tu[pos][i]])) {
match[tu[pos][i]]=pos;
return 1;
}
}
}
return 0;
}
int main() {
scanf("%d%d%d",&n,&m,&e);
while(e--) {
scanf("%d%d",&x,&y);
if(x<=n&&y<=m) {
tu[x].push_back(y);
}
}
while(n) {
memset(bf,0,sizeof(bf));
if(dfs(n)) {
ans++;
}
n--;
}
printf("%d",ans);
return 0;
}