匈牙利_ACM模板
题目描述
第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000,1<=N 和M<=500.
接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做。
输出:一个整数,表示可以坐上过山车的最多组合数。
const int maxn = 505;//N的上限
int dp[maxn][maxn];//dp[i][j]=1:表示女生i愿意和男生j做伙伴
int girl[maxn];//girl[i]=x:表示男生i目前的伙伴是女生x(初始值为0)
int vis[maxn];//vis[i]=1:男生i已经被遍历过。
int k, m, n;//第一行的输入
void reset() {//重置、初始化
memset(dp, 0, sizeof(dp));
memset(girl, 0, sizeof(girl));
}
bool fin(int x) {//寻找女生x是否能有男生和她做伙伴,如果有返回ture
for (int j = 1; j <= n; j++) {
if (dp[x][j] == 1 && vis[j] == 0) {
vis[j] = 1;
if (girl[j] == 0 || fin(girl[j])) {
girl[j] = x;
return true;
}
}
}
return false;
}
int xiongyl() {//返回能组合的最多组合数
int sum = 0;
for (int i = 1; i <= m; i++) {
memset(vis, 0, sizeof(vis));
if (fin(i)) {
sum++;
}
}
return sum;
}