题目链接:http://poj.org/problem?id=1469 http://acm.hdu.edu.cn/showproblem.php?pid=1083
题意:有n个学生p门课, 每门课有m个人可以选择
1.每个人最后都有单独的一门课;
2.每门课都有人选;
满足两个条件输出YES,否则NO;
其实就是求最大匹配是否等于p;
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 310 int maps[N][N], vis[N], used[N], p, n, ans; bool Find(int u) { for(int i=1; i<=p; i++) { if(!vis[i] && maps[u][i]) { vis[i] = 1; if(!used[i] || Find(used[i])) { used[i] = u; return true; } } } return false; } int main() { int T, m, x; scanf("%d", &T); while(T--) { memset(maps, 0, sizeof(maps)); memset(used, 0,sizeof(used)); scanf("%d%d", &p, &n); for(int i=1; i<=p; i++) { scanf("%d", &m); for(int j=1; j<=m; j++) { scanf("%d", &x); maps[x][i] = 1;///表示x对课程i感兴趣; } } ans = 0; for(int i=1; i<=n; i++) { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } if(ans==p) printf("YES "); else printf("NO "); } return 0; }