<题目链接>

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

解题分析:

  看到求最大最小的问题,我们首先会想到二分答案,二分枚举所含人数最大的分块中所含人的数量,然后,根据枚举出的数量,进行二分图的多重匹配,如果当前分块所含人数<枚举的上限,那么就暂时将该人分配当前分块,如果当前分块已满,那么就枚举当前分块中的所有人,看是否能够将其分配到其它分块,如果可以,那么就将正在匹配的人分配到那个能够分配到其它分块的人的位置上,最后,判断是否所有人都能够分配到分块中,即二分答案的check。

 #include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; const int N = 1e3+;
int n,m;
int vis[N],match[N][N],num[N];
vector<int>vec[N];
string s;
bool dfs(int u,int mx){
for(int i=;i<vec[u].size();i++){
int v=vec[u][i];
if(!vis[v]){
vis[v]=;
if(num[v]<mx){ //如果该分块中人数小于当前缩枚举的容量,则将该人(暂时)分配到该分块
match[v][++num[v]]=u;
return true;
}
for(int k=;k<=num[v];k++){
if(dfs(match[v][k],mx)){ //如果该分块中的人数已满,就枚举这个分块之前分配的所有人,看其是否能够分配到其它分块
match[v][k]=u; //如果该分块的第k个人能够分配到其它分块,那么u就能够分配到当前分块
return true;
}
}
}
}
return false;
}
int Hungary(int mx){
int ans=;
memset(num,,sizeof(num));
for(int i=;i<=n;i++){
memset(vis,,sizeof(vis));
ans+=dfs(i,mx);
}
return ans;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF,n||m){
for(int i=;i<=n;i++)vec[i].clear();
for(int i=;i<=n;i++){
int data;
cin>>s;
while(true){
scanf("%d",&data);
vec[i].push_back(data+);
if(getchar()=='\n')break;
}
}
int l=,r=n,ans=;
while(l<=r){ //二分答案,枚举所含人数最多的分块中人的数量
int mid=(l+r)>>;
if(Hungary(mid)==n)ans=mid,r=mid-; //如果所有人都能够分配到分块中(即,当前二分的答案满足题意),那么就继续缩小 枚举的分块中的最多人数数量
else l=mid+;
}
printf("%d\n",ans);
}
}

2018-11-17

POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)的更多相关文章

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

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

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

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

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

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

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

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

  5. POJ 2289 Jamie's Contact Groups (二分+最大流)

    题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的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. POJ2289 Jamie's Contact Groups —— 二分图多重匹配/最大流 + 二分

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

  9. POJ - 2289 Jamie's Contact Groups (二分图多重匹配)

    题意:N个人,M个团体.每个人有属于自己的一些团体编号.将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少. 分析:一个一对多的二分图匹配,且是最大值最小化问题.二分图的多重匹配建 ...

随机推荐

  1. JS和Jquery获取和修改label的值的示例代码

    abel标签在JS和Jquery中使用不能像其他标签一样用value获取它的值,下面有个不错的示例,希望大家可以学习下 来源:  <  JS和Jquery获取和修改label的值的示例代码  & ...

  2. js 获取当前的网址

    http://www.xcx.cc/index.php/home/index/ind?idf=12321var $cur_url=window.location.href; //获取全部的网址var ...

  3. ob_start用法详解

    用PHP的ob_start(); 一. 相关函数简介:1.Flush:刷新缓冲区的内容,输出.函数格式:flush()说明:这个函数经常使用,效率很高.2.ob_start :打开输出缓冲区函数格式: ...

  4. SpringMVC文件下载与JSON格式

    点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...

  5. BeatifulSoup模块

    一.介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  6. mybatis的批量删除操作

    需求描述:将符合某条件的几条记录删除 解决思路:对于多个id,可以使用sql关键词 in ,只要满足数据库的id在你的id集合或者list中,就删除,从而实现批量删除.循环delete方法是在是low ...

  7. 安装AngularJS Batarang遇到的问题

    AngularJS Batarang是AngularJS在谷歌浏览器上的一个调试工具,因为国内目前无法访问谷歌浏览器应用商店,所以Batarang只能离线安装.不过在安装这个插件的过程中遇到了一些麻烦 ...

  8. Pthon面向对象之基础

    命名空间 class Course: language = 'Chinese' def __init__(self,teacher,name,period,price): self.teacher = ...

  9. JQuery之左侧菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 从零开始学C#——数据类型(三)

    C#数据类型 在C#中,变量分为以下几种类型: 值类型 引用类型 指针类型 值类型 值类型变量可以直接分配给一个值,他们是从类System.ValucTpyc中派生. 值类型直接包含数据,比如int. ...