poj 3692 Kindergarten (最大独立集)

题意: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;
}


你可能感兴趣的:(poj 3692 Kindergarten (最大独立集))