题意:N个人,M个团体。每个人有属于自己的一些团体编号。将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少。

分析:一个一对多的二分图匹配,且是最大值最小化问题。二分图的多重匹配建立在匈牙利算法的基础上,令每个Y部的点可匹配多个点,但是规定其上限,超过上限就要在已有的匹配点中寻找增广路。对于X部的点,只要有一个点没有被匹配,那么算法失败。以此二分确定答案,注意二分的姿势...

该题可做模板。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<vector>
  7. using namespace std;
  8. typedef long long LL;
  9. const int maxn = 1e3+,maxm = 5e5+;
  10. int N,M;
  11. struct Node{
  12. int K[maxn];
  13. }link[maxn];
  14. int cnt[maxn];
  15. struct Edge{
  16. int to,next;
  17. }edges[maxm];
  18. int head[maxn],tot;
  19. int linker[maxn];
  20. bool used[maxn];
  21.  
  22. void init()
  23. {
  24. tot=;
  25. memset(head,-,sizeof(head));
  26. }
  27.  
  28. void AddEdge(int u,int v)
  29. {
  30. edges[tot].to = v;
  31. edges[tot].next = head[u];
  32. head[u] = tot++;
  33. }
  34.  
  35. bool dfs(int u,int limit){
  36. int v;
  37. for(int i=head[u];~i;i = edges[i].next){
  38. v = edges[i].to;
  39. if(!used[v]){
  40. used[v]=true;
  41. if(cnt[v]<limit){
  42. link[v].K[cnt[v]++]=u;
  43. return true;
  44. }
  45. for(int j=;j<cnt[v];++j){
  46. if(dfs(link[v].K[j],limit)){
  47. link[v].K[j]=u;
  48. return true;
  49. }
  50. }
  51. }
  52. }
  53. return false;
  54. }
  55.  
  56. bool hungary(int limit){
  57. memset(cnt,,sizeof(cnt));
  58. for(int u=;u<=N;u++){
  59. memset(used,,sizeof(used));
  60. if(!dfs(u,limit)) return false; //只要有一个人不能匹配则失败
  61. }
  62. return true;
  63. }
  64.  
  65. int main()
  66. {
  67. #ifndef ONLINE_JUDGE
  68. freopen("in.txt","r",stdin);
  69. freopen("out.txt","w",stdout);
  70. #endif
  71. int T,u,v,tmp,k;
  72. char c;
  73. while(scanf("%d%d",&N,&M)==){
  74. if(!N) break;
  75. init();
  76. for(int u=;u<=N;++u){
  77. char op[maxn];
  78. scanf("%s",op);
  79. while(true){
  80. scanf("%d%c",&v,&c);
  81. AddEdge(u,v+);
  82. if(c == '\n') break;
  83. }
  84. }
  85. int L=,R=N,mid,ans=N;
  86. while(L<=R){
  87. mid = (L+R)>>;
  88. if(hungary(mid)){
  89. ans = mid;
  90. R = mid-;
  91. }
  92. else L=mid+;
  93. }
  94. printf("%d\n",ans);
  95. }
  96. return ;
  97. }

POJ - 2289 Jamie's Contact Groups (二分图多重匹配)的更多相关文章

  1. POJ 2289 Jamie's Contact Groups 二分图多重匹配 难度:1

    Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 6511   Accepted: ...

  2. POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】

    Jamie's Contact Groups Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I ...

  3. POJ 2289 Jamie's Contact Groups(多重匹配+二分)

    题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...

  4. POJ2289 Jamie's Contact Groups —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 6 ...

  5. Poj 2289 Jamie's Contact Groups (二分+二分图多重匹配)

    题目链接: Poj 2289 Jamie's Contact Groups 题目描述: 给出n个人的名单和每个人可以被分到的组,问将n个人分到m个组内,并且人数最多的组人数要尽量少,问人数最多的组有多 ...

  6. POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)

    POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...

  7. poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】

    题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K ...

  8. POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)

    <题目链接> 题目大意: 有n个人,每个人都有一个或者几个能够归属的分类,将这些人分类到他们能够归属的分类中后,使所含人数最多的分类值最小,求出该分类的所含人数值. 解题分析: 看到求最大 ...

  9. POJ 2289 Jamie's Contact Groups & POJ3189 Steady Cow Assignment

    这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...

随机推荐

  1. jQuery Colorbox使用教程

    jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,最关键的是大小只有10KB,当然我主要是用来弹出图片啦,(之前介绍过jquery Fancybox插件,个人很喜欢).jQuery ...

  2. 什么是ORM,以及在php上的使用?

    ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射.为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却 ...

  3. 【BZOJ】1661: [Usaco2006 Nov]Big Square 巨大正方形(暴力)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1661 暴力大法好... 枚举对角线(注意,一种对角线2种情况就行了,自己想...) 然后可以算出其它 ...

  4. Canvas清屏的实现

    /** * Canvas清屏的操作 * * 參考资料: http://blog.csdn.net/lfdfhl/article/details/9076001 * */ private void cl ...

  5. (转)Unity笔记之编辑器(CurveField、DoubleField、EnumMaskField、EnumPopup) ... ...

    1. CurveField创建的是一个类型为AnimationCurve的曲线变量,看代码: [code]csharpcode: using UnityEngine; using System.Col ...

  6. Charlse 抓包

    下载Charlse:https://www.charlesproxy.com/ 安装使用: https://www.cnblogs.com/ceshijiagoushi/p/6812493.html ...

  7. 【C语言天天练(二)】预处理

    引言: 学C语言之初.一提到预处理,脑子里想到的就是#define的宏定义以及#include包括的头文件.后来随着对C的深入学习发现.预处理不止这些.比方条件编译.提前定义的宏等等.以下对此进行总结 ...

  8. 使用ghost硬盘对拷备份系统

    公司有台server装了OA系统.要备份数据.同一时候假设系统出错之后可以及时回复.所以有买了块同型号硬盘. 用ghost的硬盘对拷功能,将原硬盘的系统和数据拷到新硬盘上.新硬盘挂到server上.当 ...

  9. svn服务器配置 for mac

      本文转载至 http://blog.sina.com.cn/s/blog_5e42f31a010156z4.html 1.找到合适的目录,新建一个版本库的目录:mkdir svn 创建版本库:sv ...

  10. uiautomatorviewer.bat使用方法

    在android目录下找到uiautomatorviewer.bat,然后双击,页面的第二个按钮连接设备 D:\Program Files\android-sdk-windows\tools\uiau ...