题意: 一些男生和一些女生之间有爱慕关系,已知一些男生和女生的爱慕关系,学校想从这些学生中找出一些的学生满足这些学生之间彼此都没有爱慕的关系--!~,问找出的这个集合最多可以有多少人。
分析:求二分图的最大独立集
最大独立集=顶点数-最小点覆盖
由于这道题中爱慕关系是相互的,可以看成是无向图,可以将每个人拆成两个点
由于是无向图 ,最小点覆盖数=最大匹配/2
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) struct node { int to,next; }e[10000]; int tot; int head[505]; int v[505]; int link[505]; void add(int s,int u) { e[tot].to=u; e[tot].next=head[s]; head[s]=tot++; } int find(int x) { int i,k; for(i=head[x];i;i=e[i].next) { k=e[i].to; if(!v[k]) { v[k]=1; if(link[k]==0||find(link[k])) { link[k]=x; return 1; } } } return 0; } int main() { int res,a,b,n,m,i; while(scanf("%d",&n)!=EOF) { tot=1; clr(head); clr(link); for(i=0;i<n;i++) { scanf("%d: (%d)",&a,&m); while(m--) { scanf("%d",&b); add(a,b); } } res=0; for(i=0;i<n;i++) { clr(v); if(find(i)) res++; } printf("%d\n",n-res/2); } return 0; }