标签:
http://poj.org/problem?id=1469
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19419 | Accepted: 7642 |
Description
Input
Output
Sample Input
2 3 3 3 1 2 3 2 1 2 1 1 3 3 2 1 3 2 1 3 1 1
Sample Output
YES NO
题目大意:
一共有N个学生跟P门课程,一个学生可以任意选一
门或多门课,问是否达成:
1.每个学生选的都是不同的课(即不能有两个学生选同一门课)
2.每门课都有一个代表(即P门课都被成功选过)
输入为:
P N(课程数跟学生数)
接着有P行,格式为Count studenti studenti+1 ……studentcount
(Count表示对课程1感兴趣的学生数,接着有Count个学生)
如第一行3 1 2 3表示学生1跟学生2跟学生3对课程1感兴趣
输出为:
若能满足上面两个要求这输出”YES”,否则为”NO”
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define INF 0x3f3f3f3f #define N 310 int G[N][N], vis[N], used[N]; int n, p; bool Find(int u) { int i; for(i = 1 ; i <= n ; i++) { if(!vis[i] && G[u][i]) { vis[i] = 1; if(!used[i] || Find(used[i])) { used[i] = u; return true; } } } return false; } int main() { int a, b, i, ans, t; scanf("%d", &t); while(t--) { scanf("%d%d", &p, &n); memset(G, 0, sizeof(G)); ans = 0; for(i = 1 ; i <= p ; i++) { scanf("%d", &a); while(a--) { scanf("%d", &b); G[i][b] = 1; } } memset(used, 0, sizeof(used)); for(i = 1 ; i <= p ; i++) { memset(vis, 0, sizeof(vis)); if(Find(i)) ans++; } if(ans == p) printf("YES\n"); else printf("NO\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/qq2424260747/p/4713748.html