Girls and Boys
大学二年级时,有人开始研究学生之间的浪漫关系。"浪漫关系"是一个女孩和一个男孩之间的定义。出于学习原因,有必要找出满足条件的最大设置:没有两个学生在设置谁已经"浪漫参与"。该计划的结果是学生人数在这样一组。
输入包含多个文本格式的数据
集。每个数据集代表一组
研究主题,描述如下:每个学生的描述学生
人数,以以下格式
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;
}