POJ 2289 Jamie's Contact Groups(多重匹配+二分)
2015-08-10 17:24
429 查看
题意:
Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是多少?
题目分析:
多重匹配,二分枚举所有极限值。
多重匹配如何匹配?
假如我们有两个集合X, Y 但是呢 Y可以匹配多个X, 这个时候我们需要给这个匹配设置一个极限值。比如Y可以匹配三个X。 假如匹配的值不到三个X我们就将他们匹配,
直到到达极限值为止。在这里Y要保存所有的与之匹配的X,若是匹配值满了,进行Find()匹配就行了。
Jamie有很多联系人,但是很不方便管理,他想把这些联系人分成组,已知这些联系人可以被分到哪个组中去,而且要求每个组的联系人上限最小,即有一整数k,使每个组的联系人数都不大于k,问这个k最小是多少?
题目分析:
多重匹配,二分枚举所有极限值。
多重匹配如何匹配?
假如我们有两个集合X, Y 但是呢 Y可以匹配多个X, 这个时候我们需要给这个匹配设置一个极限值。比如Y可以匹配三个X。 假如匹配的值不到三个X我们就将他们匹配,
直到到达极限值为止。在这里Y要保存所有的与之匹配的X,若是匹配值满了,进行Find()匹配就行了。
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> #include<queue> #include<cmath> using namespace std; #define INF 0x3fffffff #define maxn 1505 int n, m; bool G[maxn][maxn], vis[maxn]; vector<vector<int> >Group; bool Find(int u,int limt) { for(int i=0; i<m; i++) { if(G[u][i] && !vis[i]) { vis[i] = true; if( Group[i].size() < limt ) { Group[i].push_back(u); return true; } for(int j=0; j < Group[i].size(); j++) { if( Find(Group[i][j], limt) ) { Group[i].erase(Group[i].begin()+j); Group[i].push_back(u); return true; } } } } return false; } bool solve(int limt) { int num = 0; Group.clear(); Group.resize(m+1); for(int i=0; i<n; i++) { memset(vis, false, sizeof(vis)); if(Find(i, limt) ) num ++; } return num == n; } int main() { int a; char ch; while(scanf("%d %d",&n, &m), n+m) { memset(G, false, sizeof(G)); for(int i=0; i<n; i++) { scanf("%*s"); while(1) { // getchar(); scanf("%d%c",&a, &ch); G[i][a] = true; if(ch == '\n') break; } } int L = 0, R = n; while(L < R) { int mid = (L + R) / 2; if( solve(mid) ) R = mid; else L = mid + 1; } printf("%d\n", R); } return 0; }
相关文章推荐
- 人物角色群体攻击判定(三)Physics.OverlapSphere(群体攻击)
- 年度催泪之作:2015中国程序员生存报告
- UML简介
- 对称加密----AES和DES加密、解密
- JAVA -- 设计模式
- GPS北斗软件接收机/跟踪捕获定位输出/A GPS software receiver【All of acq track nav filter and other NMEA】*嵌入式GPS导航代码*
- Pear、PHPUnit安装
- 线程私有数据实现的原理
- 各种return情况下try,catch,finally的执行顺序
- HDU 3829 Cat VS Dog(最大独立集)
- CentOS/SMTP服务器的构建
- win7 x64安装.net 4.0 HRESULT 0xc8000222
- nginx配置文件详解
- iOS二维码的使用
- Swift-控制流
- HDU 3555 Bomb 数位DP
- Android(Java) 模拟登录知乎并抓取用户信息
- Eclipse去除js(JavaScript)验证错误介绍
- 代码静态检查-cppcheck
- 重写toString以及equals方法