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>
還不明白代碼意思的可以看我轉載的一個大神的博客,講解十分生動有趣!!令人印象深刻

關於二分其他問題可以看我其他博客

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