这是一个对于二分图的匹配问题
首先是有两组点之间有关系连接
任务是找到一一匹配时的最大匹配数量
比如有
组一1 2 3
组二4 5 6
现在有1-5 1-6 2-5 3-4
在进行匈牙利算法模拟的时候,我们可以选择任意一组进行枚举,对于组内的每一个点,我们用dfs搜索他在另一组中的匹配点,一旦找到就返回匹配成功,对于这组数据,首先是1和5匹配,但在2寻找匹配时发现,5已经匹配过了(通过另开一个match数组来保存组二中各个点的匹配点),这样就可以模拟去find(match[x]),来寻找下一个点,于是会从1中去找下一个未匹配的点(match[x]=0),如果找到就将原先match[x]的匹配点给到另一个点,当前2所匹配到的5就可以进行匹配,然后进行下一个点的匹配。
#include<bits/stdc++.h>
using namespace std;
const int N =100010,M = N*2;
int n,m,k;
int h[N],e[M],ne[M],cnt;
int match[N];
bool st[N];
void add(int a,int b){
e[cnt] = b,ne[cnt] = h[a],h[a] = cnt++;
}
bool find(int x){
for(int i = h[x];~i ;i = ne[i]){
int j = e[i];
if(!st[j]){
st[j] = 1;
if(match[j] == 0 || find(match[j])){
match[j] = x;
return true;
}
}
}
return false;
}
int main(){
memset(h,-1,sizeof h);
cin >> n >> m >> k;
for(int i = 1; i <= k; i++){
int a,b;
cin >> a >> b;
add(a,b);
}
int ans = 0;
//if(n > m)swap(n,m);单向边千万别乱搞
for(int i = 1; i <= n ; i++){
memset(st,0,sizeof st);
if(find(i))ans++;
}
cout << ans << endl;
return 0;
}