COURSES(poj 1469)
题意:
给你p门课程和n个学生,一个学生可以选0门,1门,或者多门课程,现在要求一个由p个学生组成的集合,满足下列2个条件:
1.每个学生选择一个不同的课程
2.每个课程都有不同的代表
如果满足,就输出YES
否则,输出NO
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<iostream> #include<cstring> #define M 310 using namespace std; int used[M],belong[M],a[M][M],p,n; int find(int i) { for(int j=1;j<=n;j++) if(!used[j]&&a[i][j]) { used[j]=1; if(!belong[j]||find(belong[j])) { belong[j]=i; return 1; } } return 0; } int main() { int T; scanf("%d",&T); while(T--) { memset(a,0,sizeof(a)); memset(belong,0,sizeof(belong)); memset(used,0,sizeof(used)); scanf("%d%d",&p,&n); for(int i=1;i<=p;i++) { int x,y; scanf("%d",&x); for(int j=1;j<=x;j++) { scanf("%d",&y); a[i][y]=1; } } int tot=0; for(int i=1;i<=p;i++) if(find(i)) { memset(used,0,sizeof(used)); tot++; } if(tot==p)printf("YES\n"); else printf("NO\n"); } return 0; }