暑假集训每日一题 0726 (二分图匹配)
题目大意:有n个学生和p门课程,每个学生选修了p门课程中的一些,问能否找到p个课代表,一个人最多只能当一门课的课代表。
分析:建立二分图,求最大匹配,判断最大匹配数目是否为p
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <string.h> #define N 301 int g[N][N]; int x[N],y[N],vis[N]; int p,n; int path(int u) { int v; for(v=1;v<=p;v++) if(!vis[v]&&g[u][v]) { vis[v]=1; if(y[v]==-1 || path(y[v])) { x[u]=v; y[v]=u; return 1; } } return 0; } int maxmatch() { int i,ret=0; memset(x,-1,sizeof(x)); memset(y,-1,sizeof(y)); for(i=1;i<=n;i++) { if(x[i]!=-1) continue; memset(vis,0,sizeof(vis)); ret+=path(i); } return ret; } int main() { int t,i,j,cnt; scanf("%d",&t); while(t--) { scanf("%d%d",&p,&n); memset(g,0,sizeof(g)); for(i=1;i<=p;i++) { scanf("%d",&cnt); while(cnt--) { scanf("%d",&j); g[j][i]=1; } } if(maxmatch()==p) puts("YES"); else puts("NO"); } return 0; }