题目链接:点击查看

题目大意:给出n个联系人,以及m个分组,现在需要将n个联系人分到m个分组中,需要满足让人数最多的组的人数最少,输出这个值

题目分析:因为是让最大值最小,所以肯定是要用二分解决,因为分组对于人来说是一对多,显然可以让人去找分组,也就是二分图的多重匹配,我们直接用最大流来解决就好了,每次二分答案,根据答案设置流量,若满流增大答案,否则减小答案

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e3+100;struct Edge
{int to,w,next;
}edge[N*N];//边数int head[N],cnt,n,m;bool maze[1010][510];void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(now,0,sizeof(now));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}bool check(int x)
{init();int st=N-1,ed=st-1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(maze[i][j])addedge(i,j+n,1);for(int i=1;i<=n;i++)addedge(st,i,1);for(int i=1;i<=m;i++)addedge(i+n,ed,x);return solve(st,ed)==n;
}int main()
{
//  freopen("input.txt","r",stdin);while(scanf("%d%d",&n,&m)!=EOF&&n+m){memset(maze,false,sizeof(maze));for(int u=1;u<=n;u++){char s[20];scanf("%s",s);int v;while(scanf("%d",&v)){maze[u][v+1]=true;if(getchar()=='\n')break;}}int l=0,r=inf,ans;while(l<=r){int mid=l+r>>1;if(check(mid)){ans=mid;r=mid-1;}elsel=mid+1;}printf("%d\n",ans);}return 0;
}

POJ - 2289 Jamie's Contact Groups(二分图多重匹配)相关推荐

  1. POJ - 3189 Steady Cow Assignment(二分图多重匹配)

    题目链接:点击查看 题目大意:给出n只奶牛以及m个牛棚,接下来给出一个n*m的矩阵,给出每一只奶牛对于每个牛棚的喜爱度,按照降序给出,从rank1到rankm,现在问如何分配牛棚能让所有奶牛中最高的r ...

  2. 【网络流24题】解题报告:E 、圆桌问题(最大流求二分图多重匹配)

    E .圆桌问题(最大流求二分图多重匹配)[省选/NOI- ] 可以直观的想到,二分图的左边是单位,右边是桌子 由于题目的限制 每个单位只能在一个桌子坐一个人 所以我们就把每个单位向各个桌子连一道流量为 ...

  3. poj2112(floyd+二分+二分图多重匹配)

    (感觉是一个比较基础的二分图多重匹配) 题目意思大概就是有K个挤奶点,C个奶牛,一个挤奶点能容下M个奶牛,问如果所有奶牛都被放入挤奶点时,距离最远奶牛得最短距离(距离可以经过其他点) 首先看到可以经过 ...

  4. 网络流三·二分图多重匹配 HihoCoder - 1393

    网络流三·二分图多重匹配 HihoCoder - 1393 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int ma ...

  5. HDU - 3605 Escape(二分图多重匹配-网络流最大流+思维建边+状态压缩)

    题目链接:点击查看 题目大意:到世界末日了,现在人们要逃离去其他的星球,现在给出n个人以及m个星球,再给出每个人可以前往的星球,最后给出每个星球的容量,题目问最多能让多少个人逃离 题目分析:这个题读完 ...

  6. 【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

    [题意] 假设一个试题库中有 n 道试题. 每道试题都标明了所属类别. 同一道题可能有多个类别属性.现要从题库中抽取 m 道题组成试卷.并要求试卷包含指定类型的试题. 试设计一个 满足要求的组卷算法. ...

  7. 网络流三·二分图多重匹配

    描述 学校的秋季运动会即将开始,为了决定参赛人员,需要统计分配比赛选手. 已知班级一共有N名学生,编号依次为1..N. 运动会一共有M项不同的比赛,编号为1..M.第i项比赛每个班需要派出m[i]名选 ...

  8. Jamie's Contact Groups ——(一对多)二分图多重最大匹配

    题目链接:http://poj.org/problem?id=2289 Jamie is a very popular girl and has quite a lot of friends, so ...

  9. 图论:二分图多重匹配

    使用最大流和费用流解决二分图的多重匹配 之前编辑的忘存了好气啊.. 本来打算学完二分图的乱七八糟的匹配之后再去接触网络流的,提前撞到了 之前我们说的二分图最大匹配和二分图最大权匹配有一个特点,那就是没 ...

最新文章

  1. 学python有哪些书推荐-有哪些Python学习路线值得推荐?线路及书籍推荐都在这里...
  2. matlab 折线图_MATLAB作图实例:13:折线图和条形图的双轴图
  3. 本地搭建K8s环境,并配置Ingress代理(1)
  4. windows如何调用Linux的API,Windows和Native API中的系统调用?
  5. 线性回归(三)---岭回归
  6. ddt python_python之ddt模式随记
  7. CentOS 6.3 上网慢问题
  8. matlab单回路和串级控制回路,单回路和串级控制系统仿真研究
  9. mysql中计算最大回撤_基金最大回撤算例(Java 1.8)
  10. 应用分发平台之苹果超级签名流程分析及API错误
  11. 算法训练 Beaver's Calculator (蓝桥杯)
  12. (附源码)springboot毕业论文管理系统 毕业设计 030946
  13. 如何安装谷歌服务框架?(Google三件套下载教程)
  14. 2020最全Python内置函数大全!赶快收藏起来!
  15. 求N分之一序列的前N项和
  16. 深化“智能二道门”建设,化工厂人员定位系统深度解析!
  17. 计算机视觉英语论文,计算机视觉导论论文中英双语版(10页)-原创力文档
  18. Java IP归属地查询(离线方式+在线方式,内附查询IP方法)
  19. H5游戏(一)登录某某首富H5游戏之WebSockets初涉 易语言wss
  20. javascript 对象{‘key1’:‘value1‘,‘key2‘:‘value2‘} 转化为数组 [{‘key1‘:‘value1‘},{‘key2‘:‘name2‘}]

热门文章

  1. 创建springmvc配置
  2. Condition.doSignal
  3. MyBatis创建SqlSession-有没有更好的拿到SqlSessionTemplate 的方法?
  4. 将session维护在客户端
  5. 字节流复制文本文件【应用】
  6. springboot集成rocketmq消费者
  7. 从源码深处体验Spring核心技术--IOC容器初体验
  8. 函数式接口作为方法的返回值类型案例
  9. ES6新特性之class类的基本语法
  10. 找不到文件、主类名和文件名不一致、缺少分号的解决方法