poj 1469 COURSES(简单)(二部图匹配 DFS)
2015-10-10 15:18
429 查看
COURSES
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:
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
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:
P N
Count1 Student1 1 Student1 2 ... Student1 Count1
Count2 Student2 1 Student2 2 ... Student2 Count2
...
CountP StudentP 1 StudentP 2 ... StudentP 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
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
Sample Output
代码:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 19716 | Accepted: 7770 |
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:
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
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:
P N
Count1 Student1 1 Student1 2 ... Student1 Count1
Count2 Student2 1 Student2 2 ... Student2 Count2
...
CountP StudentP 1 StudentP 2 ... StudentP 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
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
代码:
#include<stdio.h> #include<string.h> #define maxn 301 int p,n; bool course[maxn][maxn],used[maxn]; int match[maxn]; int DFS(int k) { int temp; for(int i=1;i<=n;i++) { if(course[k][i]&&!used[i]) { used[i]=1; temp=match[i]; match[i]=k; if(temp==-1||DFS(temp)) return 1; match[i]=temp; } } return 0; } int Maxmatch() { int maxnum=0; memset(match,-1,sizeof(match)); for(int i=1;i<=p;i++) { memset(used,0,sizeof(used)); if(DFS(i)) maxnum++; if(maxnum==p)break; } return maxnum; } int main() { int t,num,k; scanf("%d",&t); while(t--) { scanf("%d%d",&p,&n); memset(course,0,sizeof(course)); for(int i=1;i<=p;i++) { scanf("%d",&num); for(int j=0;j<num;j++) { scanf("%d",&k); course[i][k]=1; } } if(Maxmatch()==p) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 让ubuntu 的命令提示符前不显示绝对路径
- 清除掉Provisioning Profile中的多余的证书
- 最全的CSS浏览器兼容问题
- IOS上传文件到JAVA服务器
- mysql按时间段查询
- [MySQL] - errno:150
- ListView实现分页加载(三)实现分页加载
- 【SSH】——梳理三大框架
- Android的MVP模式应用(Login)
- 用户空间与内核的接口
- 连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
- UIView 的 属 性
- 傅里叶变换
- 漂亮的CSS3圆角按钮组合DEMO演示
- AspectJ切入点语法详解(最全,不需要看其他了)
- Android开发最佳实践
- 第三章 ANR
- cocos各平台横屏竖屏设置方式
- js获取高度
- 利用oracle dbms_scheduler执行windows的bat脚本加载数据