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

来源:互联网 发布:淘宝橱窗位怎么设置 编辑:程序博客网 时间:2024/05/14 12:03
#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;}

原创粉丝点击