poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】
Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 8473 | Accepted: 2875 |
Description
Input
Output
Sample Input
- 3 2
- John 0 1
- Rose 1
- Mary 1
- 5 4
- ACM 1 2 3
- ICPC 0 1
- Asian 0 2 3
- Regional 1 2
- ShangHai 0 2
- 0 0
Sample Output
- 2
- 2
Source
题解:
一对多的二分图多重匹配问题。网络流建图:源点到每个人连边,边权为1;每个人到可以考虑选择的组连边,边权为1;每个组到汇点连边,边权为求解的最小值。这个最小值很明显可以想到二分求解。
代码:
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #include <queue>
- #include <cstring>
- using namespace std;
- const int N = ;
- const int M = 1e6;
- const int inf = 1e9;
- int n, m, S, T;
- int dep[N], cur[N];
- int head[N];
- struct Edge{
- int v, c, nex;
- Edge(int _v=,int _c=,int _nex=):v(_v),c(_c),nex(_nex){}
- }E[M];
- int cnt;
- void add(int u, int v, int c){
- E[cnt].v = v;
- E[cnt].c = c;
- E[cnt].nex = head[u];
- head[u] = cnt++;
- }
- bool bfs() {
- queue<int> q;
- memset(dep, -, sizeof(dep));
- q.push(S); dep[S] = ;
- while(!q.empty()) {
- int u = q.front(); q.pop();
- for(int i = head[u]; ~i; i = E[i].nex) {
- int v = E[i].v;
- if(E[i].c && dep[v] == -) {
- dep[v] = dep[u] + ;
- q.push(v);
- }
- }
- }
- return dep[T] != -;
- }
- int dfs(int u, int flow) {
- if(u == T) return flow;
- int w, used=;
- for(int i = head[u]; ~i; i = E[i].nex) {
- int v = E[i].v;
- if(dep[v] == dep[u] + ) {
- w = flow - used;
- w = dfs(v, min(w, E[i].c));
- E[i].c -= w; E[i^].c += w;
- if(v) cur[u] = i;
- used += w;
- if(used == flow) return flow;
- }
- }
- if(!used) dep[u] = -;
- return used;
- }
- int dinic() {
- int ans = ;
- while(bfs()) {
- for(int i = ; i <= T;i++)
- cur[i] = head[i];
- ans += dfs(S, inf);
- }
- return ans;
- }
- int main() {
- char s[];
- int i, j, x, t;
- while(~scanf("%d%d", &n, &m),n+m) {
- memset(head, -, sizeof(head));
- cnt = ;
- S = n+m+; T = n+m+;
- vector<int>g[N];
- for(i = ; i <= n; ++i) g[i].clear();
- for(i = ; i < n; ++i) {
- scanf("%s", s);
- while(getchar() != '\n') {
- scanf("%d", &x);
- g[i].push_back(x);
- }
- }
- int l = , r = n, mid;
- while(l <= r) {
- memset(head, -, sizeof(head));
- cnt = ;
- mid = (l+r)/;
- for(i = ; i < n; ++i) {
- for(j = ; j < g[i].size(); ++j)
- add(i, n+g[i][j], ),add(n+g[i][j], i, );
- }
- for(i = ; i < n; ++i) add(S,i,), add(i,S,);
- for(i = n; i < n+m; ++i) add(i,T,mid),add(T,i,);
- t = dinic();
- if(t == n) r = mid - ;
- else l = mid + ;
- }
- printf("%d\n", l);
- }
- }
485ms
poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】的更多相关文章
- POJ 2289 Jamie's Contact Groups (二分+最大流)
题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...
- Poj 2289 Jamie's Contact Groups (二分+二分图多重匹配)
题目链接: Poj 2289 Jamie's Contact Groups 题目描述: 给出n个人的名单和每个人可以被分到的组,问将n个人分到m个组内,并且人数最多的组人数要尽量少,问人数最多的组有多 ...
- 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 ...
- POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
Jamie's Contact Groups Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- POJ 2289 Jamie's Contact Groups 二分图多重匹配 难度:1
Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 6511 Accepted: ...
- POJ 2289 Jamie's Contact Groups(多重匹配+二分)
题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...
- POJ 2289 Jamie's Contact Groups 【二分】+【多重匹配】(模板题)
<题目链接> 题目大意: 有n个人,每个人都有一个或者几个能够归属的分类,将这些人分类到他们能够归属的分类中后,使所含人数最多的分类值最小,求出该分类的所含人数值. 解题分析: 看到求最大 ...
- POJ 2289 Jamie's Contact Groups & POJ3189 Steady Cow Assignment
这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...
- POJ - 2289 Jamie's Contact Groups (二分图多重匹配)
题意:N个人,M个团体.每个人有属于自己的一些团体编号.将每个人分配到自己属于的团体中,问这个人数最多的团体其人数最小值是多少. 分析:一个一对多的二分图匹配,且是最大值最小化问题.二分图的多重匹配建 ...
随机推荐
- WebApi使用swagger ui自动生成接口文档
之前就写到.最近正在使用webapi.这里介绍一个实用的东西swageer ui现在开发都是前后端分开.我们这里是给前端提供api.有时候对于一个api的描述,并不想专门写一份文档.很浪费时间.swa ...
- Django(三):HttpRequest和HttpResponse
当一个请求连接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的视图函数.每个请求的视图函数都会返回一个HttpResponse. H ...
- TortoiseGit用户手册
3 配置TortoiseGit 3.1 生成公钥 生成SSH安全密钥,提供给GIT版本库管理员以访问Git 版本库,点击桌面上生成的图标 然后执行执行“ssh-keygen”生成自己的公钥: 一路回车 ...
- MySQL中文编码设置为utf-8
MySQL中文编码设置为utf-8 原文地址:http://blog.csdn.net/wangnan537/article/details/47819167 1. 查看MySQL数据库的默认编码有如 ...
- Docker for Windows(五)实践搭建SqlServer服务&执行数据库操作
上一篇我们已经搭建了一个mysql数据库服务了:Docker for Windows(四)实践搭建&删除MySQL服务,发现用Docker确实是方便且容易,但上一篇主要是服务的搭建删除等基础操 ...
- http常见状态码有哪些?
ajax常见面试题 1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互 2:原生js ajax请求有几个 ...
- 多张报表导出到一个多sheet页excel
业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...
- RadioGroup实现类似ios的分段选择(UISegmentedControl)控件
在ios7中有一种扁平风格的控件叫做分段选择控件UISegmentedControl,控件分为一排,横放着几个被简单线条隔开的按钮,每次点击只能选择其中一个按钮,他类似于tabbar但是又稍微有点区别 ...
- shiro web 集成
集成方法 shiro与web集成,主要是通过配置一个ShiroFilter拦截所有URL,其中ShiroFilter类似于SpringMVC的前端控制器,是所有请求入口点,负责根据配置(如ini配置文 ...
- java 标准输出流、标准错误输出流、标准输入流及扫描仪
初步认识标准输出流.错误输出流.输入流.扫描仪 package com.mydemo.controller; import java.util.Scanner; public class HelloW ...