Description
- 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
Input
P N
Count1 Student 1 1 Student 1 2 ... Student 1 Count1
Count2 Student 2 1 Student 2 2 ... Student 2 Count2
...
CountP Student P 1 Student P 2 ... Student P 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抣l 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.
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
Source
我开始读错题了 悲剧
#include<stdio.h>
#include<string.h>
bool Map[500][500];
bool Flag[500];
int Mark[500];
bool Find(int x,int N)
{
int i;
for(i=1;i<=N;i++)
{
if(!Map[x][i]||Flag[i])
continue;
Flag[i]=true;
if(!Mark[i]||Find(Mark[i],N))
{
Mark[i]=x;
return true;
}
}
return false;
}
int main()
{
int Count;
int n;
int N,P;
int i;
int t;
int x,y;
scanf("%d",&n);
while(n--)
{
Count=0;
memset(Mark,0,sizeof(Mark));
memset(Map,false,sizeof(Map));
scanf("%d%d",&P,&N);
// if(N==P)
// {
for(x=1;x<=P;x++)
{
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d",&y);
Map[x][y]=true;
}
}
for(i=1;i<=P;i++)
{
memset(Flag,false,sizeof(Flag));
if(Find(i,N))
Count++;
}
if(Count==P)
printf("YES\n");
else
printf("NO\n");
// }
// else
// printf("NO\n");
}
return 0;
}