hdoj 1083 Courses

Courses

Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4669    Accepted Submission(s):
2230

Problem Description

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

Your program should read sets of data from a text file. The
first line of the input file contains the number of the data sets. Each data set
is presented in the following format:

P N
Count1 Student1 1 Student1 2
... Student1 Count1
Count2 Student2 1 Student2 2 ... Student2
Count2
......
CountP StudentP 1 StudentP 2 ... StudentP CountP

The
first line in each data set contains two positive integers separated by one
blank: P (1 <= P <= 100) - the number of courses and N (1 <= N <=
300) - the number of students. The next P lines describe in sequence of the
courses . from course 1 to course P, each line describing a course. The
description of course i is a line that starts with an integer Count i (0 <=
Count i <= N) representing the number of students visiting course i. Next,
after a blank, you‘ll find the Count i students, visiting the course, each two
consecutive separated by one blank. Students are numbered with the positive
integers from 1 to N.

There are no blank lines between consecutive sets
of data. Input data are correct.

The result of the program is on the
standard output. For each input data set the program prints on a single line
"YES" if it is possible to form a committee and "NO" otherwise. There should not
be any leading blanks at the start of the line.

An example of program
input and output:

Sample Input

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

看到英文题就头疼,看不懂啊  伤心..........

此题是说如果每门课都要有人选且选此课的人不能选择其他课则输出yes否则输出no

用匈牙利算法  如果最后配对出来的总对数等于总的课数则正确

#include<stdio.h>
#include<string.h>
#define MAX 1100
int cour,stu,p;
int map[MAX][MAX];
int vis[MAX],s[MAX];
int find(int x)
{
	int i,j;
	for(i=1;i<=stu;i++)
	{
		if(map[x][i]&&vis[i]==0)//如果学生对这门课程感兴趣且 没被标记
		{          //(这里被标记就是说第i个学生选上了这门课)
			vis[i]=1;
			if(s[i]==0||find(s[i]))//如果第i个学生没有选上课或者可以换课
			{
				s[i]=x;//则让第i个学生选上这门课
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int i,j,k,t,sum;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&cour,&stu);
		memset(map,0,sizeof(map));
		memset(s,0,sizeof(s));
		for(i=1;i<=cour;i++)
		{
			scanf("%d",&p);
			while(p--)
			{
				scanf("%d",&k);
				map[i][k]=1;//给对应课程和对应学生标记
			}
		}
		sum=0;
		for(i=1;i<=cour;i++)
		{
			memset(vis,0,sizeof(vis));
			if(find(i))
			sum++;
		}
		if(sum==cour)
		printf("YES\n");
		else
		printf("NO\n");
	}
	return 0;
}

  

时间: 2024-10-12 01:40:37

hdoj 1083 Courses的相关文章

hdu 1083 Courses(二分图匹配)

Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4278    Accepted Submission(s): 2036 Problem Description Consider a group of N students and P courses. Each student visits zero, one or

Hdu 1083 Courses(匈牙利算法模版题)

Hdu 1083 题意:给你一个p表示测试组数,给你n和m表示课的个数和学生的个数,接下来n行首数字i表示该堂课的学生代表人数,之后为i个学生编码,问能否为每堂课找到一个学生课代表且不冲突: 题解:匈牙利算法模版 另附简单易懂匈牙利算法讲解:传送门 #include<cstring> #include<cstdio> const int N =305; using namespace std; bool h[N][N]; bool vis[N]; int link[N]; int

hdu 1083 Courses

描述:有p门的课,每门课都有若干学生,现在要为每个课程分配一名课代表,每个学生只能担任一门课的课代表,如果每个课都能找到课代表,则输出"YES",否则"NO". 二分匹配 #include<iostream> #include<cstring> #define maxn 305 using namespace std; int c,s; int rem[maxn][maxn]; int visit[maxn],map[maxn]; int d

HDU 1083 Courses(最大匹配模版题)

题目大意: 一共有N个学生跟P门课程,一个学生可以任意选一 门或多门课,问是否达成: 1.每个学生选的都是不同的课(即不能有两个学生选同一门课) 2.每门课都有一个代表(即P门课都被成功选过) 输入为: 第一行一个T代表T组数据 P N(P课程数, N学生数) 接着P行: 第几行代表第几门课程,首先是一个数字k代表对这门课程感兴趣的同学的个数,接下来是k个对这门课程感兴趣同学的编号. 输出为: 若能满足上面两个要求这输出”YES”,否则为”NO” 注意:是课程匹配的学生,学生没课上没事.....

HDU ACM 1083 Courses 二分图最大匹配

题意:p门课,每门课有若干学生,要为每门课分配一名课代表,每个学生只能担任一门课的课代表,若每个课都能找到课代表,则输出"YES",否则"NO". 分析:二分图的最大匹配,对课程.学生关系建立一个图,进行二分图最大匹配,当最大匹配数==课程数时说明能够满足要求,否则不能. #include<iostream> using namespace std; #define N 303 bool cs[N][N]; //cs[i][j]表示学生j是否选i这个课程

HDU - 1083 Courses (二分图最大匹配模板)

题意:给出P门课程,N个学生.每一门课程可能有多个学生感兴趣然后我们需要匹配,使得每一门课程都只包含一名对其感兴趣的学生问:能否匹配成立思路:这个就是典型的二分图匹配问题.常用匈牙利算法 完整代码:(一开始写成了无向图....)写成有向图是因为学生是可以剩余的 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; c

二分图的一大泼基础题

[HDU]//1068 Girls and Boys 最大匹配★//1150 Machine Schedule 最小点覆盖★1151 Air Raid 最小路径覆盖★//1179 Ollivanders 最大匹配★1281 棋盘游戏 行列匹配+求关键点★★1498 50 years, 50 colors 行列匹配★1507 Uncle Tom's Inherited Land* 黑白染色+奇偶匹配(1X2的矩形覆盖)★//1528 Card Game Cheater 最大匹配★1845 Jimm

专题之匹配、网络流(一)

1.hdu 2444 The Accomodation of Students(判断二分图+最大匹配)(匈牙利模板) 题意:一共有n个学生,m对关系:A认识B.问能否将所有的人分成两批,每批之间的人都互相认识,如果可以,输出每批的人数.即判断是否为二分图,以及求二分图的最大匹配. 思路:判断是否为二分图(DFS或BFS):求二分图的最大匹配:匈牙利算法. 1 #include<iostream> 2 #include<queue> 3 using namespace std; 4

kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树

二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图. 1.一个二分图中的最大匹配数等于这个图中的最小点覆盖数 König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选