这道题又无耻的抄袭了别人的代码。
刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集。
最大独立集=|G|-最大匹配。
首先先把性别分开,因为同性不能成为couple,然后把符合条件的异性连一起,然后就是最大匹配了。
#include<stdio.h> #include<string.h> #define maxn 505 #define maxl 106 struct Person { int h; char music[maxl]; char sport[maxl]; } male[maxn], female[maxn]; int uN, vN, n; bool g[maxn][maxn]; int visit[maxn],match[maxn]; int abs(int x) { if(x<0) return -x; return x; } int DFS(int u) { for(int i=0;i<vN;i++) if(!visit[i]&&g[u][i]) { visit[i]=1; if(match[i]==-1 || DFS(match[i])) { match[i]=u; return 1; } } return 0; } int MaxMatch() { memset(match,-1,sizeof(match)); int ans=0; for(int i=0;i<uN;i++) { memset(visit,0,sizeof(visit)); if(DFS(i)) ans++; } return ans; } void input() { scanf("%d", &n); uN = vN = 0; for (int i = 0; i < n; i++) { int a; char sex[3]; scanf("%d%s", &a, sex); if (sex[0] == 'M') { male[uN].h = a; scanf("%s%s", male[uN].music, male[uN].sport); uN++; } else { female[vN].h = a; scanf("%s%s", female[vN].music, female[vN].sport); vN++; } } } bool couple(int a, int b) { if (abs(male[a].h - female[b].h) > 40) return false; if (strcmp(male[a].music, female[b].music)) return false; if (strcmp(male[a].sport, female[b].sport) == 0) return false; return true; } void make() { memset(g, 0, sizeof(g)); for (int i = 0; i < uN; i++) for (int j = 0; j < vN; j++) if (couple(i, j)) g[i][j] = true; } int main() { int t; scanf("%d", &t); while (t--) { input(); make(); printf("%d ", n - MaxMatch()); } return 0; }