hdu1068 Girls and Boys --- 最大独立集

来源:互联网 发布:键盘打字指法软件 编辑:程序博客网 时间:2024/05/20 11:22

有一个集合男和一个集合女,给出两集合间一些一一对应关系,问该两集合中的最大独立集的点数。

最大独立集=顶点总数-最大匹配数

此题中,若(a,b)有关,则(b,a)有关,每一个关系算了两次,相当于二分图的两边集合没有分男女,两边都是总人数,

所以此题中答案应该是 顶点总数-最大匹配数/2


#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<vector>#include<queue>const int maxn=510;using namespace std;int mx[maxn],my[maxn],vis[maxn],e[maxn][maxn],n;int path(int i){    int j;    for(j=0;j<n;j++)    {        if(e[i][j]&&!vis[j])        {            vis[j]=1;            if(my[j]==-1||path(my[j]))            {                my[j]=i;                mx[i]=j;                return 1;            }        }    }    return 0;}int hungry(){    int res=0;    memset(mx,-1,sizeof mx);    memset(my,-1,sizeof my);    for(int i=0;i<n;i++)    {        if(mx[i]==-1)        {            memset(vis,0,sizeof vis);            res+=path(i);        }    }    return res;}int main(){    int a,b,m,i;    while(~scanf("%d",&n))    {        memset(e,0,sizeof e);        for(i=0;i<n;i++)        {            scanf("%d: (%d)",&a,&m);            while(m--)            {                scanf("%d",&b);                e[a][b]=1;            }        }        printf("%d\n",n-hungry()/2);    }    return 0;}


1 0