博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(匹配)Courses -- hdu --1083
阅读量:6294 次
发布时间:2019-06-22

本文共 1401 字,大约阅读时间需要 4 分钟。

链接:

 

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

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

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

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

 

 

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

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

 

 

代码:

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

 

傻傻的刷题,加油!

转载于:https://www.cnblogs.com/YY56/p/4720022.html

你可能感兴趣的文章
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>