码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-04-01 23:52:08      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

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


题目大意:

有N个学生,他们之间的某些人比较暧昧,只有认识的人能组成一个集合。问:最多能组成

多少个集合,使得这几个集合之间的学生都没有任何关系。


思路:

从N个图中选出M个点,使得这M个点两两之间没有边,求最大的M是多少。二分图最大独立

集问题。本来应该以男生、女生各一边建二分图求最大独立集,但是这里只有N个点,没有告

诉男生、女生的编号。那么以N个学生为一边、再以N个学生为另一边。将相互联系的人之间

建边。然后求最大匹配数。因为如果u和v有联系的话,边(u,v)和(v,u)都加入了二分图中,

重复计算了两遍。又因为二分图最大独立集 = N - 二分图最大匹配数。所以最终答案就是

N - 最大匹配数/2。


AC代码:

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

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

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

int FindPath(int u)
{
    for(int i = 0; i < NX; ++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()
{
    for(int i = 0; i < NX; ++i)
        cx[i] = -1;
    for(int i = 0; i < NY; ++i)
        cy[i] = -1;

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

int main()
{
    int N,K,u,v;
    while(~scanf("%d",&N))
    {
        memset(Map,0,sizeof(Map));
        NX = NY = N;
        for(int i = 0; i < N; ++i)
        {
            scanf("%d: (%d)",&u,&K);
            for(int j = 0; j < K; ++j)
            {
                scanf("%d",&v);
                Map[u][v] = 1;
                Map[v][u] = 1;
            }
        }
        printf("%d\n",N-MaxMatch()/2);
    }

    return 0;
}


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

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/44814893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!