基础算法学习---匈牙利算法(ntr算法)
原理
对二分图的一边进行匹配尝试,最后再次遍历统计成功次数
O(nm) //但是实际情况一般少于O(nm)
模板
#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int e[N],ne[N],h[N],idx; //邻接表
int n1,n2,m; //左右两边大小和操作次数
int match[N]; //右边指向左边
bool st[N]; //右边点状态
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++;
}
//是否匹配
bool find(int x){
for(int i = h[x];i != -1;i = ne[i]){
int j = ne[i];
if(!st[j]){
st[j] = true;
//未匹配或者下一个选项可以匹配
if(match[j] == 0 || find(match[j])){
match[j] = x;
return true;
}
}
}
return false;
}
int main(){
cin >> n1 >> n2 >> m;
memset(h,-1,sizeof h);
for(int i = 0;i < m;i ++){
int a,b;
cin >> a >> b;
add(a,b);
}
//确定匹配成功边数
int res = 0;
for(int i = 1;i <= n1;i ++){
memset(st,false,sizeof st);
if(find(i)) res ++;
}
cout << res;
}