POJ 3189 Steady Cow Assignment(二分+多重匹配)
2015-09-05 16:21
337 查看
题目大意:有B间笼舍(每间笼舍能容纳Ci头牛),N头牛,给出每头牛对笼舍的好感,现在要求你将这些牛安排到这些笼舍里,使得对笼舍好感度最高的和对笼舍好感对最低的值达到最小
解题思路:二分枚举值,然后多重匹配
解题思路:二分枚举值,然后多重匹配
[code]#include <cstdio> #include <cstring> using namespace std; const int N = 1020; const int B = 30; int n, b; int Rank [B], vlink[B], link[B] , cap[B]; bool vis[B]; void init() { for (int i = 1; i <= n; i++) for (int j = 1; j <= b; j++) scanf("%d", &Rank[i][j]); for (int i = 1; i <= b; i++) scanf("%d", &cap[i]); } bool dfs(int u, int l, int r) { for (int i = l; i <= r; i++) { int v = Rank[u][i]; if (vis[v]) continue; vis[v] = true; if (vlink[v] < cap[v]) { link[v][vlink[v]++] = u; return true; } for (int i = 0; i < cap[v]; i++) { if (dfs(link[v][i], l, r)) { link[v][i] = u; return true; } } } return false; } bool judge(int l, int r) { int ans = 0; memset(vlink, 0, sizeof(vlink)); for (int i = 1; i <= n; i++) { memset(vis, 0, sizeof(vis)); if (dfs(i, l, r)) ans++; } return ans == n; } bool can(int mid) { for (int i = 1; i + mid - 1 <= b; i++) if (judge(i, i + mid - 1)) return true; return false; } void solve() { int l = 0, r = b, mid, ans; while (l <= r) { mid = (l + r) / 2; if (can(mid)) { r = mid - 1; ans = mid; } else l = mid + 1; } printf("%d\n", ans); } int main() { scanf("%d%d", &n, &b); init(); solve(); return 0; }
相关文章推荐
- STL中find函数
- 如何测试一支笔
- iOS App创建桌面快捷方式
- SQL Server 根据表名获取表的所有列及属性
- java 平衡二叉树的实现
- sharepoint 2016 学习系列篇(7)-如何给网站分配用户访问权限site permission for users
- Shell命令——使用命令
- Learning Markdown
- FluentData,它是一个轻量级框架,关注性能和易用性。
- YII的重写规则与URL的管理
- 解决方案:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)
- 路由器端口映射教程
- grub救援以及演示
- sharepoint 2016 学习系列篇(6)-配置网站的备用网络映射
- 1234 签到题【几何】
- Hadoop 案例6-----TopN问题:求最大的K个值并排序
- 简单四则运算
- 1718:Rank
- 多线程实战(三)线程池
- 快速上手如何使用FluentData