题意:大学二年级的时候,一些同学开始研究男女同学之间的缘分。研究者试图找到没有缘分同学的最大集。程序的结果是要输出这个集合中学生的数量。
解题思路:根据题意可将题目转化成求二分图的最大独立集=节点数—最大匹配数。题目中并没有指明男生女生,真正的匹配数因该是m/2,那么v=n-m/2.
代码:
#include<iostream>
using namespace std;
int n,m,che[500],g[500][500],match[500];
int dfs(int k)
{
int i,t;
for(i=0;i<=m;i++)
{
if(!che[i]&&g[k][i])
{
t=match[i];match[i]=k;che[i]=1;
if(t==-1||dfs(t)) return 1;
match[i]=t;
}
}
return 0;
}
int maxmatch()
{
int i,ans=0;
for(i=0;i<=n;i++)
{
memset(che,0,sizeof(che));
if(dfs(i)) ans++;
}
return ans;
}
int main()
{
int t;
int i,a,b,c;
while(scanf("%d",&t)!=-1)
{
n=t;m=t;
memset(g,0,sizeof(g));
memset(match,-1,sizeof(match));
while(t--)
{
scanf("%d: (%d)",&a,&b);
for(i=0;i<b;i++)
{
scanf("%d",&c);
g[a][c]=1;
}
}
printf("%d\n",n-(maxmatch()/2));
}
return 0;
}