题目链接:
POJ 1466 Girls and Boys
题意:
有n位学生,每位学生会和其他学生有“浪漫关系”,找到一个最大集合使得集合中的学生任意两个都不存在浪漫关系。
分析:
最大独立点集。有公式:
最大独立点集=点数量-最大匹配数
这题输入有毒。
每行的开始不一定是0,1,2,3…依次输入,太尴尬了!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <ctime>
#include <cassert>
#include <vector>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0)
using namespace std;
const int MAX_N=510;
int n;
int match[MAX_N],used[MAX_N];
vector <int> edge[MAX_N];
inline void init()
{
for(int i=0;i<n;i++){
edge[i].clear();
}
}
inline int dfs(int x)
{
used[x]=1;
for(int i=0;i<edge[x].size();i++){
int u=edge[x][i],w=match[u];
if(w<0||(!used[w]&&dfs(w))){
match[u]=x;
match[x]=u;
return 1;
}
}
return 0;
}
int main()
{
freopen("N.in","r",stdin);
while(~scanf("%d",&n)){
init();
for(int i=0;i<n;i++){
int id,num,t;
scanf("%d: (%d)",&id,&num);
for(int j=0;j<num;j++){
scanf("%d",&t);
edge[id].push_back(t);
}
}
int res=0;
memset(match,-1,sizeof(match));
for(int i=0;i<n;i++){
memset(used,0,sizeof(used));
if(match[i]==-1) res+=dfs(i); //res是最大匹配对数
}
//printf("res=%d\n",res);
int ans=n-res;
printf("%d\n",ans);
}
return 0;
}