POJ 1469 COURSES(二分匹配-hungary)
2015-12-31 13:09
405 查看
Description
n名学生上p们课,每门学生都有自己要去上的几门课,问每门课是否都有学生去上
Input
第一行为一个整数T表示用例组数,每组用例第一行为两个整数n和p表示学生人数和课程数,之后n行每行首先输入一个整数num表示这名学生要去上的课程数量,之后num个整数表示这名学生要上的课
Output
对于每组用例,如果每门课都有学生去上则输出YES,否则输出NO
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
Solution
二分匹配裸题,判断最大匹配数是否为p即可
Code
n名学生上p们课,每门学生都有自己要去上的几门课,问每门课是否都有学生去上
Input
第一行为一个整数T表示用例组数,每组用例第一行为两个整数n和p表示学生人数和课程数,之后n行每行首先输入一个整数num表示这名学生要去上的课程数量,之后num个整数表示这名学生要上的课
Output
对于每组用例,如果每门课都有学生去上则输出YES,否则输出NO
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
Solution
二分匹配裸题,判断最大匹配数是否为p即可
Code
#include<cstdio> #include<iostream> #include<cstring> using namespace std; #define maxn 1111 int uN,vN;//u,v数目 int g[maxn][maxn];//编号是0~n-1的 int linker[maxn]; bool used[maxn]; bool dfs(int u) { int v; for(v=0;v<vN;v++) if(g[u][v]&&!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } return false; } int hungary() { int res=0; int u; memset(linker,-1,sizeof(linker)); for(u=0;u<uN;u++) { memset(used,0,sizeof(used)); if(dfs(u)) res++; } return res; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&uN,&vN); memset(g,0,sizeof(g)); for(int i=0;i<uN;i++) { int num,j; scanf("%d",&num); while(num--) { scanf("%d",&j); g[i][j-1]=1; } } if(hungary()==uN)printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- 读取xml文件"分析 EntityName 时出错"的解决方案
- [转载] Memory Layout of C programs
- eclipse技巧总结
- 垃圾回收1
- python数据库连接池
- Hack、自适应、针对浏览器写样式随手笔记
- eclipse技巧总结
- iOS 轮盘动态效果动画
- UIImageView压缩不变形处理
- 面向对象分析与设计(C++)课堂笔记
- 2015年部分互联网公司笔试综合题及答案
- LSP修复--浏览器被劫持
- 亦步亦趋在CentOS 6.4下安装Oracle 11gR2(x64)
- 【翻译自mos文章】在hp-ux操作系统下以非root用户安装tusc
- Codeforces Good Bye 2015 ABCDE
- UIBezierPath类介绍
- vertical-align:middle 高度居中
- 自媒体人淘宝鬼脚七剃度出家
- 正则表达式入门详解 转自http://deerchao.net/tutorials/regex/regex.htm 与大家分享
- js 倒计时 时间戳