poj 3692 Kindergarten 二分匹配

来源:互联网 发布:军鸽软件 编辑:程序博客网 时间:2024/06/10 09:40

题目链接:poj 3692

        有n个害羞的小男孩,m个害羞的小女孩,男孩之间互相认识,女孩之间互相认识,然后给出一系列男女之间的认识关系。现在要从中选出尽量多的人,使得两两之间相互认识,问最多能选出几个人。

        二分图求最大团=总的顶点数-补图最大匹配数

        匈牙利算法可解,只不过建图跟普通的二分图不同,普通的二分图认识为1,这里不认识为1

#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,m;#define FFF 205bool ma[FFF][FFF],vis[FFF];int match[FFF];bool dfs(int x){    for(int i=1;i<=m;i++)    {        if(!vis[i]&&ma[x][i])        {            vis[i]=true;            if(match[i]==-1||dfs(match[i]))            {                match[i]=x;                return true;            }        }    }    return false;}int xiong(){    int ans=0;    for(int i=1;i<=n;i++)    {        memset(vis,false,sizeof(vis));        if(dfs(i))            ans++;    }    return ans;}int main(){    int z,x,y,Case=1;    while(scanf("%d%d%d",&n,&m,&z),n+m+z)    {        for(int i=1;i<=n;i++)            for(int j=1;j<=m;j++)                ma[i][j]=true;        memset(match,-1,sizeof(match));        while(z--)        {            scanf("%d%d",&x,&y);            ma[x][y]=false;        }        printf("Case %d: ",Case++);        cout<<n+m-xiong()<<endl;    }    return 0;}


0 0