| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 7838 | Accepted: 3113 |
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>
int usedif[105];
//usedif[i]记录Y顶点子集中编号为i的顶点是否使用,注意Y子集中的最多顶点数为(7-1)*12+12=84
int link[105];//link[i]记录与Y顶点子集中编号为i的顶点相连的X顶点子集中x的编号
int mat[305][105];//mat[i][j]表示顶点i与j之间是否有边
int gx,gy;//gx为X顶点子集中的顶点数目,gy为Y顶点子集中的顶点数目
bool can(int t) //判断X中的顶点t在Y中是否有顶点与之匹配
{
for(int i=1; i<=gy; i++) //注意范围
{
if(usedif[i]==0&&mat[t][i]) //Y中的顶点i未匹配且t与i之间有边
{
usedif[i]=1;
if(link[i]==-1||can(link[i])) //link[i]=-1表示顶点i还未匹配
//can(link[i])表示顶点i已经匹配而现在唯一的路径,就是走到与i节点匹配的顶点link[i]处继续进行匹配
{
link[i]=t;
return true;
}
}
}
return false;
}
int MaxMatch()
{
int num=0;
memset(link,-1,sizeof(link));
for(int i=1; i<=gx; i++) //对X中的每个顶点在Y中寻找与其匹配的顶点,注意范围
{
memset(usedif,0,sizeof(usedif));
if(can(i)) num++;
}
return num;//返回最大匹配数
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int p,n,t;
while(scanf("%d%d",&p,&n)!=EOF)
{
gx=n;
gy=p;
memset(mat,0,sizeof(mat));
for(int i=1; i<=p; i++)
{
scanf("%d",&t);
for(int j=0; j<t; j++)
{
int x;
scanf("%d",&x);
mat[x][i]=1;
}
}
if(n>=p&&MaxMatch()==p) printf("YES/n");
else printf("NO/n");
}
}
return 0;
}
378

被折叠的 条评论
为什么被折叠?



