洛谷P2762 太空飞行计划问题
这题套路好深......没想渠。
题意:给你若干个设备,若干个任务。
每个任务需要若干设备,设备可重复利用。
完成任务有钱,买设备要钱。
问最大总收益(可以什么任务都不做)。
解:最大权闭合子图。
对于一个有向图,如果选择了一个点,那么就要选择它的所有后继节点。求最大权值和。
建立s,t,记所有正权值和为sum。
s向所有权值为正的点连边,流量为权值。
所有权值为负的点向t连边,流量为权值的绝对值。
对于所有边,建立流量INF的边。
答案即为sum - 最小割。
证明:
你割的边显然只能与s或t相连。
如果割了s -> a,表示不选a。
如果割了b -> t,表示选b。
那么如果你选了一个点c,那么就没割,那么c的所有后继节点肯定都割了。
大概就是这样...意会一下吧。
- #include <cstdio>
- #include <queue>
- #include <algorithm>
- #include <cstring>
- #include <iostream>
- #include <string>
- const int N = , M = , INF = 0x3f3f3f3f;
- struct Edge {
- int nex, v, c;
- }edge[M << ]; int top = ;
- int e[N], d[N], use[N];
- std::queue<int> Q;
- std::string str;
- inline void add(int x, int y, int z) {
- top++;
- edge[top].v = y;
- edge[top].c = z;
- edge[top].nex = e[x];
- e[x] = top;
- top++;
- edge[top].v = x;
- edge[top].c = ;
- edge[top].nex = e[y];
- e[y] = top;
- return;
- }
- inline bool BFS(int s, int t) {
- memset(d, , sizeof(d));
- d[s] = ;
- Q.push(s);
- while(!Q.empty()) {
- int x = Q.front();
- Q.pop();
- for(int i = e[x]; i; i = edge[i].nex) {
- int y = edge[i].v;
- if(!edge[i].c || d[y]) {
- continue;
- }
- d[y] = d[x] + ;
- Q.push(y);
- }
- }
- return d[t];
- }
- int DFS(int x, int t, int maxF) {
- if(x == t) {
- return maxF;
- }
- int ans = ;
- for(int i = e[x]; i; i = edge[i].nex) {
- int y = edge[i].v;
- if(!edge[i].c || d[x] + != d[y]) {
- continue;
- }
- int temp = DFS(y, t, std::min(edge[i].c, maxF - ans));
- if(!temp) {
- d[y] = INF;
- }
- ans += temp;
- edge[i].c -= temp;
- edge[i ^ ].c += temp;
- if(ans == maxF) {
- break;
- }
- }
- return ans;
- }
- inline int solve(int s, int t) {
- int ans = ;
- while(BFS(s, t)) {
- ans += DFS(s, t, INF);
- }
- return ans;
- }
- inline void read(int *a) {
- getline(std::cin, str);
- a[] = ;
- int len = str.size();
- int f = ;
- for(int i = ; i < len; i++) {
- if(str[i] < '' || str[i] > '') {
- f = ;
- }
- else {
- if(!f) {
- f = ;
- a[++a[]] = str[i] - '';
- }
- else {
- (a[a[]] *= ) += str[i] - '';
- }
- }
- }
- return;
- }
- int main() {
- int m, n, sum = ;
- scanf("%d%d", &m, &n);
- int s = m + n + , t = n + m + ;
- for(int i = , x; i <= m; i++) {
- scanf("%d", &x);
- add(s, i, x);
- read(use);
- for(int j = ; j <= use[]; j++) {
- add(i, m + use[j], INF);
- }
- sum += x;
- }
- for(int i = , x; i <= n; i++) {
- scanf("%d", &x);
- add(m + i, t, x);
- }
- int ans = solve(s, t);
- for(int i = ; i <= m; i++) {
- if(d[i]) {
- printf("%d ", i);
- }
- }
- puts("");
- for(int i = ; i <= n; i++) {
- if(d[i + m]) {
- printf("%d ", i);
- }
- }
- printf("\n%d", sum - ans);
- return ;
- }
AC代码
洛谷P2762 太空飞行计划问题的更多相关文章
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- 洛谷 P4174 [NOI2006]最大获利 && 洛谷 P2762 太空飞行计划问题 (最大权闭合子图 && 最小割输出任意一组方案)
https://www.luogu.org/problemnew/show/P4174 最大权闭合子图的模板 每个通讯站建一个点,点权为-Pi:每个用户建一个点,点权为Ci,分别向Ai和Bi对应的点连 ...
- 洛谷 - P2762 - 太空飞行计划问题 - 最小割
https://www.luogu.org/problemnew/solution/P2762 最小割对应的点,在最后一次更新中dinic的bfs会把他的dep重置掉.所以可以根据这个性质复原最小割. ...
- 洛谷 [P2762] 太空飞行计划问题
最大权闭合子图 胡伯涛论文真是个好东西.jpg 求一个有向图的最大权闭合子图,常应用于有先决条件的最优化问题中 将所有正权点与源点相连,容量为点权; 将所有负权点与汇点相连,容量为点权的相反数; 将原 ...
- 洛谷P2762 太空飞行计划问题(最小割)
传送门 我们可以把实验放在左边,仪器放在右边,点有点权,然后连对应的有向边,就是求一个最大权闭合图,可以转化为最小割来做(关于这具体是个啥……可以百度胡伯涛<最小割模型在信息学竞赛中的应用> ...
- 洛谷P2762 太空飞行计划问题(最大权闭合图)
题意 有$m$个实验,$n$中器材,每个实验需要使用一些器材 每个实验有收入,每个器材有花费 最大化收入 - 花费 Sol 最大权闭合图的经典应用 从$S$向每个实验连流量为该实验收入的边 从每个器材 ...
- 洛谷 P2762 太空飞行计划问题 【最大权闭合子图+最小割】
--一道难在读入的题. 最后解决方案直接getline一行然后是把读优拆掉放进函数,虽然很丑但是过了. 然后就是裸的最大权闭合子图了,把仪器当成负权点向t连流量为其价格的边,s向实验连流量为实验报酬的 ...
- 网络流24题:P2762 太空飞行计划问题
P2762 太空飞行计划问题 题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,E ...
- P2762 太空飞行计划问题(网络流24题之一)
题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...
随机推荐
- laravel中如何在模型中自关联?
https://segmentfault.com/q/1010000007926567 在模型中声明一对多的关系,关联表本身.parent_id对应父记录的id.我在sof中查阅到很多这样的写法: p ...
- js尾递归函数
普通递归: function fac(n) { if (n === 1) return 1; return n * fac(n - 1); } fac(5) // 120 这是个阶乘.但是占用内存,因 ...
- j收集ava面试题
史上最全Java面试题(带全部答案) https://blog.csdn.net/linzhiqiang0316/article/details/80473906
- Python:matplotlib绘制线条图
线型图是学习matplotlib绘图的最基础案例.我们来看看具体过程: 下面我们将两条曲线绘制到一个图形里: 可以看到这种方式下,两个线条共用一个坐标轴,并且自动区分颜色. plot方法的核心是 ...
- 莫烦theano学习自修第八天【分类问题】
1. 代码实现 from __future__ import print_function import numpy as np import theano import theano.tensor ...
- linux 挂载windows下目录,其它linux机器nfs的目录,自己dd的文件
如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 挂载window下共享的目录 //192.168.0.11/share /mnt 挂载其它linux机器下目录 ...
- Spring 使用介绍(十二)—— Spring Task
一.概述 1.jdk的线程池和任务调用器分别由ExecutorService.ScheduledExecutorService定义,继承关系如下: ThreadPoolExecutor:Executo ...
- 【XSY2535】整数 NTT
题目描述 问有多少个满足以下要求的\(k\)进制数: 1.每个数字出现的次数不超过\(n\) 2.\(0\)没有出现过 3.若\(g_{i,j}=0\),则\(i\)不能出现恰好\(j\)次. 两次询 ...
- Xadmin 组件基础使用以及全局配置
xadmin 的安装 方式一 pip 安装 会因为编码问题导致报错 因此需要下载 更改 README.rst 后本地安装 详情点击这里 方式二 源码方式安装 在 github 上下载源码后 将 xad ...
- qml(Qt Quick)做界面
qml(Qt Quick)做界面 来源 https://www.zhihu.com/question/24880681/answer/29324824 本人是Qt初学者,正在写一个会计小软件(Lin ...