您的位置:首页 > 其它

匈牙利算法 最大二分图匹配

2017-08-22 08:21 330 查看
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <set>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
#include <time.h>
// cout << "  ===  " << endl;

using namespace std;
typedef long long ll;
const int maxn = 500 + 7, INF = 0x3f3f3f3f, mod = 1e9+7;
int T, n;
int f[maxn][maxn], vis[maxn], ff[maxn];

struct node {
int h;
char x;
string m;
string s;
}r[maxn];

bool is_ok(node a, node b) {
if(abs(a.h - b.h) > 40) return true;
if(a.x == b.x) return true;
if(a.m != b.m) return true;
if(a.s == b.s) return true;
return false;
}

void init() {
memset(f, -1, sizeof f);
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d %c", &r[i].h, &r[i].x);
cin >> r[i].m >> r[i].s;
}
for(int i = 1; i <= n; ++i) {
for(int j = i+1; j <= n; ++j) {
if(is_ok(r[i], r[j])) f[i][j] = f[j][i] = 1;
else f[i][j] = f[j][i] = 0;
}
}
}

bool sol(int id) {
for(int i = 1; i <= n; ++i) {
if(f[id][i] == 0 && vis[i] == 0) {
vis[i] = 1;
if(ff[i] == 0 || sol(ff[i])) {
ff[i] = id;
return true;
}
}
}
return false;
}

void solve() {
memset(ff, 0, sizeof ff);
int cnt = 0;
for(int i = 1; i <= n; ++i) {
memset(vis, 0, sizeof vis);
if(sol(i)) cnt++;
}
cout << n-(cnt/2) << endl;
}

int main() {
scanf("%d", &T);
while(T--) {
init();
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: