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

题目大意:给出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[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>
还不明白代码意思的可以看我转载的一个大神的博客,讲解十分生动有趣!!令人印象深刻

关于二分其他问题可以看我其他博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章