hdu1068 Girls and Boys (二分图最大独立集)

来源:互联网 发布:sql offset 编辑:程序博客网 时间:2024/05/09 19:01

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068


#include <stdio.h>  #include <string.h>  #define MAXN 1002  int map[MAXN][MAXN];  int from[MAXN],used[MAXN];  //二分图最大独立集 = 顶点数 -  二分图最大匹配int match(int x,int n)//匈牙利算法{  int i;  for(i=0;i<n;++i)//被匹配的男生    {  if(!used[i]&&map[x][i])  {  used[i]=1;  if(from[i]==-1||match(from[i],n))  {  from[i]=x; //男生[i]属于女生x  return 1;  }  }  }  return 0;  }  int main()  {  int k,n,m,sum,i,j;  while(scanf("%d",&n)!=EOF)  {  memset(map,0,sizeof(map));  memset(from,-1,sizeof(from));  sum=0;  for(k=0;k<n;++k){scanf("%d: (%d)",&i,&m);while(m--){scanf("%d",&j);map[i][j]=1;}}for(i=0;i<n;++i)//女生去匹配男生    {  memset(used,0,sizeof(used));  if(match(i,n))  ++sum;  }  printf("%d\n",n-sum/2);  }  return 0;  }  




#include <cstdio>#include <cstring>#include <vector>#define MAXN 1001using namespace std;vector<int> mp[MAXN];int from[MAXN],used[MAXN],n;int find(int x){int temp,size;size=mp[x].size();for(int i=0;i<size;++i){temp=mp[x][i];if(!used[temp]){used[temp]=1;if(from[temp]==-1||find(from[temp])){from[temp]=x;return 1;}}}return 0;}int main(){int k,n,m,sum,i,j;    while(scanf("%d",&n)!=EOF)    {for(i=0;i<=n;++i)mp[i].clear();memset(from,-1,sizeof(from));    sum=0;    for(k=0;k<n;++k)  {  scanf("%d: (%d)",&i,&m);  while(m--)  {  scanf("%d",&j);  mp[i].push_back(j);}  }  for(i=0;i<n;++i)//女生去匹配男生      {    memset(used,0,sizeof(used));    if(find(i))    ++sum;    }    printf("%d\n",n-sum/2);    }    return 0;  }