AcWing 407. 稳定的牛分配
大型补档计划
题目看的有点晕(语文差)
总体来说就是让每头牛找个谷仓,不能超过容量,最小化每头牛在的谷仓在自己心目中排名的极差。
显然这个最优性问题不好做,但是转换为判定性问题这就是一个标准的二分图多重匹配(即一头牛匹配一个谷仓,一头牛只能匹配一个,一个谷仓接受的牛有上限),所以二分这个极差(显然满足单调性),然后枚举左右端点就行了,跑构建网络跑最大流即可。
时间复杂度 \(O(\sqrt{N}MBLogB)\),最大边数 \(M = N * B\) 的规模,所以复杂度 \(O(\sqrt{N}N * B ^ 2 LogB)\),大概 \(5e7\) 的量级,还是能混过去的。
注意每次 \(dfs\) 前清空 \(d\) 数组,太坑了我查了好久。。
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1025, S = 25, INF = 1e9;
int n, B, s, t, a[N][S], b[S], d[N], q[N];
int head[N], numE;
struct E{
int next, v, w;
} e[(N * S + N + S) << 1];
void add(int u, int v, int w) {
e[++numE] = (E) { head[u], v, w };
head[u] = numE;
}
void addEdge(int u, int v, int w) {
add(u, v, w), add(v, u, 0);
}
// 建图
void build(int l, int r) {
numE = 1;
memset(head, 0, sizeof head);
for (int i = 1; i <= n; i++) addEdge(s, i, 1);
for (int i = 1; i <= B; i++) addEdge(n + i, t, b[i]);
for (int i = 1; i <= n; i++)
for (int j = l; j <= r; j++) addEdge(i, n + a[i][j], 1);
}
bool bfs() {
memset(d, 0, sizeof d);
int hh = 0, tt = 0;
q[0] = s, d[s] = 1;
while (hh <= tt) {
int u = q[hh++];
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].v;
if (e[i].w && !d[v]) {
d[v] = d[u] + 1;
q[++tt] = v;
if (v == t) return true;
}
}
}
return false;
}
int dinic(int u, int flow) {
if (u == t) return flow;
int rest = flow;
for (int i = head[u]; i && rest; i = e[i].next) {
int v = e[i].v;
if (d[v] == d[u] + 1 && e[i].w) {
int k = dinic(v, min(e[i].w, rest));
if (!k) d[v] = 0;
e[i].w -= k, e[i ^ 1].w += k;
rest -= k;
}
}
return flow - rest;
}
// 所有牛排名控制在 x 以内行不行?
bool check(int x) {
for (int l = 1, r; (r = l + x - 1) <= B; l++) {
build(l, r);
int maxflow = 0, res;
while (bfs())
while(res = dinic(s, INF)) maxflow += res;
if(maxflow == n) return true;
}
return false;
}
int main() {
scanf("%d%d", &n, &B);
s = n + B + 1, t = n + B + 2;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= B; j++) scanf("%d", &a[i][j]);
for (int i = 1; i <= B; i++) scanf("%d", b + i);
int l = 1, r = B;
while (l < r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
printf("%d\n", r);
return 0;
}
AcWing 407. 稳定的牛分配的更多相关文章
- 稳定的奶牛分配 && 二分图多重匹配+二分答案
题意: 农夫约翰有N(1<=N<=1000)只奶牛,每只奶牛住在B(1<=B<=20)个奶牛棚中的一个.当然,奶牛棚的容量有限.有些奶牛对它现在住的奶牛棚很满意,有些就不太满意 ...
- Acwing:102. 最佳牛围栏(前缀和 + 二分)
农夫约翰的农场由 NN 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最 ...
- AcWing 101. 最高的牛 (差分) 打卡
有 NN 头牛站成一行,被编队为1.2.3…N,每头牛的身高都为整数. 当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方. 现在,我们只知道其中最高的牛是第 PP 头,它的身高是 HH ,剩 ...
- P2857 [USACO06FEB]稳定奶牛分配Steady Cow Assignment
题目描述 Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns ...
- bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
[Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 407 Solved: 325[S ...
- bzoj1734 愤怒的牛
Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...
- bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛
Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...
- 【稳定婚姻问题】【HDU1435】【Stable Match】
2015/7/1 19:48 题意:给一个带权二分图 求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...
- BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...
随机推荐
- 问题记录-CoordinatorLayout+WebView使用遇到的问题
需求背景: 使用CoordinatorLayout+viewpager+tablayout+webview实现首页折叠效果. 使用问题: 在使用过程中首页的页面为原生/h5混合页,在原生页面正常,嵌套 ...
- redmine系统部署
1.下载railsinstaller.注意版本,我用的是老版的 railsinstaller-3.2.0.exe 下载地址 http://railsinstaller.org/en 国外的网站比较慢, ...
- Java中5种List的去重方法及它们的效率对比,你用对了吗?
01.使用两个for循环实现List去重(有序) /**使用两个for循环实现List去重(有序) * * @param list * */ public static ...
- .NET 5 带来的新特性 [MemberNotNull] 与 [MemberNotNullWhen]
MemberNotNullAttribute是 .NET 5 的新增特性,位于System.Diagnostics.CodeAnalysis.该特性用于显式声明,调用此方法后该值不再为 Null.示例 ...
- C#高级编程之特性
特性定义 MSDN的描述:使用特性,可以有效地将元数据或声明性信息与代码(程序集.类型.方法.属性等)相关联. 将特性与程序实体相关联后,可以在运行时使用反射这项技术查询特性. 参考此处作者的解释 h ...
- phpmyadmin远程代码执行漏洞(CVE-2016-5734)
简介 环境复现:https://github.com/vulhub/vulhub 线上平台:榆林学院内可使用协会内部的网络安全实验平台 phpMyAdmin是一套开源的.基于Web的MySQL数据库管 ...
- python-基础入门-2
这里介绍两个,相当于c中的scanf函数 第一个raw_input 1 age=raw_input("how old are you ") 2 print "you ar ...
- Java基础教程——安装JDK
视频讲解:https://www.bilibili.com/video/av48196406/?p=3 使用[jdk-8u144-windows-x64.exe] 下载地址: 链接:https://p ...
- 由OptionalLong想到的拆装箱问题
包装类型为null的时候时候拆箱会报空指针
- 使用github actions 完成一些自动化工作
github actions 是什么? github actions是github的持续集成及自动化工作流服务,使用起来都比较方便.大部分github actions都可以在https://githu ...