【HDU - 1068】Girls and Boys (简单二分匹配)

Girls and Boys

 HDU - 1068 

大学二年级时,有人开始研究学生之间的浪漫关系。"浪漫关系"是一个女孩和一个男孩之间的定义。出于学习原因,有必要找出满足条件的最大设置:没有两个学生在设置谁已经"浪漫参与"。该计划的结果是学生人数在这样一组。
输入包含多个文本格式的数据
集。每个数据集代表一组

研究主题,描述如下:每个学生的描述学生
人数,以以下格式
student_identifier:(number_of_romantic_relations)student_identifier1 student_identifier2 student_identifier3。

student_identifier:(0)


student_identifier是 n 科目的 0 和 n-1 之间的整数。
对于每个给定的数据集,程序应编写到标准输出包含结果的行。

输入

7
0: (3) 4 5 6
1: (2) 4 6
2: (0)
3: (0)
4: (2) 0 1
5: (1) 0
6: (2) 0 1
3
0: (2) 1 2
1: (1) 0
2: (1) 0

输出

5
2

题意描述:多实例,给出学生人数,从0开始编号,然后是每个学生存在浪漫关系的其他学生人数,和这些学生编号,求所有学生中不存在浪漫关系的有多少对。

解题思路:本题没有说谁男谁女,所以我们定义的时候假设a男b女,a女b男(具体看代码,建议自己写一下数据,然后二分匹配,很容易就能看出来👀!!!),这个时候可能有部分会重复定义,然后去找可以相互匹配成功的人对数,因为我们要求的是不能匹配成功的人的对数,也就是求最大独立集(顶点-最大匹配/2)

AC:

#include<bits/stdc++.h>
using namespace std;
#define N 1500
int e[N][N], match[N],book[N];
int k;
bool find(int x)
{
	for(int i=0;i<k;i++)//人的编号 
	{
		if(!book[i]&&e[x][i])
		{
			book[i]=1;
			if(!match[i]||find(match[i]))
			{
				match[i]=x;
				return true;
			}
		}	
	}
	return false;
}
int main(void)
{
	int m,n,a;
	while(~scanf("%d",&k))
	{	
		memset(e,0,sizeof(e));
		memset(match,0,sizeof(match));
		for(int i=1;i<=k;i++)
		{
			scanf("%d: (%d)",&m,&n);//某人、有多少个关系好的 
			while(n--)
			{
				scanf("%d",&a);//某人玩的好的人编号 
				e[m][a]=1;//不知道谁男谁女 
				e[a][m]=1; 			
			}
		}
		int ans=0;
		for(int i=0;i<k;i++)
		{
			memset(book,0,sizeof(book));
			if(find(i))
				ans++;
		}
		printf("%d\n",k-ans/2);//找几对没有好友的,即最大独立集(顶点-最大匹配/2) 
		
	}
	
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值