【HDU - 1083】Courses(二分图匹配)

Courses
HDU - 1083
考虑一组 N 学生和 P 课程。每个学生访问零,一个或多个课程。你的任务是确定是否可能成立一个由P学生组成的委员会,同时满足条件:

。 。委员会中的每一个学生代表不同的课程(如果学生访问该课程,他可以代表一门课程)。

每个课程都有一名代表参加委员会

您的课程,应从文本文件中读取成套数据。输入文件的第一行包含数据集的数量。每个数据集以以下格式呈现:

P N
计数 1 学生 1 1 学生 1 2…学生1 计数
1 计数2 学生2 1 学生2 2…学生2计数2。

伯爵P学生P 1学生P 2…学生P CountP

每个数据集的第一行包含两个正整数,除以一个空白:P(1 <= P <= 100) - 课程数和 N(1 <= N <= 300) - 学生人数。下一行P线按课程顺序描述。从课程 1 到课程 P,每行描述一门课程。当然,i 的描述是一行,从整数计数 i (0 <= 计数 i <= N) 开始,表示访问课程 i 的学生人数。接下来,在一片空白之后,你会发现伯爵i的学生,参观课程,每两个连续分开一个空白。学生编号为正整数,从 1 到 N。

连续数据集之间没有空白线。输入数据是正确的。
程序的结果取决于标准
输出。对于每个输入数据,如果可以组建一个委员会,则程序打印在单行"YES"上,否则将打印"否"。线的开头不应有任何领先的空白。
程序输入和输出的示
例:
输入
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
输出
YES
NO
示例输入
2
3 3
3 1 2 3
2 1 2
1 1
3 3
2 1 3
2 1 3
1 1
Sample Output
YES
NO
题意描述:给多组数据,每组给出课程数量p,学生人数n,学生按1~n编号,然后是每门课的访问学生数量,以及访问的学生的编号,每个访问某课程的学生都可以当代表,但是每个代表不能重复当代表,如果每门课程都有代表,输出YES、否则NO
解题思路:利用二分图匹配,给每个学生匹配课程,如果匹配到的数量等于课程数,输出YES,否则NO。

#include<bits/stdc++.h>
#define N 500
using namespace std;
int e[N][N], match[N],book[N];
int k,m,a,b,n;
bool find(int x)
{
    
    
	for(int i=1;i<=n;i++)
	{
    
    
		if(!book[i]&&e[x][i])
		{
    
    
			book[i]=1;
			if(!match[i]||find(match[i]))
			{
    
    
				match[i]=x;
				return true;
			}
		}	
	}
	return false;
}

int main(void)
{
    
    
	int t;
	scanf("%d",&k);
	while(k--)
	{
    
    
		scanf("%d %d",&m,&n);//课程、学生数 
		memset(e,0,sizeof(e));
		memset(match,0,sizeof(match));
		for(int i=1;i<=m;i++)
		{
    
    
			scanf("%d",&a);//学生 
			for(int j=1;j<=a;j++)
			{
    
    
				scanf("%d",&b);
				e[i][b]=1;
			}		
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
    
    
			memset(book,0,sizeof(book));
			if(find(i))
				ans++;
		}
		if(ans==m) 
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/m0_58245389/article/details/120257376