hdu1068-Girls and Boys(最大独立集,匹配问题)

来源:互联网 发布:js push 数组 编辑:程序博客网 时间:2024/05/20 20:17

题目来源:http://showproblem.php?pid=1068

题意

有那么一堆人,编号从0开始到n-1,每个人都有几个有关系的人,研究者试图找出没有缘分同学的最大集。输出数量。

思路

利用匈牙利匹配求出最大匹配,因为是求得两个人之间的,所以最后结果要除以2,求出最大匹配,然后最大独立集的元素数量=总个数-最大匹配

代码

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000+10;int pre[maxn],vis[maxn];int mp[maxn][maxn];int n;void init(){    memset(mp,0,sizeof(mp));    for(int i=1; i<=n; i++)    {        int l,r,k;        scanf("%d: (%d)",&l,&k);        while(k--)        {            scanf("%d",&r);            mp[l][r]=1;        }    }}int dfs(int i){    for(int j=0; j<n; j++)    {        if(mp[i][j]&&!vis[j])        {            vis[j]=1;            if(!pre[j]||dfs(pre[j]))            {                pre[j]=i;                return 1;            }        }    }    return 0;}void solve(){    int ret=0;    memset(pre,0,sizeof(pre));    for(int i=0; i<n; i++)    {        memset(vis,0,sizeof(vis));        ret+=dfs(i);    }    printf("%d\n",n-(ret/2));}int main(){    while(~scanf("%d",&n))    {        init();        solve();    }}
阅读全文
0 0
原创粉丝点击