You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.7 KiB

2 years ago
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
/*
-
*/
const int N = 210;
int g[N][N];
int n, m, e;
int match[N], st[N]; // match表示女生喜欢的男生st表示女生是否被匹配到
int dfs(int u) {
for (int i = 1; i <= m; i++) {
if (!g[u][i] && !st[i]) {
st[i] = 1;
if (match[i] == -1 || dfs(match[i])) {
match[i] = u;
return 1;
}
}
}
return 0;
}
int main() {
int cas = 0;
while (~scanf("%d%d%d", &n, &m, &e)) {
cas++;
if (n == 0 && m == 0 && e == 0) break;
// 初始化匈牙利算法匹配数据
memset(match, -1, sizeof match);
// 邻接矩阵
memset(g, 0, sizeof g); // g[i][j]=1:表示i与j互相了解
while (e--) {
int a, b;
scanf("%d%d", &a, &b);
g[a][b] = 1;
}
int ans = 0;
// 枚举集合A中的点n为集合A中点的个数即男生的个数
for (int i = 1; i <= n; i++) {
// 这里每次都需要全部清0
memset(st, 0, sizeof st);
if (dfs(i)) ans++;
}
// 最大独立集
printf("Case %d: %d\n", cas, n + m - ans);
}
return 0;
}