链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1083

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#problem/C

一共有N个学生跟P门课程,一个学生可以任意选一

门或多门课,问是否达成:

1.每个学生选的都是不同的课(即不能有两个学生选同一门课)

2.每门课都有一个代表(即P门课都被成功选过)

现想组建一个委员会,委员会中的每个学生都要代表不同的课程,且每个课程都有它的代表。

算法分析:这正符合二分图最大匹配的条件。把课程作为二分图中X节点集合,得到最大匹配,如果匹配数等于课程数,则匹配与Y集合的交集,就可看成是这样一个委员会,则输出YES,否则,输出NO。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 305
#define INF 0x3f3f3f3f int n, m, un, vn, G[N][N], used[N], p[N]; int Find(int u)
{
for(int i=; i<=vn; i++)
{
if(G[u][i] && !used[i])
{
used[i] = ;
if(p[i]==- || Find(p[i]))
{
p[i] = u;
return ;
}
}
}
return ;
} int hungary() //匈牙利算法
{
int ans = ;
memset(p, -, sizeof(p)); for(int i=; i<=un; i++)
{
memset(used, , sizeof(used));
if(Find(i)) ans++;
}
return ans;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int i, j, v, k; scanf("%d%d", &n, &m); memset(G, , sizeof(G));
for(i=; i<=n; i++)
{
scanf("%d", &k);
for(j=; j<=k; j++)
{
scanf("%d", &v);
G[i][v] = ;
}
} un = n;
vn = m; if(un==hungary()) printf("YES\n");
else printf("NO\n");
}
return ;
}

傻傻的刷题,加油!

最新文章

  1. Android 图标尺寸与设计
  2. win7 下加载MSCOMCTL.OCX
  3. JS、ActiveXObject、Scripting.FileSystemObject
  4. accept()
  5. vsftpd搭建及配置参数
  6. jdk 1.5
  7. C#学习7
  8. mysql_DML_insert
  9. 2013山东省“浪潮杯”省赛 A.Rescue The Princess
  10. linux下安装greenplum
  11. Android系统源码导入到eclipse
  12. ZUFE OJ 2301 GW I (3)
  13. JAVA入门[8]-测试mybatis
  14. Linux 文本编辑器vi命令
  15. 老男孩Python全栈开发(92天全)视频教程 自学笔记05
  16. 【刷水】之USACO2008资格赛(Bzoj1599-1603)
  17. 如何用VSCode手动编译Ace Editor
  18. .NET并行计算和并发6-获取线程池的最大可用线程数
  19. html学习_表格、表单
  20. linux内核的双链表list_head、散列表hlist_head

热门文章

  1. session第二篇
  2. git基本命令之删除撤销操作
  3. oracle ITL(事务槽)的理解
  4. fio 测试磁盘
  5. IDEA 码云 安装
  6. pip &amp; Jinja2
  7. git实用操作21条
  8. where T:new() 是什么意思
  9. IDEA 工具下导出文件及文件的目录结构插件
  10. nginx常用配置说明