您的位置:首页 > 其它

HDU 1068 Girls and Boys (匈牙利算法 二分图的最大独立集数 )

2014-07-28 22:32 381 查看
题目大意:给出n个学生,给出每个学生都对谁有意思,然后问的是尽量多的配对的情况下,最多能剩几个光棍(这里剩几个的意思是剩下的人加上每对陪过对的人抽出来一个人,因为他们只对对方情有独钟,拉出来一个不管剩下的人的好坏都是不愿意和他们配对的)

读懂了题意,就可以知道这是个求最大独立集数的题

Sample Input

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


Sample Output

5
2


输入数据的意思就是 第一个人(id 0)对3个人有意思 4 5 6

题目链接:点击打开链接

代码注释:

<span style="font-size:18px;color:#ff6600;"><strong>#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

#define N 505
int a

,visit
,link
;
int n;

int dfs(int i)
{
for(int j=0; j<n; j++)//扫描每个妹子
{
if(a[i][j]&&!visit[j])//没有相亲成功
{
visit[j]=1;
if(link[j]==-1||dfs(link[j]))//没有对象,或者找其他对象也能凑活,来给新来的哥们腾位置
{
link[j]=i;
return 1;
}
}
}
return 0;
}

int hungary()
{
int sum=0;
memset(link,-1,sizeof(link));
for(int i=0; i<n; i++)
{
memset(visit,0,sizeof(visit));
if(dfs(i))
sum++;
}
return sum;
}

int main()
{
int i;
while(cin>>n)
{
memset(a,0,sizeof(a));
for(i=0; i<n; i++)
{
int x,y,m;
scanf("%d: (%d)",&x,&m);
while(m--)
{
cin>>y;
a[x][y]=1;
}
}
cout<<n-hungary()/2<<endl; //套用公式即可
}
}</strong></span>
还不明白代码意思的可以看我转载的一个大神的博客,讲解十分生动有趣!!令人印象深刻[/code]
关于二分其他问题可以看我其他博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: