网络流24题 P2762 太空飞行计划问题

题目链接

思路

问题模型:最大权闭合图

转化模型:网络最小割

这道题是网络流中一个比较重要的模型:最大权闭合图转最大流

建立超级源点\(S\)和超级汇点\(T\),然后每个实验连一条从\(S\)到实验,流量为实验收益的边,每个仪器连一条从仪器到\(T\), 流量为仪器耗费的边,然后需要的仪器就连一条从实验到仪器流量为\(inf\)(无穷大)的边,因为实验到仪器的边的流量为正无穷,所以最小割一定不会在上面,根据最大流最小割定理,最大流就等于最小割,我们按照以上所说建图,求出最大流,之后用实验利益的总和减去最大流,得出的就是最大净收益

最大流算法我用的是\(\text{Dinic}\)算法,因为这样方便输出,为什么?因为如果\(d[i]\)不为\(0\)就说明它一定用过,这样就能方便输出啦~

代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int read() {
    char c = getchar(); int x = 0, f = 1;
    for ( ; !isdigit(c); c = getchar()) if(c == '-') f = -1;
    for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
    return x * f;
}

int m, n, cnt, opt, S, T, ans, head[A], d[A], q[A];
struct node { int from, to, nxt, val; } e[A];

inline void add(int from, int to, int val) {
    e[cnt].to = to;
    e[cnt].val = val;
    e[cnt].nxt = head[from];
    head[from] = cnt++;
}

inline bool makelevel(int s, int t) {
    memset(d, 0, sizeof(d));
    memset(q, 0, sizeof(q));
    int l = 0, r = 0;
    d[s] = 1; q[r++] = s;
    while (l < r) {
        int x = q[l++];
        if (x == t) return true;
        for (int i = head[x]; i != -1; i = e[i].nxt) {
            int to = e[i].to;
            if (d[to] == 0 && e[i].val > 0) {
                d[to] = d[x] + 1;
                q[r++] = e[i].to;
            }
        }
    }
    return false;
}

int dfs(int x, int flow, int t) {
    if (x == t) return flow;
    int sum = 0;
    for (int i = head[x]; i != -1; i = e[i].nxt) {
        int to = e[i].to;
        if (d[to] == d[x] + 1 && e[i].val > 0) {
            int tmp = dfs(to, min(flow - sum, e[i].val), t);
            e[i].val -= tmp, e[i ^ 1].val += tmp;
            sum += tmp;
            if (sum == flow) return sum;
        }
    }
    return sum;
}

int main() {
    memset(head, -1, sizeof(head));
    m = read(), n = read();
    int S = 0, T = 555;
    int w, tot = 0, x;
    for (int i = 1; i <= m; i++) {
        scanf("%d", &w), tot += w;
        add(S, i, w), add(i, S, 0);
        while (getchar() == ' ') {
            scanf("%d", &x);
            add(i, x + m, inf);
            add(x + m, i, 0);
        }
    }
    for (int i = 1; i <= n; i++) {
        x = read();
        add(i + m, T, x), add(T, i + m, 0);
    }
    while (makelevel(S, T)) ans += dfs(S, inf, T);
    ans = tot - ans;
    for (int i = 1; i <= m; i++) if (d[i]) cout << i << ' '; puts("");
    for (int i = 1; i <= n; i++) if (d[i + m]) cout << i << ' '; puts("");
    cout << ans << '\n';
    return 0;
}

原文地址:https://www.cnblogs.com/loceaner/p/12310836.html

时间: 2024-12-18 22:35:16

网络流24题 P2762 太空飞行计划问题的相关文章

题解:线性规划与网络流24题 T2 太空飞行计划问题

太空飞行计划问题 问题描述 W教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,-In}.实验Ej 需要用到的仪器是I的子集Rj ∈ I.配置仪器Ik的费用为ck美元.实验Ej 的赞助商已同意为该实验结果支付pj 美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收

LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

【网络流24题】太空飞行计划

[问题描述]W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={ I1, I2,…,In }.实验Ej 需要用到的仪器是I的子集Rj∈I.配置仪器Ik 的费用为ck 美元.实验Ej 的赞助商已同意为该实验结果支付pj 美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收益是指

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

OJ题号:洛谷2762.LOJ6001.CodeVS1233 题目大意: 有$n$个实验和$m$个仪器,每个实验需要依赖若干个仪器,不同实验可以共享一个仪器. 已知每一个实验$x$,有$p_x$的收益,每一个仪器$y$,有$c_y$的花费. 求最大净收益. 思路: 建立超级源汇$S$和$T$, 对于每一个实验$x$,连一条从$S$到$x$的容量为$p_x$的边: 对于每一个实验$x$对应的每一个仪器$y$,连一条从$x$到$y$的容量为$\infty$的边: 对于每一个仪器$y$连一条从$y$到

【PowerOJ1737&amp;网络流24题】太空飞行计划问题(最小割)

题意: 思路: 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned int uint; 5 typedef unsigned long long ull; 6 typedef long double ld; 7 typedef pair<int,int> PII; 8 typedef pair<ll,ll> Pll; 9 typedef v

网络流24题之太空飞行计划

题目大意: 有n个实验要做,做掉奖励相应的钱,但是每个实验需要相应的仪器,每个仪器启动起来要相应的钱,安排使得赚钱最多. 首先引入一个闭合图的概念. 闭合图就是原图的一个子图,如果一个点u在这个子图内,那么它连出去的所有点v也要在这个子图内. 最大权闭合图就是点的权值和最大的闭合图. 模型分析: 1.很明显这是一个二分图,每个实验向需要的仪器连有向边,实验的点权为正,仪器的点权为负,要求最大权闭合图. 2.这是一个选或不选的问题,所以可以转化成最小割的模型,把选的归为S集,不选的归为T集.但是要

洛谷 P2762 太空飞行计划问题

题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的集合I={I1,I2,…In}.实验Ej需要用到的仪器是I的子集RjÍI.配置仪器Ik的费用为ck美元.实验Ej的赞助商已同意为该实验结果支付pj美元.W教授的任务是找出一个有效算法,确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的净收益最大.这里净收益是指进行实验所

刷题总结——太空飞行计划(最大权闭合子图用最大流解决)

题目: 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的集合 I={I1, I2,-In}. 实验 Ej 需要用到的仪器是 I 的子集 Rj∈I.配置仪器 Ik 的费用为 Ck 美元.实验 Ej 的赞助商已同意为该实验结果支付 Pj 美元.W 教授的任务是找出一个有效算法, 确定在一次太空飞行中要进行哪些实验并因此而配置哪些仪器才能使太空飞行的

luogu P2762 太空飞行计划问题

好像是最大权闭合图,也就是最大流最小割啦,找出最大流的路径输出,这题如何建模呢,一样的先设源点和汇点,源点向每个计划连capacity为赞助数的边,每个计划连相应装置capacity为无穷的边,每个装置向汇点连capacity为支付费用的边,这样,最大利润就是赞助总数-最大流啦,如何证?看两个例子 若是可行方案,相减即为利润,若是不可行方案,相减就为0,数学归纳法可推知n个时也对 另一个问题,如何找到最大权闭合图呢,最后一次分层的level数组就可以帮忙了,我们知道退出dinic算法就是无法到达