POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)
<题目链接>
题目大意:
有n个人,每个人都有一个或者几个能够归属的分类,将这些人分类到他们能够归属的分类中后,使所含人数最多的分类值最小,求出该分类的所含人数值。
解题分析:
看到求最大最小的问题,我们首先会想到二分答案,二分枚举所含人数最大的分块中所含人的数量,然后,根据枚举出的数量,进行二分图的多重匹配,如果当前分块所含人数<枚举的上限,那么就暂时将该人分配当前分块,如果当前分块已满,那么就枚举当前分块中的所有人,看是否能够将其分配到其它分块,如果可以,那么就将正在匹配的人分配到那个能够分配到其它分块的人的位置上,最后,判断是否所有人都能够分配到分块中,即二分答案的check。
1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <vector> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int N = 1e3+10; 10 int n,m; 11 int vis[N],match[N][N],num[N]; 12 vector<int>vec[N]; 13 string s; 14 bool dfs(int u,int mx){ 15 for(int i=0;i<vec[u].size();i++){ 16 int v=vec[u][i]; 17 if(!vis[v]){ 18 vis[v]=1; 19 if(num[v]<mx){ //如果该分块中人数小于当前缩枚举的容量,则将该人(暂时)分配到该分块 20 match[v][++num[v]]=u; 21 return true; 22 } 23 for(int k=1;k<=num[v];k++){ 24 if(dfs(match[v][k],mx)){ //如果该分块中的人数已满,就枚举这个分块之前分配的所有人,看其是否能够分配到其它分块 25 match[v][k]=u; //如果该分块的第k个人能够分配到其它分块,那么u就能够分配到当前分块 26 return true; 27 } 28 } 29 } 30 } 31 return false; 32 } 33 int Hungary(int mx){ 34 int ans=0; 35 memset(num,0,sizeof(num)); 36 for(int i=1;i<=n;i++){ 37 memset(vis,0,sizeof(vis)); 38 ans+=dfs(i,mx); 39 } 40 return ans; 41 } 42 int main(){ 43 while(scanf("%d%d",&n,&m)!=EOF,n||m){ 44 for(int i=0;i<=n;i++)vec[i].clear(); 45 for(int i=1;i<=n;i++){ 46 int data; 47 cin>>s; 48 while(true){ 49 scanf("%d",&data); 50 vec[i].push_back(data+1); 51 if(getchar()=='\n')break; 52 } 53 } 54 int l=1,r=n,ans=0; 55 while(l<=r){ //二分答案,枚举所含人数最多的分块中人的数量 56 int mid=(l+r)>>1; 57 if(Hungary(mid)==n)ans=mid,r=mid-1; //如果所有人都能够分配到分块中(即,当前二分的答案满足题意),那么就继续缩小 枚举的分块中的最多人数数量 58 else l=mid+1; 59 } 60 printf("%d\n",ans); 61 } 62 }
2018-11-17
转载于:https://www.cnblogs.com/00isok/p/9972539.html
POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)相关推荐
- POJ - 2289 Jamie's Contact Groups(二分图多重匹配)
题目链接:点击查看 题目大意:给出n个联系人,以及m个分组,现在需要将n个联系人分到m个分组中,需要满足让人数最多的组的人数最少,输出这个值 题目分析:因为是让最大值最小,所以肯定是要用二分解决,因为 ...
- POJ - 2584 T-Shirt Gumbo 二分多重匹配
题目链接 题意:二分多重匹配的裸题,与匈牙利算法不同的之前的男女匹配不同,这个题目的题意是每一个人可以选择多种型号的衣服,并且每一种衣服可以很多人穿,但是每件衣服有数量限制,问最多有多少匹配数. 我们 ...
- 圆桌问题 二分多重匹配+输出解
题目描述 Description 假设有来自n 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri ni , =1,2,, .会议餐厅共有m张餐桌,每张餐桌可容纳ci( 1,2, ,m) ...
- Jamie's Contact Groups ——(一对多)二分图多重最大匹配
题目链接:http://poj.org/problem?id=2289 Jamie is a very popular girl and has quite a lot of friends, so ...
- POJ 2584 T-Shirt Gumbo 最大流和多重匹配
点击打开链接 T-Shirt Gumbo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2488 Accepted: 1 ...
- Coins (多重背包)模板题
模板请看上一篇博客 Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. One day Hibi ...
- 【POJ - 1330】Nearest Common Ancestors(lca,模板题)
题干: A rooted tree is a well-known data structure in computer science and engineering. An example is ...
- POJ 2409 Let it Bead【Polya定理】(模板题)
<题目链接> 题目大意: 用k种颜色对n个珠子构成的环上色,旋转.翻转后相同的只算一种,求不等价的着色方案数. 解题分析: 对于这种等价计数问题,可以用polay定理来解决,本题是一道po ...
- hdu2191 买大米 多重背包 模板题
念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- hdu 2191 悼念512汶川大地震遇难同胞 【多重背包】(模板题)
题目链接:https://vjudge.net/problem/HDU-2191 悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 ...
最新文章
- Node.js 简单入门
- 市场有变,中小型基因测序机构机会来了
- php企业站数据表,php – 创建一个站点来查询表的数据库
- 数学大师丘成桐:中国的科技至少要倒退20年
- spark 把一列数据合并_Spark DataFrame列的合并与拆分
- 一瞬间-自定义一个漂亮的日期控件
- matlab遥感代码,遥感融合定量评价matlab程序代码
- linux--封装redhat镜像
- 安卓导航车机root方法_手机、平板这么好用,为什么车机还这么垃圾
- 解决1 error and 0 warnings potentially fixable with the `--fix` option.
- JAVA实现经典游戏俄罗斯方块
- py实战某股票一周收盘价折线图绘制
- nginx安全漏洞(CVE-2021-23017)修复
- HTML5常用的文本标签及css字体样式属性
- 深圳一AI公司人脸数据泄露,超256万用户敏感信息在“裸奔”!
- oracle函数之NULLIF
- IG出事了!数百万名人用户资料被曝光
- Windows机制下的游戏编程实例一
- python关键词 打标签详解_Python学习日记13|利用python制作简书首页热门文章关键词标签云...
- unigui发布_uniGUI试用笔记(十一) ---UNIDBGRID
热门文章
- python字典forward_《Python机器学习基础教程》
- C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
- Yii需要php版本,yii框架2.0.9版本发布了
- 分区表的误区:性能提升
- MySQL 非空约束(NOT NULL)入门
- php文档注释提取工具phpdocumentor的使用
- python习题练习(chapater 5 -- python核心编程)
- Delphi - 注入的方式来禁止任务管理器
- python中的特殊函数__call__
- SQL SERVER数据库优化相关资料