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 girls and boys know each other. Now the teachers want to pick some kids to play a
game, which need that all players know each other. You are to help to find maximum number of kids the teacher can pick.

Input

The input consists of multiple test cases. Each test case starts with a line containing three integers

G, B (1 ≤ G, B ≤ 200) and M (0 ≤
M
G × B), which is the number of girls, the number of boys and

the number of pairs of girl and boy who know each other, respectively.

Each of the following M lines contains two integers X and Y (1 ≤
X≤ G,1 ≤ Y ≤ B), which indicates that girl X and boy Y know each other.

The girls are numbered from 1 to G and the boys are numbered from 1 to
B
.

The last test case is followed by a line containing three zeros.

Output

For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the maximum number of kids the teacher can pick.

Sample Input

2 3 3
1 1
1 2
2 3
2 3 5
1 1
1 2
2 1
2 2
2 3
0 0 0

Sample Output

Case 1: 3
Case 2: 4

Source

2008 Asia Hefei Regional Contest Online by USTC

题目链接:http://poj.org/problem?id=3692

题目大意:一些男生和女生,男生们相互都认识,女生们相互都认识,给出男女生的认识关系,要求一个最大的集合,集合中任意两个人都互相认识,求这个最大集合的元素个数

题目分析:二分图最大团问题,根据定理:

二分图最大团=原图补图的最大独立集

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

用匈牙利算法解出原图补图的最大匹配即可算出最大团中元素个数 (注:一般图的最大团问题是NP问题)

代码:

#include <cstdio>
#include <cstring>
int const MAX = 205;
int cx[MAX], cy[MAX];
bool vis[MAX], map[MAX][MAX];
int g, b, m;

int DFS(int x)
{
    for(int y = 1; y <= b; y++)
    {
        if(!vis[y] && map[x][y])
        {
            vis[y] = true;
            if(cy[y] == -1 || DFS(cy[y]))
            {
                cy[y] = x;
                cx[x] = y;
                return 1;
            }
        }
    }
    return 0;
}

int MaxMatch()
{
    int ans = 0;
    memset(cx, -1, sizeof(cx));
    memset(cy, -1, sizeof(cy));
    for(int i = 1; i <= g; i++)
    {
        if(cx[i] == -1)
        {
            memset(vis, false, sizeof(vis));
            ans += DFS(i);
        }
    }
    return ans;
}

int main()
{
    int ca = 1;
    while(scanf("%d %d %d", &g, &b, &m) != EOF && (g + b + m))
    {
        memset(map, true, sizeof(map));
        for(int i = 0; i < m; i++)
        {
            int u, v;
            scanf("%d %d", &u, &v);
            map[u][v] = false;
        }
        printf("Case %d: %d\n", ca ++, g + b - MaxMatch());
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 11:57:52

POJ 3692 Kindergarten (二分图 最大团)的相关文章

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(最大团问题)

题目链接:http://poj.org/problem?id=3692 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 pi

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【最大点独立集】

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

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

POJ3692 Kindergarten —— 二分图最大团

题目链接:http://poj.org/problem?id=3692 Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7371   Accepted: 3636 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,二分图的最大团

最大独立集 = V - 最小顶点覆盖 二分图的最小顶点覆盖数 = 最大匹配数 最大团 = 补图的最大独立集 #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <vector> #include <queue> using namespace std; const int maxn = 200 + 10; int n,

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

题意: 有G个女孩,B个男孩.女孩彼此互相认识,男孩也彼此互相认识.有M对男孩和女孩是认识的.分别是(g1,b1),.....(gm,bm). 现在老师要在这G+B个小孩中挑出一些人,条件是这些人都互相认识.问最多可以挑出多少人. 思路: 女孩之间互相认识,男孩之间互相认识,所以我们可以将连边定义为:不认识.即:若两个节点之间有连边,则两个节点互不认识. 故题意即为选出最多的点使得这些点任意两点之间没有连边.即选最少的点覆盖所有边.(二分图最大独立集/二分图最小点覆盖) 代码: vector<i