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

来源:互联网 发布:西门子plc编程技巧 编辑:程序博客网 时间:2024/05/06 08:05

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

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


Sample Input
70: (3) 4 5 61: (2) 4 62: (0)3: (0)4: (2) 0 15: (1) 06: (2) 0 130: (2) 1 21: (1) 02: (1) 0
 

Sample Output
52
输入数据的意思就是 第一个人(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 505int a[N][N],visit[N],link[N];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>
还不明白代码意思的可以看我转载的一个大神的博客,讲解十分生动有趣!!令人印象深刻
关于二分其他问题可以看我其他博客

0 0
原创粉丝点击