POJ 2289 Jamie's Contact Groups
二分答案+网络最大流
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<vector>
- #include<queue>
- #include<algorithm>
- using namespace std;
- int N,M;
- const int maxn = + ;
- const int INF = 0x7FFFFFFF;
- struct Edge
- {
- int from, to, cap, flow;
- Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}
- };
- vector<Edge>edges;
- vector<int>G[maxn];
- bool vis[maxn];
- int d[maxn];
- int cur[maxn];
- int n, m, s, t;
- int U[maxn*],V[maxn*];
- int tot;
- int T[maxn];
- char ss[maxn];
- void init()
- {
- for(int i = ; i < maxn; i++) G[i].clear();
- edges.clear();
- tot=;
- memset(T,,sizeof T);
- }
- void AddEdge(int from, int to, int cap)
- {
- edges.push_back(Edge(from, to, cap, ));
- edges.push_back(Edge(to, from, , ));
- int w = edges.size();
- G[from].push_back(w - );
- G[to].push_back(w - );
- }
- bool BFS()
- {
- memset(vis, , sizeof(vis));
- queue<int>Q;
- Q.push(s);
- d[s] = ;
- vis[s] = ;
- while (!Q.empty())
- {
- int x = Q.front();
- Q.pop();
- for (int i = ; i<G[x].size(); i++)
- {
- Edge e = edges[G[x][i]];
- if (!vis[e.to] && e.cap>e.flow)
- {
- vis[e.to] = ;
- d[e.to] = d[x] + ;
- Q.push(e.to);
- }
- }
- }
- return vis[t];
- }
- int DFS(int x, int a)
- {
- if (x == t || a == )
- return a;
- int flow = , f;
- for (int &i = cur[x]; i<G[x].size(); i++)
- {
- Edge e = edges[G[x][i]];
- if (d[x]+ == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
- {
- edges[G[x][i]].flow+=f;
- edges[G[x][i] ^ ].flow-=f;
- flow+=f;
- a-=f;
- if(a==) break;
- }
- }
- if(!flow) d[x] = -;
- return flow;
- }
- int dinic(int s, int t)
- {
- int flow = ;
- while (BFS())
- {
- memset(cur, , sizeof(cur));
- flow += DFS(s, INF);
- }
- return flow;
- }
- void Input()
- {
- int SS;
- for(int i=;i<=N;i++)
- {
- gets(ss);
- for(int ii=;ss[ii];ii++)
- if(ss[ii]==' ')
- {SS=ii;break;}
- int num=;
- for(int ii=SS+;;ii++)
- {
- if(ss[ii]>=''&&ss[ii]<='') num=num*+ss[ii]-'';
- if(ss[ii]==' '||ss[ii]=='\0')
- {
- U[tot]=i;V[tot]=N+num+;tot++;
- T[num]++;
- num=;
- }
- if(ss[ii]=='\0') break;
- }
- }
- }
- void Solve()
- {
- int Ma=-INF;
- for(int i=;i<M;i++) if(T[i]>Ma) Ma=T[i];
- int Min=,Max=Ma;
- int Mid=(Min+Max)/;
- s=;t=N+M+;
- while()
- {
- for(int i = ; i < maxn; i++) G[i].clear();
- edges.clear();
- for(int i=;i<=N;i++) AddEdge(s,i,);
- for(int i=;i<tot;i++) AddEdge(U[i],V[i],INF);
- for(int i=N+;i<=N+M;i++) AddEdge(i,t,Mid);
- if(dinic(s,t)<N)
- {
- Min=Mid+;
- Mid=(Min+Max)/;
- }
- else
- {
- Max=Mid;
- Mid=(Min+Max)/;
- }
- if(Min==Max) break;
- }
- printf("%d\n",Min);
- }
- int main()
- {
- while(~scanf("%d%d",&N,&M))
- {
- if(!N&&!M) break;
- scanf("\n");
- init();
- Input();
- Solve();
- }
- return ;
- }
POJ 2289 Jamie's Contact Groups的更多相关文章
- 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 (二分+二分图多重匹配)
题目链接: Poj 2289 Jamie's Contact Groups 题目描述: 给出n个人的名单和每个人可以被分到的组,问将n个人分到m个组内,并且人数最多的组人数要尽量少,问人数最多的组有多 ...
- poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】
题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS Memory Limit: 65536K ...
- 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 & POJ3189 Steady Cow Assignment
这两道题目都是多重二分匹配+枚举的做法,或者可以用网络流,实际上二分匹配也就实质是网络流,通过枚举区间,然后建立相应的图,判断该区间是否符合要求,并进一步缩小范围,直到求出解.不同之处在对是否满足条件 ...
- POJ 2289 Jamie's Contact Groups (二分+最大流)
题目大意: 有n个人,可以分成m个组,现在给出你每个人可以去的组的编号,求分成的m组中人数最多的组最少可以有多少人. 算法讨论: 首先喷一下这题的输入,太恶心了. 然后说算法:最多的最少,二分的字眼. ...
- 图论--网络流--最大流 POJ 2289 Jamie's Contact Groups (二分+限流建图)
Description Jamie is a very popular girl and has quite a lot of friends, so she always keeps a very ...
- POJ 2289 Jamie's Contact Groups(多重匹配+二分)
题意: Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是 ...
随机推荐
- drupal7 上传文件中文乱码
drupal7自带有file模块,可以上传文件. 但是存在问题:如果上传的文件名称是中文,存储在文件下面的文件名称是乱码的,解决办法如下:参考出处 includes/file.inc中,修改两处代码, ...
- java 文件的基本操作
1 /** * java 文件操作 * 2016/5/10 **/ package cn.Java_7; import java.io.*; import java.util.Scanner; imp ...
- C语言_愤怒的小鸟
// ConsoleApplication4.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> ...
- 调试MVC项目,不关闭 IIS EXPRESS
在VS主面板打开:工具->选项->调试->编辑继续 取消选中[启用"编辑并继续"] 就OK了 (英文版的请对应相应的操作) 不过这是针对所有的调试,如果你想针 ...
- 用python写刷票程序
刷票一般要突破以下限制: 1.验证码识别 2.同一ip不可连续投票 解决办法 1.用tesseract工具,链接在此 https://code.google.com/p/tesseract-ocr/ ...
- openwrt默认不开启wifi
Openwrt默认不开启wifi,要开启的话, 修改这个文件: openwrt/trunk/package/kernel/mac80211/files/lib/wifi/mac80211.sh. 滚到 ...
- SharePoint 2010 应用url参数过滤列表视图数据(应用get办法过滤列表数据)
名人名言:读活书,活读书,读书活.——郭沫若 题目其实不知道如何称呼才干合适大师的搜刮习惯.以便有类似题目经由过程百度或google可以搜刮到,其实就是在url后面添加参数过滤显示我们想要的成果,有人 ...
- AngularJS展示数据的ng-bind指令和{{}} 区别
在AngularJS中显示模型中的数据有两种方式: 一种是使用花括号插值的方式: 1 <p>{{text}}</p> 另一种是使用基于属性的指令,叫做ng-bind: 1 &l ...
- Ajax交互,浏览器接收不到服务器的Json数据(跨域问题)
该问题的情景如下: 问题描述 Ajax的请求代码放在一台机器上,而服务器的java 路由程序放在另一个机子上,所以Ajax的url填写的是带"http://" 的地址,而不是相对 ...
- Spring.NET 中的 ADO.NET 数据访问的示例
Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...