HDU 1083 二分匹配

题目大意:有n个学生,p门课程,一个学生可以选修多门课程,现在要为这p门课程分别选一个课代表,且一个学生只能当一个科目的课代表,问是否能满足所有课程都找到课代表。

运用常用模板:

#include <iostream>
using namespace std;
const int N = 310;
int map[N][N], flag[N];
int pre[N];
int n, m, num;
int find(int cur)
{
    int i ;
    for(i = 1; i <= m; i++)
    {
        if(map[cur][i] && !flag[i])
        {
            flag[i]  = 1;
            if(pre[i] == -1 || find(pre[i]))
            {
                pre[i] = cur;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    int sum;
    int t;
    cin >> t;
    while(t--)
    {
        memset(map, 0, sizeof(map));
        memset(pre, -1, sizeof(pre));
        sum = 0;
        cin >> n >> m;
        for(int i  = 0;  i < n; i++)
        {
            int cnt;
            int temp;
            cin >> cnt;
            for(int j = 0; j < cnt; j++)
            {
                cin >> temp;
                map[i][temp] = 1;
            }
        }

        for(int i = 0; i < n; i++)
        {
            memset(flag, 0, sizeof(flag));
            sum += find(i);
        }

        if(sum == n)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}


你可能感兴趣的:(HDU 1083 二分匹配)