poj3692Kindergarten

来源:互联网 发布:数据接口开发规范 编辑:程序博客网 时间:2024/06/05 07:49

这是poj-100题纪念一下


题意:有G个女生,M个男生,其中女生之间全部认识,全部男生之间全部认识,部分女生和男生认识。现在老师要玩一个游戏,要求是所有的人都认识。

就是要求最大团。

思路:最大团=原图补图的最大独立集=顶点数-最大匹配数。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1060;
int n1,n2;
int _map[N][N];
bool vis[N];
int llink[N];
int find(int x) {
    int i;
    for(i=1; i<=n2; i++) {
        if(_map[x][i]&&!vis[i]) {
            vis[i]=true;
            if(llink[i]==-1||find(llink[i])) {
                llink[i]=x;
                return true;
            }
        }
    }
    return false;
}
int mach() {
    int ans=0;
    memset(llink,-1,sizeof(llink));
    for(int i=1; i<=n1; i++) {
        memset(vis,false,sizeof(vis));
        if(find(i)) {
            ans++;
        }
    }
    return ans;
}
int main() {
    int G;
    int B;
    int rel;
    int x,y;
    int ncase=1;
    while(~scanf("%d%d%d",&G,&B,&rel)) {
        if(G==0&&B==0&&rel==0) {
            break;
        }
        memset(_map,1,sizeof(_map));
        for(int i=0; i<rel; i++) {
            scanf("%d%d",&x,&y);
            _map[x][y]=0;
        }
        n1=G;
        n2=B;
        int ans=mach();
        printf("Case %d: ",ncase++);
        printf("%d\n",G+B-ans);
    }
    return 0;
}


0 0
原创粉丝点击