很明显,本题目求的是二分图的最大匹配问题,只要匹配等于课程门数,就可以结束程序输出“YES”,否则当循环完之后还没有覆盖住所有的课程,则输出‘NO’
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 #define MAXN 301 6 int match[MAXN]; 7 int map[MAXN][MAXN]; 8 int vis[MAXN]; 9 int P,N; 10 int find(int x) 11 { 12 for(int i = 1;i <=N;i++) 13 { 14 if(map[x][i]&&!vis[i]) 15 { 16 vis[i] = 1; 17 if(!match[i] || find(match[i])) 18 { 19 match[i] = x; 20 return 1; 21 } 22 } 23 } 24 return 0; 25 } 26 27 int main() 28 { 29 int T,n,a; 30 scanf("%d",&T); 31 while(T--) 32 { 33 memset(map,0,sizeof(map)); 34 memset(match,0,sizeof(match)); 35 scanf("%d%d",&P,&N); 36 for(int i=1;i<=P;i++) 37 { 38 scanf("%d",&n); 39 for(int j=1;j<=n;j++) 40 { 41 scanf("%d",&a); 42 map[i][a]=1; 43 } 44 } 45 46 int ans=0; 47 for(int i=1;i<=P;i++) 48 { 49 memset(vis,0,sizeof(vis)); 50 ans+=find(i); 51 if(ans==P) 52 break; 53 } 54 55 if(ans==P) 56 printf("YES\n"); 57 else 58 printf("NO\n"); 59 } 60 system("pause"); 61 return 0; 62 }