「网络流 24 题」餐巾计划【费用流】

「网络流 24 题」餐巾计划

1

思路

我们先建立超级源点 S S S 和超级汇点 T T T,对于每一天,我们将其拆分成两个点 A i A_i Ai B i B_i Bi,其中 A i A_i Ai 表示这一天实际消耗的餐巾,连边 S → ∞ A i S \stackrel{\infty} \rarr A_i SAi 容量无穷大,费用为 P P P,表示新购买餐巾; A i → x i T A_i \stackrel{x_i} \rarr T AixiT,容量 x i x_i xi,费用为 0 0 0,其中 x i x_i xi 表示这一天需要的餐巾数

连边 S → x i B i S \stackrel{x_i} \rarr B_i SxiBi,容量为 x i x_i xi,费用为 0 0 0,用以限制这一天用完后的餐巾数量送去洗过后,后面重复使用。

连边 B i → A i + M B_i \rarr A_{i + M} BiAi+M,容量为 ∞ \infty ,费用为 F F F
连边 B i → A i + N B_i \rarr A_{i + N} BiAi+N,容量为 ∞ \infty ,费用为 S S S
连边 B i → B i + 1 B_i \rarr B_{i + 1} BiBi+1,容量为 ∞ \infty ,费用为 0 0 0
以上这一部分的连边表示:把当前这一天用完的脏的餐巾送去洗,用以后续使用,注意前面 S → x i B i S \stackrel{x_i} \rarr B_i SxiBi 已经限制了这一天送去洗的餐巾数量。而洗完后的餐巾可能不会立即被使用,所以我们有一个传递 B i → B i + 1 B_i \rarr B_{i + 1} BiBi+1,表示延迟洗,其实也等价于先洗好然后等待,这两种方式是等价的

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;struct MCF {struct Edge {int v, c, w; //边终点、容量、费用Edge(int v, int c, int w) : v(v), c(c), w(w) {}};const int n;std::vector<Edge> e;std::vector<std::vector<int>> g;std::vector<ll> h, dis;std::vector<int> pre;bool dijkstra(int s, int t) {dis.assign(n + 1, std::numeric_limits<ll>::max());pre.assign(n + 1, -1);std::priority_queue<std::pair<ll, int>, std::vector<std::pair<ll, int>>, std::greater<std::pair<ll, int>>> que;dis[s] = 0;que.emplace(0, s);while (!que.empty()) {ll d = que.top().first;int u = que.top().second;que.pop();if (dis[u] < d) continue;for (int i : g[u]) {int v = e[i].v;int c = e[i].c;int w = e[i].w;if (c > 0 && dis[v] > d + h[u] - h[v] + w) {dis[v] = d + h[u] - h[v] + w;pre[v] = i;que.emplace(dis[v], v);}}}return dis[t] != std::numeric_limits<ll>::max();}MCF(int n) : n(n), g(n + 1) {}void addEdge(int u, int v, int c, int w) {g[u].push_back(e.size());e.emplace_back(v, c, w);g[v].push_back(e.size());e.emplace_back(u, 0, -w);}std::pair<int, ll> flow(int s, int t) {int flow = 0;ll cost = 0;h.assign(n + 1, 0);while (dijkstra(s, t)) {for (int i = 1; i <= n; ++i) h[i] += dis[i];int aug = std::numeric_limits<int>::max();for (int i = t; i != s; i = e[pre[i] ^ 1].v) aug = std::min(aug, e[pre[i]].c);for (int i = t; i != s; i = e[pre[i] ^ 1].v) {e[pre[i]].c -= aug;e[pre[i] ^ 1].c += aug;}flow += aug;cost += ll(aug) * h[t];}return std::make_pair(flow, cost);}
};int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n, P, M, F, N, S;std::cin >> n >> P >> M >> F >> N >> S;    std::vector<int> a(n + 1);MCF mcf(2 * n + 2);int s = 2 * n + 1, t = s + 1;fore(i, 1, n + 1){int in = 2 * i - 1, out = 2 * i;std::cin >> a[i];mcf.addEdge(s, in, a[i], 0);mcf.addEdge(out, t, a[i], 0);mcf.addEdge(s, out, INF, P);if(i + M <= n) mcf.addEdge(in, 2 * (i + M), INF, F);if(i + N <= n) mcf.addEdge(in, 2 * (i + N), INF, S);if(i > 1) mcf.addEdge(in - 2, in, INF, 0);}auto [flow, cost] = mcf.flow(s, t);std::cout << cost;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/681564.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OceanBase+Flink CDC,云粒智慧实时数仓演进之路

摘要&#xff1a;本文整理自云粒智慧高级技术专家付大伟在 4 月 20 日的 2024 OceanBase 开发者大会上的分享&#xff0c;讲述了其数据中台在传统数仓技术框架下做的一系列努力后&#xff0c;跨进 FlinkCDC 结合 OceanBase 的实时数仓演进过程。 内容主要分为以下几个部分: 业务…

HuggingFace烧钱做了一大批实验,揭示多模态大模型哪些trick真正有效

构建多模态大模型时有很多有效的trick&#xff0c;如采用交叉注意力机制融合图像信息到语言模型中&#xff0c;或直接将图像隐藏状态序列与文本嵌入序列结合输入至语言模型。 但是这些trick为什么有效&#xff0c;其计算效率如何&#xff0c;往往解释得很粗略或者或者缺乏充分…

SpringBoot自动配置源码解析

SpringBootApplication Spring Boot应用标注 SpringBootApplication 注解的类说明该类是Spring Boot 的主配置类&#xff0c;需要运行该类的main方法进行启动 Spring Boot 应用 SpringBootConfiguration 该注解标注表示标注的类是个配置类 EnableAutoConfiguration 直译&#…

Linux Ubuntu(玩客云) qBittorrent docker BT下载(qbittorrent 密码错误无法登录 ip地址被禁止登录等)

提示&#xff1a; 需要提前安装Docker 根据qBittorrent官网的更新日志https://www.qbittorrent.org/news &#xff0c;4.6.1.0包含一个重大更新。可以看到自4.6.1.0开始&#xff0c;qBittorrent将弃用adminadmin默认密码&#xff0c;采用随机密码&#xff0c;将在终端控制台输出…

web前端学习笔记9

9. HTML5新增元素及属性 9.1 HTML5新增结构元素 HTML5引入了几个新的结构元素,极大地改善了网页的组织和结构方式。以下是HTML5中的一些关键新结构元素: 标签说明<header>页面或页面中某一个区块的页眉,通常是一些引导和导航信息<nav>可以作为页面导航的链接组&…

Android build.prop生成过程源码分析

Android的build.prop文件是在Android编译时刻收集的各种property【LCD density/语言/编译时间, etc.】&#xff1b;编译完成之后&#xff0c;文件生成在out/target/product/<board【OK1000】>/system/目录下&#xff1b;在Android运行时刻可以通过property_get()[c/c域] …

10分钟搞懂,Python接口自动化测试-接口依赖-实战教程

一、场景说明 在面试接口自动化时&#xff0c;经常会问&#xff0c;其他接口调用的前提条件是当前用户必须是登录状态&#xff0c;如何处理接口依赖&#xff1f; 在此之前我们介绍过session管理器保存会话状态。如果接口请求需要携带token&#xff0c;那么又如果处理呢&#…

基于点灯Blinker的ESP8266远程网络遥控LED

本文介绍基于ESP8266模块实现的远程点灯操作&#xff0c;手机侧APP选用的是点灯-Blinker&#xff0c;完整资料及软件见文末链接 一、ESP8266模块简介 ESP8266是智能家居等物联网场景下常用的数传模块&#xff0c;具有强大的功能&#xff0c;通过串口转WIFI的方式可实现远距离…

一个圈圈的机制玩法

什么是一个圈圈&#xff0c;说白了就是一个撸广告的平台&#xff0c;只是引入了减产机制&#xff0c;九维机制和分成机制&#xff0c;再加上有央企背景&#xff0c;做的一个区块链平台。 玩法很简单&#xff0c;就是撸广告获取能量&#xff0c;然后获取绿色能量&#xff0c;等…

Vue3 学习 (一)

编码规范 Vue3 通常和 typescript 结合使用 采用 TypeScript 组合式 api setup 语法糖 的形式 一、Vue3 简介 和 Vue2 相比 性能得到提升 源码升级 使用 Proxy 代替 definedProperty 实现响应式 重写虚拟 DOM 的实现和Tree-Shaking 可以更好的支持 TypeScript 新的…

使用Python Pandas实现两表对应列相加(即使表头不同)

目录 引言 Pandas库简介 实现对应列相加 步骤一&#xff1a;加载数据 步骤二&#xff1a;重命名列 步骤三&#xff1a;对应列相加 步骤四&#xff1a;保存结果 案例分析 结论 引言 在数据分析和处理的日常工作中&#xff0c;我们经常会遇到需要将来自不同数据源的数据…

AR人脸美妆SDK解决方案,让妆容更加贴合个人风格

美妆行业正迎来前所未有的变革&#xff0c;为满足企业对高效、精准、创新的美妆技术需求&#xff0c;美摄科技倾力打造了一款企业级AR人脸美妆SDK解决方案&#xff0c;为企业打开美妆领域的新世界大门。 革命性的人脸美妆技术 美摄科技的AR人脸美妆SDK解决方案&#xff0c;不…