POJ 1466 Girls and Boys 最大独立集

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值