HDU 1068

题目大意:
找出一个最大的集合使得该集合的任意两个人没有关系。

 

二分图匹配模板题

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

因为本题算出来的ans是最大匹配的两倍,所以应当输出n-ans/2

 

AC代码:

#include<iostream>
#include<string.h>
using namespace std;

int ma[1001],used[1001],mp[1001][1001],n;

int read(){
    int f=1,ret=0;
    char c=getchar();
    while (!isdigit(c)){
        if (c=='-') f=-1;
        c=getchar();
    }
    while (isdigit(c)) ret=ret*10+c-'0',c=getchar();
    return ret;
}

bool solve(int now){
    for (int i=0;i<n;i++){
        if (mp[now][i] && !used[i]){
            used[i]=1;
            if (ma[i]==-1 || solve(ma[i])){
                ma[i]=now;
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    while(cin>>n){
        memset(used,0,sizeof used);
        memset(ma,-1,sizeof ma);
        memset(mp,0,sizeof mp);
        for (int i=1;i<=n;i++){
            int now=read();
            int num=read();
            for (int j=1;j<=num;j++){
                int tmp=read();
                mp[tmp][now]=1;
            }
        }
        int ans=0;
        for (int i=0;i<n;i++){
            memset(used,0,sizeof used);
            ans+=solve(i);
        }
        cout<<n-ans/2<<endl;
    }    
    return 0;
}

 

posted @ 2020-12-07 19:40  White_Li  阅读(75)  评论(0)    收藏  举报