题意:这里先吐槽下题意,看了好久没看明白,偷偷百度的才知道题意,一共有n个人,男生和女生之间呢有恋爱关系。给你一系列恋爱的关系,但是你不知道谁是男生谁是女生。问你求一个集合,这个集合中的人不存在恋爱关系,求最大人数。
解法:二分图匹配,把最大的恋爱关系对数求出来,然后除以2,因为1-2,2-1,被算作2组,实际是一组,所以用总人数减去恋爱人数就是不存在恋爱关系的集合。
如果还是不明白看这里
http://blog.youkuaiyun.com/weyuli/article/details/9621973
他题意解释的很好。。
我再贴下自己的代码
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define LL __int64
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0xfffffff
#define pi 2*acos(0.0)
#define mod 10007
using namespace std;
int ma[509][509];
int n;
int a[1009];
int k[1009];
int g[1009][1009];
bool dfs(int x)
{
for(int i = 0; i<n; i++)
{
if(g[x][i]&&!k[i])
{
k[i] = 1;
if(a[i]==-1||dfs(a[i]))
{
a[i] = x;
return true;
}
}
}
return false;
}
int main()
{
int sum;
int num;
int xx,yy,zz;
string str;
while(~scanf("%d",&n))
{
getchar();
memset(g,0,sizeof(g));
memset(a,-1,sizeof(a));
for(int i = 0; i<n; i++)
{
scanf("%d: (%d)",&num,&xx);
for(int k=1;k<=xx;k++)
{
scanf("%d",&yy);
g[i][yy] = 1;
}
}
sum = 0;
for(int i = 0;i<n;i++)
{
memset(k,0,sizeof(k));
if(dfs(i))
{
sum++;
}
}
int ans = n - sum/2;
printf("%d\n",ans);
}
return 0;
}
本文介绍了一种利用二分图匹配算法解决特定问题的方法:即在一个未知性别的人群中找出最大数量的互不恋爱的个体集合。通过构建二分图并使用深度优先搜索实现匈牙利算法来最大化匹配数,最终得出答案。
1343

被折叠的 条评论
为什么被折叠?



