POJ3692 Kindergarten【二分图最大独立集】

题目链接:

http://poj.org/problem?id=3692

题目大意:

幼儿园里边有N个男孩和M个女孩,所有男生之间都互相认识,所有女生之间也都相互认识。

还有k对关系,表示某个男孩和某个女孩认识。现在要选择一些学生组成一个集合,使得这个

集合中所有的人都认识,求这个集合中最多能有多少人。

思路:

建立二分图,图的一边为男生,另一边为女生。不能直接选取认识关系来建边,应该选取不认

识的人建边,也就是认识关系的补集作为边集。这样匹配的两个人都是不认识的,求出来的最

大匹配数就是最多有多少对人相互不认识。而最大独立集 = N + M - 最大匹配数,就求出了最

多能能多少个同学组成一个集合,使得集合中所有人都相互认识。

所以建图时,先将Map[][]初始化为1,认识的人赋值为0,然后求最大匹配数,从而得到最大独

立集。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 220;

bool Map[MAXN][MAXN];
bool Mask[MAXN];

int NX,NY;
int cx[MAXN],cy[MAXN];

int FindPath(int u)
{
    for(int i = 1; i <= NY; ++i)
    {
        if(Map[u][i] && !Mask[i])
        {
            Mask[i] = 1;
            if(cy[i] == -1 || FindPath(cy[i]))
            {
                cy[i] = u;
                cx[u] = i;
                return 1;
            }
        }
    }
    return 0;
}

int MaxMatch()
{
    int res = 0;
    for(int i = 1; i <= NX; ++i)
        cx[i] = -1;
    for(int i = 1; i <= NY; ++i)
        cy[i] = -1;

    for(int i = 1; i <= NX; ++i)
    {
        if(cx[i] == -1)
        {
            for(int j = 1; j <= NY; ++j)
                Mask[j] = 0;
            res += FindPath(i);
        }
    }
    return res;
}

int main()
{
    int M,u,v,kase = 0;
    while(~scanf("%d%d%d",&NX,&NY,&M) && (NX||NY||M))
    {
        for(int i = 1; i <= NX; ++i)
            for(int j = 1; j <= NY; ++j)
                Map[i][j] = 1;
        for(int i = 1; i <= M; ++i)
        {
            scanf("%d%d",&u,&v);
            Map[u][v] = 0;
        }
        printf("Case %d: %d\n",++kase,NX+NY-MaxMatch());
    }

    return 0;
}
时间: 2024-12-13 21:34:31

POJ3692 Kindergarten【二分图最大独立集】的相关文章

POJ3692 Kindergarten 【最大独立集】

Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5317   Accepted: 2589 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(二分图最大独立集)

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

POJ3692 Kindergarten

Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6345   Accepted: 3129 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

hdu 3829 二分图最大独立集

将孩子看做点,两个孩子间存在矛盾关系则连一条边,最后求二分图最大独立集即可 // // main.cpp // hdu3829 // // Created by Fangpin on 15/5/29. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <vector>

POJ1466 Girls and Boys【二分图最大独立集】

题目链接: http://poj.org/problem?id=1466 题目大意: 有N个学生,他们之间的某些人比较暧昧,只有认识的人能组成一个集合.问:最多能组成 多少个集合,使得这几个集合之间的学生都没有任何关系. 思路: 从N个图中选出M个点,使得这M个点两两之间没有边,求最大的M是多少.二分图最大独立 集问题.本来应该以男生.女生各一边建二分图求最大独立集,但是这里只有N个点,没有告 诉男生.女生的编号.那么以N个学生为一边.再以N个学生为另一边.将相互联系的人之间 建边.然后求最大匹

hihocoder 1158 质数相关 (二分图最大独立集 最大流ISAP求解)

#1158 : 质数相关 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中存在两个质数相关的数,否则称S为质数无关.如{2, 8, 17}质数无关,但{2, 8, 16}, {3, 6}质数相关.现在给定一个集合S,问S的所有质数无关子集中,最大的子集的大小. 输入 第一行为一个数T,为数据组数.之后每组数据包含两行. 第一行为N,为集合S的大小.第二

杭电1068--Girls and Boys(二分图最大独立集)

Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8863    Accepted Submission(s): 4077 Problem Description the second year of the university somebody started a study on the romant

light_oj 1356 素数独立集,二分图最大独立集

light_oj 1356 素数独立集,二分图最大独立集 B - Prime Independence Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1356 Description A set of integers is called prime independent if none of its member is a pr

[luoguP3355] 骑士共存问题(二分图最大独立集)

传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建立附加源S汇T,从S向X集合中每个顶点连接一条容量为1的有向边,从Y集合中每个顶点向T连接一条容量为1的有向边. 从每个可用的黑色格子向骑士一步能攻击到的可用的白色格子连接一条容量为无穷大的有向边. 求出网络最大流,要求的结果就是可用格子的数量减去最大流量. 分析 用网络流的方法解决棋盘上的问题,一