poj 2771 Guardian of Decency----二分图求 最大覆盖集

来源:互联网 发布:spring书籍推荐 知乎 编辑:程序博客网 时间:2024/06/06 02:00

二分图求 最大覆盖集。。


•把人抽象成点,两个人很可能在一起则在他们之间连一条边。
•同性别不怎么可能在一起,故这是一个二分图。
•选尽可能多的点,使得选的点之间无边。
•最大独立集。
#include<iostream>#include<string.h>#include<cmath>using namespace std;bool edge[510][510],visited[510];int cx[510],cy[510];int n,m,k;int t1,t2;int M[510],F[510];struct node{int h;char sex;char mus[20],spo[20];}p[510];int path(int u){int v;for(int v=0;v<t2;v++)if(edge[u][F[v]]&&!visited[F[v]]){visited[F[v]]=1;if(cy[F[v]]==-1 || path(cy[F[v]])){cx[u]=F[v];cy[F[v]]=u;return 1;}}return 0;}int maxmatch(){int res=0;memset(cx,-1,sizeof(cx));memset(cy,-1,sizeof(cy));for(int i=0;i<t1;i++){if(cx[M[i]]==-1){memset(visited,0,sizeof(visited));res+=path(M[i]);}}return res;}int main(){int t;int i,j;int a,b,c;scanf("%d",&t);while(t--){t1=0,t2=0;memset(edge,0,sizeof(edge));scanf("%d",&n);for(i=1;i<=n;i++){cin>>p[i].h>>p[i].sex>>p[i].mus>>p[i].spo;if(p[i].sex=='M')M[t1++]=i;elseF[t2++]=i;}for(i=0;i<t1;i++)for(j=0;j<t2;j++)if(abs(p[M[i]].h-p[F[j]].h)>40 || strcmp(p[M[i]].mus,p[F[j]].mus)!=0 || strcmp(p[M[i]].spo,p[F[j]].spo)==0)edge[M[i]][F[j]]=0;elseedge[M[i]][F[j]]=1;printf("%d\n",n-maxmatch());}return 0;}