网络流24题-太空飞行计划
WWW 教授正在为国家航天中心计划一系列的太空飞行。每次太空飞行可进行一系列商业性实验而获取利润。现已确定了一个可供选择的实验集合 E=E1,E2,⋯,EmE=E_1,E_2,⋯,E_mE=E1,E2,⋯,Em,和进行这些实验需要使用的全部仪器的集合 I=I1,I2,⋯,InI=I_1,I_2,⋯,I_nI=I1,I2,⋯,In。实验 EjE_jEj 需要用到的仪器是 III 的子集 Rj⊆IR_j⊆IRj⊆I。
配置仪器 IkI_kIk 的费用为 ckc_kck 美元。实验 EjE_jEj 的赞助商已同意为该实验结果支付 pjp_jpj 美元。WWW 教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大。这里净收益是指进行实验所获得的全部收入与配置仪器的全部费用的差额。
对于给定的实验和仪器配置情况,编程找出净收益最大的试验计划。
Input
第 111 行有 222 个正整数 mmm 和 nnn。mmm 是实验数,nnn 是仪器数。接下来的 mmm 行,每行是一个实验的有关数据。第一个数赞助商同意支付该实验的费用;接着是该实验需要用到的若干仪器的编号。最后一行的 nnn 个数是配置每个仪器的费用。
Output
第 111 行是实验编号,第 222 行是仪器编号,最后一行是净收益。
请不要输出行末空格以免被判答案错误!
Example
样例输入
2 3
10 1 2
25 2 3
5 6 7
样例输出
1 2
1 2 3
17
Hint
1≤n,m≤501≤n,m≤501≤n,m≤50
思路
最大权闭合图转最大流
在一个图中,我们选取一些点构成集合,记为 VVV,且集合中的出边(即集合中的点的向外连出的弧),所指向的终点(弧头)也在 VVV 中,则我们称 VVV 为闭合图。最大权闭合图即在所有闭合图中,集合中点的权值之和最大的 VVV,我们称 VVV 为最大权闭合图
我们将实验与仪器间连一条有向边,实验为起点(弧尾),仪器为终点(弧头)。则如果我们选择一个闭合图,那么这个闭合图中包含的实验所需要的仪器也最这个闭合图里。而最大权闭合图即为题目的解。
将其转化为一个网络。构造一个源点 SSS,汇点 TTT。我们将SSS与所有权值为正的点连一条容量为其权值的边,将所有权值为负的点与 TTT 连一条容量为其权值的绝对值的边,原来的边将其容量定为正无穷。
注意
- 输入方式
ans-=G.Dinic(S,T)
要在输出实验/仪器之前
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
const int maxm=2e6+7;
const int inf=0x3f3f3f3f;int n,m,u,v;
struct Dinic {struct Edge {int next, f, to;} e[maxm];int head[maxn], dep[maxn], tol, ans;int cur[maxn];int src, sink, n;void add(int u, int v, int f) {tol++;e[tol].to = v;e[tol].next = head[u];e[tol].f = f;head[u] = tol;tol++;e[tol].to = u;e[tol].next = head[v];e[tol].f = 0;head[v] = tol;}bool bfs() {queue<int> q;memset(dep, -1, sizeof(dep));q.push(src);dep[src] = 0;while (!q.empty()) {int now = q.front();q.pop();for (int i = head[now]; i; i = e[i].next) {if (dep[e[i].to] == -1 && e[i].f) {dep[e[i].to] = dep[now] + 1;if (e[i].to == sink)return true;q.push(e[i].to);}}}return false;}int dfs(int x, int maxx) {if (x == sink)return maxx;for (int &i = cur[x]; i; i = e[i].next) {if (dep[e[i].to] == dep[x] + 1 && e[i].f > 0) {int flow = dfs(e[i].to, min(maxx, e[i].f));if (flow) {e[i].f -= flow;e[i ^ 1].f += flow;return flow;}}}return 0;}int dinic(int s, int t) {ans = 0;this->src = s;this->sink = t;while (bfs()) {for (int i = 0; i <= n; i++)cur[i] = head[i];while (int d = dfs(src, inf))ans += d;}return ans;}void init(int n) {this->n = n;memset(head, 0, sizeof(head));tol = 1;}
} G;
char tools[10000];
int main() {scanf("%d%d", &m, &n);int S = 0, T = n + m + 1;G.init(T);int ans = 0;for (int i = 1, x; i <= m; i++) {scanf("%d", &x);G.add(S, i, x);ans += x;memset(tools, 0, sizeof tools);cin.getline(tools, 10000);int ulen = 0, tool;while (sscanf(tools + ulen, "%d", &tool) == 1) {G.add(i, tool + m, inf);if (tool == 0)ulen++;else {while (tool) {tool /= 10;ulen++;}}ulen++;}}for (int i = 1, x; i <= n; i++) {scanf("%d", &x);G.add(i + m, T, x);}ans -= G.dinic(S, T);int flag = 0;for (int i = 1; i <= m; i++) {if (G.dep[i] != -1) {if (flag) printf(" %d", i); else printf("%d", i);flag = 1;}}puts("");flag = 0;for (int i = 1; i <= n; i++) {if (G.dep[i + m] != -1) {if (flag) printf(" %d", i); else printf("%d", i);flag = 1;}}puts("");printf("%d\n", ans);return 0;
}
网络流24题-太空飞行计划相关推荐
- Cogs 727. [网络流24题] 太空飞行计划(最大权闭合子图)
[网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W 教授正在为国家航天中心计 ...
- 线性规划与网络流24题 太空飞行计划问题 (最小割及输出方案)
太空飞行计划问题 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需 ...
- [网络流24题]太空飞行计划
分析 最大权闭合子图模板题 把实验获得的收益看成正权点,仪器费用看成负权点,每个实验向所需要的仪器连边 跑最大权闭合子图即可 详见https://www.cnblogs.com/birchtree/p ...
- 【网络流24题】餐巾计划问题(最小费用最大流)
[网络流24题]餐巾计划问题(最小费用最大流) 题面 COGS 洛谷上的数据范围更大,而且要开longlong 题解 餐巾的来源分为两种: ①新买的 ②旧的拿去洗 所以,两种情况分别建图 先考虑第一种 ...
- 【hjmmm网络流24题补全计划】
本文食用方式 按ABC--分层叙述思路 可以看完一步有思路后自行思考 飞行员配对问题 题目链接 这可能是24题里最水的一道吧... 很显然分成两个集合 左外籍飞行员 右皇家飞行员 跑二分图最大匹配 输 ...
- 【网络流24题补全计划】
本文食用方式 按ABC--分层叙述思路 可以看完一步有思路后自行思考 飞行员配对问题 题目链接 这可能是24题里最水的一道吧... 很显然分成两个集合 左外籍飞行员 右皇家飞行员 跑二分图最大匹配 输 ...
- 网络流24题之餐巾计划问题
题目链接:传送门 时间有点赶,所以写的简略一些了. dalao:这道题不是看看就出来了吗? me:这道题十分难想啊!!!!图好难建啊!!!!但是想到以后就是一个裸题啊!! 要拆点,将每天拆为早上和晚上 ...
- [网络流24题][CODEVS1237]餐巾计划问题(费用流)
题目描述 传送门 题解 拆点,把每天的点拆成xi和yi,xi表示每一天的脏毛巾,yi表示每一天的新毛巾. 从超级源向xi连边,容量为ri,费用为0: 从yi向超级汇连边,容量为ri,费用为0: 从超级 ...
- [网络流24题] No2_太空飞行计划
727. [网络流24题] 太空飞行计划 ★★☆ 输入文件:shuttle.in 输出文件:shuttle.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] W ...
最新文章
- Apache htpasswd命令
- HLG1159 MAGI System【大整数乘法】
- 图解 Elasticsearch 原理
- Linux网络IO精华指南
- 使用SAP WebIDE创建开发Java应用,并且在浏览器里调试
- js中比较时间字串大小
- 我的一个朋友加班猝死了,我很恐慌
- c访问mysql数据库_C语言访问MySQL数据库的方法
- Silverlight4.0教程之与摄像头与迈克风设备交互
- 摘抄和总结--确保搞砸人工智能项目的十种方法
- LibreOJ #10003加工生产调度(Johnson算法求解最短时间)
- 嵌入式Linux用java_嵌入式linux 开发步骤详细解析(Hello Embedded World)
- bat脚本转成exe执行程序
- 流量卡之家:物联网帮助我们应对全球问题的5种方式
- win8桌面计算机图标不见,win8桌面图标消失,win8桌面图标设置方法
- Windows7 64位安装EPLAN P8 2.6教程
- 【CS224n-5】Linguistic Structure: Dependency Parsing
- 尚硅谷网课笔记 P361-P370
- A网站引用B服务器虚拟目录文件导致:网站部署到IIS7上出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题
- [linux运维]1@linux shell中的实用命令