POJ 1466 Girls and Boys
题意:根据给出的数据,可以得出点与点之间的关系,如果两个不同集合中的点有一条关联线的话,那就证明他们有关系,否则就没有关系,题目让我们求的是从这n个点中,找出m个点,这m个点中两两之间没有关联关系。求m的最大值 。
最大独立集点数 = n-最大匹配数。
最大独立数 = 未匹配的节点+匹配数/2;
未匹配的节点数 = 顶点数 - 匹配数;
得出 : 最大独立数 = 顶点数 - 匹配数/2;-------> 结论推导来源
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
const int maxn=1000;
int n,m,res;
int num[maxn],vis[maxn],form[maxn];
int g[maxn][maxn];
bool find(int x)
{
for(int i=0;i<n;i++)
{
int v=g[x][i];
if( v && vis[i]==0)
{
vis[i]=1;
if(form[i]==-1 || find(form[i]))
{
form[i]=x;
return true;
}
}
}
return false;
}
int Hungary()
{
memset(form,0xff,sizeof(form));
int all=0;
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i))
all++;
}
return all;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(g,0,sizeof(g));
for(int p=0;p<n;p++)
{
scanf("%d: (%d) ",&m,&res);
for(int i=0;i<res;i++)
{
int k;
scanf("%d",&k);
g[m][k]=1;
}
}
int ans=Hungary();
printf("%d\n",n-ans/2);
}
return 0;
}