POJ 3692 Kindergarten(二分图最大独立集)

题意:

有G个女孩,B个男孩。女孩彼此互相认识,男孩也彼此互相认识。有M对男孩和女孩是认识的。分别是(g1,b1),.....(gm,bm)。

现在老师要在这G+B个小孩中挑出一些人,条件是这些人都互相认识。问最多可以挑出多少人。

思路:

女孩之间互相认识,男孩之间互相认识,所以我们可以将连边定义为:不认识。即:若两个节点之间有连边,则两个节点互不认识。

故题意即为选出最多的点使得这些点任意两点之间没有连边。即选最少的点覆盖所有边。(二分图最大独立集/二分图最小点覆盖)

代码:

vector<int> graph[205];
int cx[205],cy[205];
bool bmask[205];
int G,B,M;
bool mp[205][205];

int findPath(int u){
    int L=graph[u].size();
    rep(i,0,L-1){
        int v=graph[u][i];
        if(!bmask[v]){
            bmask[v]=true;
            if(cy[v]==-1||findPath(cy[v])){
                cy[v]=u;
                cx[u]=v;
                return 1;
            }
        }
    }
    return 0;
}
int MaxMatch(){
    int ans=0;
    rep(i,1,G) cx[i]=-1;
    rep(i,1,B) cy[i]=-1;
    rep(i,1,G) if(cx[i]==-1){
        mem(bmask,false);
        ans+=findPath(i);
    }
    return ans;
}

int main(){
    int tcase=0;
    while(scanf("%d%d%d",&G,&B,&M)!=EOF){
        if(!G && !B && !M) break;

        rep(i,1,G) graph[i].clear();
        mem(mp,false);

        while(M--){
            int x,y;
            scanf("%d%d",&x,&y);
            mp[x][y]=true;
        }
        rep(i,1,G) rep(j,1,B) if(false==mp[i][j]) graph[i].push_back(j);

        int dd=MaxMatch();
        printf("Case %d: %d\n",++tcase,G+B-dd);
    }
}
时间: 2024-11-03 21:11:38

POJ 3692 Kindergarten(二分图最大独立集)的相关文章

POJ 3692 Kindergarten (二分图 最大团)

Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5660   Accepted: 2756 Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some

POJ 3692 Kindergarten(最大独立集)

[题目链接] http://poj.org/problem?id=3692 [题目大意] 男生相互之间都认识,女生相互之间也都认识, 一些男生和一些女生相互之间也认识,求找出最多的人参加派对, 他们相互之间都认识 [题解] 我们建认识图的反图,将相互之间不认识的连线, 那么问题转化为求这个图的最大独立集, 最大独立集答案为总点数减去最大匹配. [代码] #include <cstdio> #include <cstring> using namespace std; const i

poj 3692 Kindergarten (最大独立集之逆匹配)

Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some girls and boys know each other. Now the teachers want to pick some kids to play a game, which n

poj 3692 Kindergarten(二分图匹配)

题意:n个男孩相互认识,m个女孩相互认识,k对男孩和女孩相互认识,求最大的任意两人相互认识的集合: 思路:二分图匹配: 独立集=总数-最大匹配数: 最大团=原图补图的最大独立集=总数-补图的最大匹配数: 本题就是求最大团,先求补图的最大匹配数,匈牙利算法: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int mm[505][505]; int

POJ - 3692 Kindergarten 二分图 最大匹配

题目大意:给出n个男生,m个女生,还有k对男女认识关系,性别相同的人都相互认识.现在要求你挑出k个人,使得这k个人两两之间都相互认识 解题思路:要挑都认识的人,可以排除掉不认识的人. 可以分成两个点集,一个点集是男,一个点集是女,两个点集的连线表示两个人互不相认识,所以只要找到最大的互不相认识的匹配数,再用 n + m -互不相认识的匹配数,得到的人就是都相互认识的人了 #include<cstdio> #include<cstring> #include<vector>

poj 3692 Kindergarten (最大独立集)

Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4903   Accepted: 2387 Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know each other. In addition to that, some

poj 3692 Kindergarten (最大团模板题)

题目链接:http://poj.org/problem?id=3692 Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5156   Accepted: 2512 Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and all boys also know e

POJ 3692 Kindergarten【最大点独立集】

大意: 有n个boy  m个girle   boy之间相互了解  girle之间相互了解 又告诉你一些boy和girle之间相互了解的关系 问最多选出多少人使其相互之间相互了解 分析: 左集合boy  右girle 若boy与girle相互不了解则建一条边,这样,有边相连的便是不相互了解的 那么最大点独立便是选取一些点使其相互之间没有边相连也就是相互了解的 note: 由于左右集合不相等所以选取nm中的较大的作为点的个数 最后结果为2 * max(n, m) - 最大匹配 代码: 1 #incl

Girls and Boys POJ - 1466 【(二分图最大独立集)】

Problem DescriptionIn the second year of the university somebody started a study on the romantic relations between the students. The relation "romantically involved" is defined between one girl and one boy. For the study reasons it is necessary