题意: 给你 n 个人,和四个条件,两个人只要满足其中任意一个条件就不能成为夫妻,
问从中最多能找出多少人使得他们任意两个人都不可能成为夫妻。
分析: 二分图最大独立权集,把男的放到一个集合 ,女的放到另一个几何,二分该图,
如果两个人能成为夫妻,则他们构成一个匹配,找出最大匹配,最大独立全集即为
总人数 - 最大匹配
View Code
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) struct node { int to,next; }q[200005]; int head[505]; int tot; void add(int s,int u) { q[tot].to=u; q[tot].next=head[s]; head[s]=tot++; } struct per { int h; char x[3]; char mu[103]; char pe[103]; }p[505]; int link[505]; int v[505]; int find(int x) { int i,k; for(i=head[x];i;i=q[i].next) { k=q[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } int abs(int x) { return x>0?x:-x; } int ok(per a,per b) { if(abs(a.h-b.h)>40) return 0; if(strcmp(a.mu,b.mu)) return 0; if(strcmp(a.pe,b.pe)==0) return 0; return 1; } int main() { int n,t,i,j,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); tot=1; clr(head); clr(link); for(i=1;i<=n;i++) scanf("%d%s%s%s",&p[i].h,p[i].x,p[i].mu,p[i].pe); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(p[i].x[0]=='F'&&p[j].x[0]=='M'&&ok(p[i],p[j])) add(i,j); sum=0; for(i=1;i<=n;i++) { clr(v); if(p[i].x[0]=='F'&&find(i)) sum++; } printf("%d\n",n-sum); } return 0; }