hdu 1068 Girls and Boys 匈牙利算法求最大独立集

来源:互联网 发布:麒麟linux 编辑:程序博客网 时间:2024/05/16 15:49

题目链接

题意:有n个同学之间有暧昧关系,求最多的一组同学,其之间任意两人没有暧昧关系。

由于是在n个同学内部匹配,我们把每个同学拆成两份,求出的最大匹配除以二即可。

由定理:最大独立集=定点数-最大匹配,可以求解。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define N 1100using namespace std;int mp[N][N],v[N],linker[N],n;int dfs(int t){    for(int i=0;i<n;i++)    {        if(!v[i]&&mp[t][i])        {            v[i]=1;            if(linker[i]==-1||dfs(linker[i]))            {                linker[i]=t;                return 1;            }        }    }    return 0;}int hungary(){    int ans=0;    memset(linker,-1,sizeof(linker));    for(int i=0;i<n;i++)    {        memset(v,0,sizeof(v));        if(dfs(i))  ans++;    }    return ans;}int main(){    while(~scanf("%d",&n))    {        memset(mp,0,sizeof(mp));        for(int i=0;i<n;i++)        {            int u,v,t;            scanf("%d: (%d)",&u,&t);            for(int j=0;j<t;j++)            {                scanf("%d",&v);                mp[u][v]=1;            }        }        int ans=hungary()/2;        cout<<n-ans<<endl;    }}


1 0