HDU 1068
题目大意:
找出一个最大的集合使得该集合的任意两个人没有关系。
二分图匹配模板题
最大独立集=点数-最大匹配数
因为本题算出来的ans是最大匹配的两倍,所以应当输出n-ans/2
AC代码:
#include<iostream> #include<string.h> using namespace std; int ma[1001],used[1001],mp[1001][1001],n; int read(){ int f=1,ret=0; char c=getchar(); while (!isdigit(c)){ if (c=='-') f=-1; c=getchar(); } while (isdigit(c)) ret=ret*10+c-'0',c=getchar(); return ret; } bool solve(int now){ for (int i=0;i<n;i++){ if (mp[now][i] && !used[i]){ used[i]=1; if (ma[i]==-1 || solve(ma[i])){ ma[i]=now; return 1; } } } return 0; } int main(){ while(cin>>n){ memset(used,0,sizeof used); memset(ma,-1,sizeof ma); memset(mp,0,sizeof mp); for (int i=1;i<=n;i++){ int now=read(); int num=read(); for (int j=1;j<=num;j++){ int tmp=read(); mp[tmp][now]=1; } } int ans=0; for (int i=0;i<n;i++){ memset(used,0,sizeof used); ans+=solve(i); } cout<<n-ans/2<<endl; } return 0; }

浙公网安备 33010602011771号