这个题是给你一些限制条件,满足限制条件的人不可以出现在一起,其实分析后就是求最大点独立集,解法就是点数减去最小覆盖集,由于这里存在性别,所以为二分图匹配。
我建图的时候出了不少问题,最开始忽略了性别问题,导致WA
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; const int maxn=510; const int maxm=4e5; struct Node { int height; char sex[101]; char music[110]; char PE[110]; int id; }a[maxn]; int n,e,head[maxn],pnt[maxm],nxt[maxm],link[maxn]; bool S[maxn],T[maxn]; void AddEdge(int u,int v) { pnt[e]=v;nxt[e]=head[u];head[u]=e++; } bool match(int u) { S[u]=1; for(int i=head[u];i!=-1;i=nxt[i]) if(!T[pnt[i]]) { T[pnt[i]]=1; if(!link[pnt[i]]||match(link[pnt[i]])) { link[pnt[i]]=u; return true; } } return false; } bool check(int i,int j) { if(abs(a[i].height-a[j].height)>40||strcmp(a[i].music,a[j].music)||!strcmp(a[i].PE,a[j].PE)) return false; return true; } int main() { int cas; scanf("%d",&cas); while(cas--) { e=0; memset(head,-1,sizeof(head)); memset(link,0,sizeof(link)); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%s%s%s",&a[i].height,&a[i].sex,&a[i].music,&a[i].PE); for(int i=1;i<=n;i++) { if(a[i].sex[0]=='F') continue; for(int j=1;j<=n;j++) if(a[j].sex[0]=='F'&&check(i,j)) AddEdge(i,j); } int ans=0; for(int i=1;i<=n;i++) { memset(S,0,sizeof(S)); memset(T,0,sizeof(T)); if(match(i)) ans++; } printf("%d\n",n-ans); } return 0; }