COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18993 Accepted: 7486
Description
Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions:Input
Your program should read sets of data from the std input. The first line of the input contains the number of the data sets. Each data set is presented in the following format:Output
The result of the program is on the standard output. For each input data set the program prints on a single line YES if it is possible to form a committee and NO otherwise. There should not be any leading blanks at the start of the line.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
Source
Southeastern Europe 2000簡單的二分匹配,將學生看成要匹配的集合X,將課程看做要匹配的集合Y,當最大匹配 == 課程數的時候,就輸出YES,否則就輸出NO。
代碼如下:
#include#include #include #include using namespace std; const int N = 500; int p, n; int s[N][N], c[N], used[N]; bool find(int x) { for(int j = 1; j <= p; j++) { if(s[x][j] == 1 && used[j] == 0) { used[j] = 1; if(c[j] == 0 || find(c[j])) { c[j] = x; return true; } } } return false; } int main() { int t = 0; scanf(%d, &t); while(t--) { scanf(%d%d, &p, &n); int x, st; memset(s, 0, sizeof(s)); memset(c, 0, sizeof(c)); for(int i = 1; i <= p; i++) { scanf(%d, &x); while(x--) { scanf(%d, &st); s[st][i] = 1; } } int all = 0; for(int i = 1; i <= n; i++) { memset(used, 0, sizeof(used)); if(find(i)) all+= 1; } if(all == p) printf(YES ); else printf(NO ); } return 0; }