Cat vs. Dog
解法:最大独立集=顶点数 - 最大匹配。有矛盾的连上一条边,然后我是跑了一遍匈牙利求最大匹配
#include <iostream>
using namespace std;
#include <stdio.h>
#include <string>
#include <cstring>
string a[600][2];
bool flag[510];
int n, m, c, d, data[510][510], f[510], ans;
bool find(int x) {
for(int i = 1; i <= n; i++) {
if (data[x][i] == 1 && !flag[i]) {
flag[i] = true;
if (f[i] == 0 || find(f[i])) {
f[i] = x;
f[x] = i;
return true;
}
}
}
return false;
}
int main() {
int tt;
cin >> tt;
while (tt--) {
cin >> c >> d >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i][0];
cin >> a[i][1];
}
memset(data, 0, sizeof(data));
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++)
for (int j = i+1; j <= n; j++) {
if (a[i][0] == a[j][1] || a[i][1] == a[j][0]) {
data[i][j] = 1;
data[j][i] = 1;
}
}
ans = 0;
for (int i = 1; i <= n; i++) if (f[i] == 0) {
memset(flag, 0, sizeof(flag));
if (find(i)) ans++;
}
cout << n-ans << endl;
}
}