首页 > 代码库 > Girls and Boys(poj 1466)

Girls and Boys(poj 1466)

题目描述:

   给出一系列男女配对意愿信息。求一个集合中的最大人数,满足这个集合中两两的人不能配对。

/*
  二分图的最大独立集
  因为没有给出具体的男生和女生,所以可以将数据扩大一倍,即n个男生,n个女生,
  根据定理,最大独立集=总数-匹配数(本题应该除以2) 
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 510
using namespace std;
int a[N][N],used[N],belong[N],n;
bool find(int i)
{
    for(int j=1;j<=n;j++)
      if(a[i][j]&&!used[j])
      {
          used[j]=1;
          if(!belong[j]||find(belong[j]))
          {
              belong[j]=i;
              return true;
        }
      }
    return false;
}
void work()
{
    for(int i=1;i<=n;i++)
    {
        int x,m;scanf("%d: (%d)",&x,&m);x++;
        for(int j=1;j<=m;j++)
        {
            int y;scanf("%d",&y);y++;
            a[x][y]=a[y][x]=1;
        }
    }
    int tot=0;
    for(int i=1;i<=n;i++)
    {
        memset(used,0,sizeof(used));
        if(find(i))tot++;
    }
    printf("%d\n",n-tot/2);
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        memset(belong,0,sizeof(belong));
        work();
    }
    return 0;
}

 

Girls and Boys(poj 1466)