二分图匹配
有两个集合A,B
现在知道A中的某些元素可以和B中的某些元素连接(同一个元素可能可以连接多个元素)
现要求最大的匹配数(最多有多少对Ax和Bx可以完成匹配)
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 1005;
int A,B,T; //A中的与B中的匹配
int pre[maxn]; //代表Bi匹配的A中的元素
int flag[maxn]; //标记Bi访问过
int m[maxn][maxn]; //邻接矩阵,代表A与B哪些可以连接
int match(int cur){ //cur为当前的A
for(int i = 1;i <= B;i++){ //遍历B
if(m[cur][i] && !flag[i]){ //如果可以连接且Bi暂时没有连接
flag[i] = true; //暂时连接
if(!pre[i]||match(pre[i])){ //Bi没有连接 或者连接过但是可以把和Bi连接的分配给另一个
pre[i] = cur; //让Bi和cur连接
return true; //cur匹配成功
}
}
}
return false;
}
int main()
{
int i,j; //建图用
cin >> A >> B; //A和B的数量
cin >> T; //有T组可以匹配
while(T--){
cin >> i >> j;
if(i<=A&&j<=B) //确保范围真确
m[i][j] = 1;
}
int sum = 0;
for(int i = 1;i <= B;i++){
memset(flag,0,sizeof(flag));
sum += match(i);
}
cout << sum << endl;
return 0;
}