题目理解一下就是求二分图的最大独立集。而二分图的最大独立集数=节点数(n)— 最大匹配数(m)。所以关键在于求二分图的最大匹配数。

二分图的最大匹配数可以使用匈牙利算法解答,其理论依据为:http://www.cnblogs.com/AdaByron/articles/2200978.html

#include<stdio.h>
#include <memory.h>
const int MAX = 500;
bool linkMap[MAX][MAX];
int  crossPath[MAX];
bool used[MAX];
int studentNumber;
bool search(int u)
{
    for (int i=0;i<studentNumber;i++)//此处甚是悲剧
    {
        if (linkMap[u][i]&&!used[i])
        {
            used[i]=1;
            if (crossPath[i]==-1||search(crossPath[i]))
            {
                crossPath[i]=u;
                return true;
            }
        }
    }
    return false;
}

int hungary()
{
    int cnt = 0; 
    memset(crossPath, -1, sizeof(crossPath));
    for(int i= 0; i<studentNumber; i++)
    {
        memset(used,0, sizeof(used));
        if(search(i)) 
            cnt++;
    }
    return cnt;
}
int main()
{
    //freopen("Girls and Boys.txt","r",stdin);
    int boy,girlNumber,girl;
    while (scanf("%d",&studentNumber)!=EOF)
    {
        memset(linkMap,false, sizeof(linkMap));
        for (int i=0;i<studentNumber;i++)
        {
            scanf("%d: (%d)",&boy,&girlNumber);
            for(int i =0; i < girlNumber; i++) 
            { 
                scanf("%d",&girl);
                linkMap[boy][girl] = true;
            }
        }
        int reuslt=hungary();
        printf("%d\n",studentNumber-reuslt/2);
    }
    return 0;
}

相关文章: