POJ1426 最小独立点集

   这道题就是说一堆人有男有女....有些男女之间会有好感( romantically involved .... 有基佬吐槽男男之间也能有好感...无视!!这题就是男的对女的才有...也就是图就是个二分图...)...有好感的男女不能分在一起....问最后能分在一起的人数最多是多少..

   这道题一看就想到二分图...但我就是因为对最小独立点集的性质以及与最小点覆盖的关系不清楚...导致卡了蛮久...后来去找了资料才明白...最小独立点集 = 顶点数 - 最小点覆盖数...又最小点覆盖 = 最大匹配数...so...

    最小独立点集 = 顶点数 - 最大匹配数

#include<iostream>
#define MAXN 510
using namespace std;
int n,match[MAXN];
bool map[MAXN][MAXN],used[MAXN];
int input()
{
    int data=0;
    char c; 
    while (c<'0' || c>'9') c=getchar();
    while (c>='0' && c<='9')
    {
        data=data*10+c-'0';
        c=getchar();      
    }
    return data;
}
bool ok(int num)
{
    int i;
    for (i=0;i<n;i++)
    if (!used[i] && map[num][i])
    {
         used[i]=true;           
         if (match[i]==-1 || ok(match[i]) )
         {
             match[i]=num;
             return true;                 
         }          
    }    
    return false;
}
int main()
{ 
    while (~scanf("%d",&n))
    {
        int i,h,p,k;
        memset(map,false,sizeof(map));
        for (i=0;i<n;i++)
        {
            h=input();
            k=input();
            while (k--)
            {
                p=input();
                map[h][p]=true;  
            }
        }    
        memset(match,-1,sizeof(match));
        k=0;
        for (i=0;i<n;i++)
        {
            memset(used,false,sizeof(used)); 
            if (ok(i)) k++;
        } 
        printf("%d\n",(2*n-k)/2);
    }
    return 0;   
}


    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值