题意:有男孩和女孩一共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;
}