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 ...
随机推荐
- ceph的ISCSI GATEWAY
前言 最开始接触这个是在L版本的监控平台里面看到的,有个iscsi网关,但是没看到有类似的介绍,然后通过接口查询到了一些资料,当时由于有比较多的东西需要新内核,新版本的支持,所以并没有配置出来,由于内 ...
- go get以后下载的包不在src下而在pkg的问题
我的GOPATH是这样的 但是当我go get下载包之后 下载的却不在src,而是在 $GOPATH$/pkg 下 原因可能是之前第一次go get下载, GitHub的速度太慢了,我更改了代理,使用 ...
- 6、Sping Boot消息
1.消息概述 可通过消息服务中间件来提升系统异步通信.扩展解耦能力 消息服务中两个重要概念:消息代理(message broker)和目的地(destination)当消息发送者发送消息以后,将由消息 ...
- Linux下查询外网IP的办法。
Curl 纯文本格式输出:curl icanhazip.comcurl ifconfig.mecurl curlmyip.comcurl ip.appspot.comcurl ipinfo.io/ip ...
- PHP+Ajax点击加载更多内容
css样式: <style type="text/css"> #more{margin:10px auto;width: 560px; border: 1px soli ...
- mysql 重要日志文件总结
作者:丁仪 来源:https://chengxuzhixin.com/blog/post/mysql_zhong_yao_ri_zhi_wen_jian_zong_jie.html 日志是所有应用的重 ...
- 一遍记住Java常用的八种排序算法
1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...
- python3处理csv文件
1. 基础语句 1.1 文件的读取 如果需要读取一行数据如下表1所示,那么需要读取域名下面的数据,便使用如下代码: with open('A.csv','rb') as csvfile: reader ...
- FL Studio中的Fruity slicer采样器功能介绍
本章节采用图文结合的方式来给大家介绍电音编曲软件FL Studio中的Fruity Slicer采样器的功能,感兴趣的朋友可一起来交流哦. Fruity slicer(水果切片器)插件是FL Stud ...
- 清理工具CleanMyMac如何帮助用户清空DNS缓存
什么是DNS缓存?这个缓存有什么危害?相信大家平时使用浏览器时,有时候会遇到一个很奇怪的问题,就是Mac打开许多网站如百度网站,都是可以访问的,但是在打开某个特定网站时,却发现浏览器提示检测不到网络连 ...