题目含义
每门课有几名同学参加,要求每门课选一个代表,当然代表只能由参加这门课的学生中选,并且一个人只能当一门课的代表
题目分析
二分图匹配,是课程去找一个同学与它匹配,如果每门课都匹配上了就输出yes,否则no
题目代码
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; const int maxn=3e4+7; struct edge{ int to,next; }e[maxn]; int head[200],tot; void add(int u,int v){ e[tot].to=v; e[tot].next=head[u]; head[u]=tot++; } bool vis[400]; int course[400],t,m,n,x,y; void init(){ tot=0; memset(head,-1,sizeof(head)); memset(course,0,sizeof(course)); } bool find(int u){ for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].to; if(vis[v])continue; vis[v]=true; if(!course[v]||find(course[v])){ course[v]=u;return true; } }return false; } int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&m,&n); init(); for(int i=1;i<=m;i++){ scanf("%d",&x); for(int j=1;j<=x;j++){ scanf("%d",&y); add(i,y); } } int sum=0; for(int i=1;i<=m;i++){ memset(vis,false,sizeof(vis)); if(find(i))sum++; } if(sum==m)printf("YES "); else printf("NO "); } return 0; }