天天写算法之Girls and Boys

这个题的出现标志着算法大业又加入了新的一员,虽然前面的还不牢靠,但是他的到来的确使得所有的东西变得更不牢靠。

二分图,KM,匈牙利,emmmm,最大匹配,完美匹配,完备匹配,增广路径,最大流。这一大堆东西,需要先去搜一波基础知识,再来做这个题。

题目很简单,就是找最大匹配,但是没有说是男是女,所以我们就直接乘2,最后结果除以2就行了。
代码:
#include<iostream>
#include<string.h>
#include<cstdio>
#define MAX 1005
using namespace std;

int n ;
int Map[MAX][MAX];//两个人是否有关系
bool used[MAX];//是否被访问过
int linker[MAX];//查看被连接的那一个集合是否有男生来连接了。

bool dfs(int a)
{
    for(int i = 0 ; i < n ; i ++)
    {
        if(Map[a][i]&&!used[i])
        {
            used[i]=true ;
            if(linker[i]==-1||dfs(linker[i]))
            {
                linker[i]= a ;
                return true ;
            }
        }
    }
    return false ;
}

int hungary(){
    int res = 0 ;
    memset(linker,-1,sizeof(linker));
    for(int i = 0 ; i < n ; i ++)
    {
        memset(used,0,sizeof(used));
        if(dfs(i)) res ++ ;
    }
    return res ;
}

int main(){
    int i , j , num ,a, b ;
    while(scanf("%d",&n)!=EOF)
    {
        memset(Map,0,sizeof(Map));
        for(i = 1 ; i <= n ; i ++)
        {
            scanf("%d: (%d)",&a,&num);
            for(j = 0 ; j <num ; j ++)
            {
                scanf("%d",&b);
                Map[a][b]= 1 ;
                Map[b][a]= 1 ; //我觉得正反两个方向都应该有关系
            }
        }
        num = hungary();
        printf("%d\n",n-num/2);

    }
}

阅读更多
个人分类: 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭