(匹配)Courses -- hdu --1083
2024-10-19 00:25:34
链接:
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 ;
}
傻傻的刷题,加油!
最新文章
- Android 图标尺寸与设计
- win7 下加载MSCOMCTL.OCX
- JS、ActiveXObject、Scripting.FileSystemObject
- accept()
- vsftpd搭建及配置参数
- jdk 1.5
- C#学习7
- mysql_DML_insert
- 2013山东省“浪潮杯”省赛 A.Rescue The Princess
- linux下安装greenplum
- Android系统源码导入到eclipse
- ZUFE OJ 2301 GW I (3)
- JAVA入门[8]-测试mybatis
- Linux 文本编辑器vi命令
- 老男孩Python全栈开发(92天全)视频教程 自学笔记05
- 【刷水】之USACO2008资格赛(Bzoj1599-1603)
- 如何用VSCode手动编译Ace Editor
- .NET并行计算和并发6-获取线程池的最大可用线程数
- html学习_表格、表单
- linux内核的双链表list_head、散列表hlist_head