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;   
}


    

你可能感兴趣的:(c,ini,input)