关闭

poj 3692 Kindergarten (最大独立集)

184人阅读 评论(0) 收藏 举报
分类:

题意:G个女孩,B个男孩。女孩互相都认识,男孩也互相都认识。部分女孩和男孩互相认识。问最多有多少人两两都认识。


分析:如果把互相认识的人之间连一条边,得到一个图G。对于图G的逆图G',发现是一个二分图。其中的边表示两人不认识。那么问题就转化为求最多有多少个点,任意两点之间不相邻(认识),即最大独立集问题。


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



#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
bool Map[205][205],T[205];
int Left[205],G,B;

int match(int u){
    for(int i=1;i<=B;++i){
        if(Map[u][i]&&!T[i]){
            T[i]=1;
            if(!Left[i]||match(Left[i])){
                Left[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    int M,ca=1,i,j,x,y;
    while(cin>>G>>B>>M){
        if(!G&&!B&&!M) break;
        for(i=1;i<=G;++i)
        for(j=1;j<=B;++j) Map[i][j]=1;
        for(i=1;i<=M;++i){
            scanf("%d%d",&x,&y);
            Map[x][y]=0;
        }
        memset(Left,0,sizeof(Left));
        int ans=0;
        for(i=1;i<=G;++i){
            memset(T,0,sizeof(T));
            ans+=match(i);
        }
        printf("Case %d: %d\n",ca++,B+G-ans);
    }
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:110704次
    • 积分:3978
    • 等级:
    • 排名:第7863名
    • 原创:291篇
    • 转载:41篇
    • 译文:0篇
    • 评论:24条
    最新评论