Girls and Boys HDU - 1068

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N =1e5;
int n;
int h[N], e[N], ne[N], idx;
int match[N];
bool st[N];
void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
bool find(int x) {
    for (int i = h[x]; i != -1; i = ne[i]) {//枚举所有看上的
        int j = e[i];
        if (!st[j]) {//如果没考虑过
            st[j] = true;//表示考虑过了
            //如果这个妹子还没匹配其他男生 ,或者说虽然已经匹配了,但可以给那个男生找到下家
            if (match[j] == -1 || find(match[j])) {
                match[j] = x;
                return true;
            }
        }
    }
    return false;
}
int main() {
    while(scanf("%d",&n)!=EOF&&(n)) {
        idx=0;
        memset(h, -1, sizeof h);
        memset(match,-1,sizeof(match));
        for(int i=0;i<n;i++)
        {
            int x,num;
            scanf("%d: (%d)",&x,&num);
            while(num--)
            {
                int y;
                scanf("%d",&y);
                add(x,y);
                add(y,x);
            }
        }
        int res = 0;//匹配的数量
        for (int i = 0; i < n; i ++ ) {//依次看每个男生
            memset(st, false, sizeof st);//先把所以的妹子清空,表示都还没考虑过
            if (find(i)) 
                res ++ ;//如果成功过找到,就加一
        }
        printf("%d\n", n-res/2);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/12387455.html
今日推荐