1. 程式人生 > 實用技巧 >HDU 1068

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