poj 3692 Kindergarten (最大独立集)

来源:互联网 发布:同步软件 编辑:程序博客网 时间:2024/05/24 06:48

题意: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
原创粉丝点击