1.链接地址

https://vjudge.net/problem/POJ-1469

2.问题描述

Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions:

    • every student in the committee represents a different course (a student can represent a course if he/she visits that course)
    • each course has a representative in the committee

输入样例

2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1

输出样例

YES
NO

3.解题思路

P N(课程数跟学生数)

接着有P行,格式为Count studenti studenti+1 ……studentcount

(Count表示对课程1感兴趣的学生数,接着有Count个学生)

如第一行3 1 2 3表示学生1跟学生2跟学生3对课程1感兴趣

输出为:

若能满足上面两个要求这输出”YES”,否则为”NO”

可以直接使用匈牙利算法

4.算法实现源代码

#include<cstdio>
#include<iostream>
#include<string.h>
#include<cmath>
#include<cstdio>
#define INF 0x3f3f3f3f
#define N 310

int G[N][N], vis[N], used[N];
int n, p;

bool Find(int u)
{
    int i;
    for(i = 1 ; i <= n ; i++)
    {
        if(!vis[i] && G[u][i])
        {
            vis[i] = 1;
            if(!used[i] || Find(used[i]))
            {
                used[i] = u;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    int a, b, i, ans, t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &p, &n);
        memset(G, 0, sizeof(G));
        ans = 0;
        for(i = 1 ; i <= p ; i++)
        {
            scanf("%d", &a);
            while(a--)
            {
                scanf("%d", &b);
                G[i][b] = 1;
            }
        }
        memset(used, 0, sizeof(used));
        for(i = 1 ; i <= p ; i++)
        {
            memset(vis, 0, sizeof(vis));
            if(Find(i))
                ans++;
        }
        if(ans == p)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}