又是裸的二分图最大匹配。。注意最大匹配数等于课程数就ok了。。。。。。貌似做的都是水题。。。。。。。题目:
Time Limit:1000MS | Memory Limit:10000K | |
Total Submissions:11428 | Accepted:4485 |
Description
- every student in the committee represents a different course (a student can represent a course if he/she visits that course)
- each course has a representative in the committee
Input
P N
Count1 Student 1 1Student 1 2... Student 1 Count1
Count2 Student 2 1Student 2 2... Student 2 Count2
...
CountP Student P 1Student P 2... Student P CountP
The first line in each data set contains two positive integers separated by one blank: P (1 <= P <= 100) - the number of courses and N (1 <= N <= 300) - the number of students. The next P lines describe in sequence of the courses �from course 1 to course P, each line describing a course. The description of course i is a line that starts with an integer Count i (0 <= Count i <= N) representing the number of students visiting course i. Next, after a blank, you抣l find the Count i students, visiting the course, each two consecutive separated by one blank. Students are numbered with the positive integers from 1 to N.
There are no blank lines between consecutive sets of data. Input data are correct.
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 NOac代码,,不过效率不高,,跑了600多ms,,,,欢迎大家提供高效代码
#include <iostream> #include <string.h> #include <vector> #include <cstdio> using namespace std; vector<int> aa[105]; int visted[305],flag[305]; bool dfs(int x){ for(int i=0;i<aa[x].size();++i){ if(!visted[aa[x][i]]){ visted[aa[x][i]]=1; if(!flag[aa[x][i]]||dfs(flag[aa[x][i]])){ flag[aa[x][i]]=x; return true; } } } return false; } int main(){ int kk; scanf("%d",&kk); while(kk--){ int p,n; memset(aa,0,sizeof(aa)); memset(flag,0,sizeof(flag)); scanf("%d%d",&p,&n); int num,x; for(int i=1;i<=p;++i){ scanf("%d",&num); while(num--){ scanf("%d",&x); aa[i].push_back(x); } } int sum=0; for(int i=1;i<=p;++i){ memset(visted,0,sizeof(visted)); if(dfs(i)) sum++; } if(sum==p) printf("YES\n"); else printf("NO\n"); } return 0; }