HDOJ 1068 Girls and Boys

          题意:有男孩和女孩一共n个,给你一些关系对,表示他们会谈恋爱,求一个最大的子集,令其中的男孩女孩不会谈恋爱。

         输入:

3 ----男孩和女孩一共3个

0: (2) 1 2 ---- 0号与两个人会恋爱:1,2号

1: (1) 0 ---同上解释

2: (1) 0

分析题目是明显的二分图模型,但是输入没有指明那些是男孩/女孩。所以要拆点,把 i 拆成 i 跟 i' 分别放入X、Y,构造二分图。原先U = V - M,所以 2U = 2V - 2M。 分析:

        故U = n - M'/2。

代码:

#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 1010
int map[MAXN][MAXN],match[MAXN];
bool mark[MAXN];
int n;
bool DFS(int p)
{
     int i,t;
     for( i=0; i<n; i++){
          if( !mark[i]&&map[p][i]){
              mark[i]=true;
              t=match[i];
              match[i]=p;
              if( t==-1||DFS(t))
                  return true;
              match[i]=t; 
          }
     }
     return false;
}
int maxMah()
{
    int ans;
    ans=0;
    for(int i=0; i<n; i++){
            memset(mark,false,sizeof(mark));
            if( DFS(i))
                ans++;
    }
    return ans;
}
int main()
{
    int i,j,m,c;
    while( scanf("%d",&n)!=EOF){ 
           memset(map,0,sizeof(map));
           c=n;
           while( c--){
                  scanf("%d: (%d)",&i,&m);
                  while( m--){
                         scanf("%d",&j);
                         map[i][j]=1;
                  }
           }
           memset(match,-1,sizeof(match));
           printf("%d\n",n-maxMah()/2);
    }
    return 0;
}


你可能感兴趣的:(HDOJ 1068 Girls and Boys)