「网络流 24 题」太空飞行计划 【最大权值闭合图】

「网络流 24 题」太空飞行计划

1

题意

n n n 个实验 和 m m m 个器械,每个实验都需要若干个指定的器械才能进行

实验 i i i 的盈利为 p i p_i pi, 器械 j j j 的花销为 c j c_j cj

找出纯利润最大的实验计划

思路

这是非常典型的最大权值闭合图的题型

可以在 OI WIKI 学习

我们将实验和器械都建模成,对于实验 i i i 所需要的所有器械 j j j,我们连边 i → j i \rarr j ij,边权为 ∞ \infty
同时对于实验 i i i,由于其盈利为,相当于点权为正,那么连边: s → i s \rarr i si
对于器械 j j j,花销相当于点权,我们连边: j → t j \rarr t jt

正常地跑最大流最小割,答案就是正点权之和减去最小割

// Problem: #6001. 「网络流 24 题」太空飞行计划
// Contest: LibreOJ
// URL: https://loj.ac/p/6001
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#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 longconst int INF=0x3f3f3f3f;
// const long long INFLL=0x3f3f3f3f3f3f3f3fLL;typedef long long ll;constexpr int inf = 1E9;template<class T>
struct Dinic {struct _Edge {int to;T cap;_Edge(int to, T cap) : to(to), cap(cap) {}};int n; //点的数量,编号从 1 开始std::vector<_Edge> e; //链式前向星std::vector<std::vector<int>> g; //起到链式前向星nxt的作用std::vector<int> cur; //当前弧优化std::vector<int> h; //深度Dinic() {}Dinic(int n) {init(n);}void init(int n) {this->n = n;e.clear();g.assign(n + 1, {});cur.resize(n + 1);h.resize(n + 1);}bool bfs(int s, int t) { //构造分层图h.assign(n + 1, -1);std::queue<int> que;h[s] = 0;que.push(s);while (!que.empty()) {const int u = que.front();que.pop();for (int i : g[u]) {auto [v, c] = e[i];if (c > 0 && h[v] == -1) { //下一层有容量的邻居h[v] = h[u] + 1;if (v == t) {return true;}que.push(v);}}}return false;}T dfs(int u, int t, T f) {if (u == t) {return f;}auto r = f;for (int &i = cur[u]; i < int(g[u].size()); ++i) {const int j = g[u][i];auto [v, c] = e[j];if (c > 0 && h[v] == h[u] + 1) {auto a = dfs(v, t, std::min(r, c));e[j].cap -= a;e[j ^ 1].cap += a;r -= a; //r是剩余可用流量if (r == 0) {return f;  //如果r用完,说明f跑满了}}}return f - r; //否则f-r就是已用流量}void addEdge(int u, int v, T c) {g[u].push_back(e.size()); //记录在e中的下标e.emplace_back(v, c);g[v].push_back(e.size()); //反向边e.emplace_back(u, 0);}T flow(int s, int t) {T ans = 0;while (bfs(s, t)) {cur.assign(n + 1, 0); //当前弧初始化ans += dfs(s, t, std::numeric_limits<T>::max());}return ans;}std::vector<bool> minCut() { //最小割std::vector<bool> c(n + 1);for (int i = 1; i <= n; i++) {c[i] = (h[i] != -1);}return c;}struct Edge {int from;int to;T cap;T flow;};std::vector<Edge> edges() {std::vector<Edge> a;for (int i = 0; i < e.size(); i += 2) {Edge x;x.from = e[i + 1].to;x.to = e[i].to;x.cap = e[i].cap + e[i + 1].cap;x.flow = e[i + 1].cap;a.push_back(x);}return a;}
};int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int n, m;std::string s;std::getline(std::cin, s);std::stringstream ss(s);ss >> n >> m;Dinic<int> dinic(n + m + 2);int S = n + m + 1, T = S + 1;int sum = 0;fore(i, 1, n + 1){std::string s;std::getline(std::cin, s);std::stringstream ss(s);int w;ss >> w;sum += w;dinic.addEdge(S, i, w);int v;while(ss >> v){dinic.addEdge(i, v + n, std::numeric_limits<int>::max());}}fore(v, 1, m + 1){int w;std::cin >> w;dinic.addEdge(v + n, T, w);}int ans = sum - dinic.flow(S, T);auto c = dinic.minCut();std::vector<int> test, eqt;fore(i, 1, n + 1)if(c[i]) //位于集合 Sstd::cout << i << ' ';std::cout << endl;fore(i, 1, m + 1)if(c[i + n]) //位于集合 Sstd::cout << i << ' ';std::cout << endl;std::cout << ans;return 0; 
}

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

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

相关文章

如何定时关闭程序

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 前面的流程步骤参考这条攻略&#xff1a; 快捷自由定时重启、注销、关机 只不过最后的地方&#xff0c;选择 关闭程序 &#xff0c;再填写程序名称即可 补…

2024-03-23青少年软件编程(Python语言)等考(四级)解析

2024-03-23青少年软件编程(Python语言)等考(四级)解析一、单选题(共25题,共50分) 1.运行如下代码,若输入整数3,则最终输出的结果为?( C ) def f(x):if x==1:s=1else:s=f(x-1)*xreturn s n=int(input("请输入一个大于1的整数:")) print(f(n)+f(n-1)) A.2…

全栈开发之路——前端篇(5)组件间通讯和接口等知识补充

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 辅助文档&…

Linux中的软连接和硬链接

一、软和硬链接连接 在Linux系统中&#xff0c;软连接&#xff08;符号链接&#xff09;和硬链接是文件系统中两种不同类型的链接&#xff0c;它们用于创建对文件的引用。下面详细解释这两种链接的特点和区别&#xff1a;、 软连接&#xff08;符号链接&#xff09; 定义&…

项目中遇到的问题

web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成&#xff0c;举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页&#xff0c;现在在toTrade请求中使用异步任务编排Completab…

鸿蒙应用开发系列 EX篇:HarmonyOS应用开发者基础认证

文章目录 系列文章背景认证考试题库参考注意:题库会不定时的进行具备调整甚至整体轮换,此为2024.5月版本注意:题库中题目的选项每次都会随机顺序,请参考内容判断题单选题多选题系列文章 鸿蒙应用开发系列 篇一:鸿蒙系统概述 鸿蒙应用开发系列 篇二:鸿蒙系统开发工具与环…

Windows运维_Win10自带图片查看器不见了在哪里打开

Windows运维_Win10自带图片查看器不见了在哪里打开 Windows 10 系统自带的图片查看器可以帮助我们快速查看电脑的图片&#xff0c;十分方便。 但是有不少用户发现自己 Win10 系统自带的图片查看器功能不见了&#xff0c;导致图片只能在画图或者其他工具里打开&#xff0c;极其…

西红柿叶病害检测(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.基于最新的YOLOv8训练的西红柿病害检测模型&#xff0c;和基于PyQt5制作的可视西红柿病害系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检Bacterial Spot, Early_Blight, Healthy, Late_blight, Leaf Mold, Target_Spot, black spot&#xff0c…

电商风口的最后一班快车?有些人甚至正在All in视频号!

我是王路飞。 当抖音、快手、淘宝上的商家还在内卷的时候&#xff0c;有些人却转移了阵地&#xff0c;搭上了电商风口的“最后一般列车”&#xff0c;甚至正在All in 视频号。 内容来源于【醒醒团队-电商王路飞】 随着“微视”想要三分天下野心的失败&#xff08;与抖音、快手…

SD-WAN:企业低成本与高性能组网的理想选择

在竞争日益激烈的市场中&#xff0c;企业要立足就需要一种既能控制成本又能保证卓越性能的网络解决方案。尽管传统组网方式稳定可靠&#xff0c;但其高昂的硬件投入和升级成本让许多企业望而却步&#xff0c;而SD-WAN为企业提供了一个理想的解决方案。 成本效益&#xff1a;精打…

[Kubernetes] KubeKey 部署 K8s v1.28.8

文章目录 1.K8s 部署方式2.操作系统基础配置3.安装部署 K8s4.验证 K8s 集群5.部署测试资源 1.K8s 部署方式 kubeadm: kubekey, sealos, kubespray二进制: kubeaszrancher 2.操作系统基础配置 主机名内网IP外网IPmaster192.168.66.2139.198.9.7node1192.168.66.3139.198.40.17…

创建一个线程对象需要花费多少内存空间

创建一个std::thread对象所需的内存空间大小并不是固定的&#xff0c;因为它取决于多种因素&#xff0c;包括C运行时库的实现、编译器优化、以及可能的平台和架构差异。 std::thread对象本身是一个轻量级的控制块&#xff0c;它主要用于管理线程的执行&#xff0c;包括保存线程…

<iomanip>库中setw(),setfill()等函数的使用

#include <iomanip> #include<iomanip>是C标准库中的一个头文件&#xff0c;提供了用于输入/输出格式控制的函数和类。它特别适用于调整输出的对齐、填充、精度等格式。 setw() stew&#xff0c;这是一个用于操纵输出格式的函数&#xff0c;用于美化C程序的输出…

FreeBSD进入单用户模式拯救崩溃的系统

在FreeBSD系统里总归会遇到手残把系统弄崩的情况&#xff0c;即默认的多用户模式进不去或系统压根就启动到一半办错&#xff0c;或者进入调试模式&#xff0c;这时候可以进单用户模式拯救系统&#xff0c;一般都能救回来。 FreeBSD系统启动后进入单用户模式&#xff0c;先执行 …

华为试题之删除最少字符

题目描述 删除字符串中出现次数最少的字符 如果多个字符出现次数一样则都删除 输入描述 输入只包含小写字母 输出描述 输出删除后剩余的字符 若删除后字符串长度为0&#xff0c;则输出empty 我的思路是将字符串中的字符对应的数量和key统计后放到对应的字典中&#xff0c; 对字…

独家专访辉羲智能章健勇:数据闭环定义芯片,帮车厂造中国版FSD

‍采访、编辑 |德新 撰文 |苗岭 辉羲智能&#xff0c;智能驾驶芯片行业最新的进入者。 这家公司成立于2022年&#xff0c;今年辉羲即将发布它的首款高阶智驾芯片。而另外两家智驾计算平台的头部公司地平线和黑芝麻已经在前不久分别向港交所提交了IPO申请。 国内的自动驾驶行…

【问题记录】Windows命令行中执行.exe文件路径有空格的解决方法

Windows命令行中执行.exe文件路径有空格的解决方法 一&#xff0c;问题现象&#xff1a;二&#xff0c;问题原因三&#xff0c;解决方法 一&#xff0c;问题现象&#xff1a; 在Windows命令行中执行路径中带空格的.exe文件&#xff1a; 会报错&#xff1a; 二&#xff0c;问…

数据库系统理论——关系数据库

文章目录 一、关系&#xff08;数据结构&#xff09;1、概述2、名词解释3、关系模式、关系数据库、关系数据库模式4、基本关系的性质 二、关系操作&#xff08;数据操作&#xff09;三、关系的完整性1、实体完整性2 、参照完整性3、用户自定义的完整性 四、关系代数五、习题 前…

vue中 this.$set 的作用

向响应式对象中添加一个属性&#xff0c;并确保这个新属性同样是响应式的&#xff0c;且触发视图更新 在 Vue.js 中&#xff0c;this.$set 是一个实例方法&#xff0c;用于向响应式对象中添加一个属性&#xff0c;并确保这个新属性同样是响应式的&#xff0c;且触发视图更新。…

日期函数之计算两个日期之间的天数差

开篇 本体来源为《编程珠玑》第3章课后习题4的第一问。 问题概要 给定两个日期&#xff0c;计算两者之间的天数。 思路分析 以2022年1月22号和2024年2月3号为例&#xff1a; 首先根据年月日确定2022年1月22号是2022年的第22天&#xff0c;距离2023年还差(365 - 22 341)天&…