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

news2024/12/29 10:56:49

「网络流 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 long

const 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]) //位于集合 S
   			std::cout << i << ' ';
   	std::cout << endl;
   	fore(i, 1, m + 1)
   		if(c[i + n]) //位于集合 S
   			std::cout << i << ' ';
	std::cout << endl;
   	
   	std::cout << ans;
    
	return 0; 
}

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

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

相关文章

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

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

【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

论文笔记模版

1. 摘要 1.1 背景 1.2 挑战 1.3 提出新方法 1.4 贡献 2. 引言 2.1 背景&#xff08;引出问题&#xff09; ①介绍大背景&#xff1a; ② 应用场景&#xff1a; ③ 介绍主题&#xff1a; 2.2 引出挑战 一般用图表来展现出我们的挑战&#xff08;直观&#xff0c;解决什…

速卖通揭秘:aliexpress.item_get API商品详情返回值全解析

速卖通&#xff08;AliExpress&#xff09;是阿里巴巴旗下的一个面向全球市场的B2C电商平台&#xff0c;为卖家提供了一个向全球消费者销售商品的平台。对于开发者来说&#xff0c;速卖通提供了API接口来方便地进行数据交互和集成。其中&#xff0c;item_get API是用于获取商品…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题&#xff0c;经常出现这样的问题&#xff0c;刚重启系统时不报错了&#xff0c;可是运行一段时间又会出现。sql已经写了limit 1&#xff0c;mybatis的debug日志也返回total为1&#xff0c;可是却报错返回了1805条数据 乍一看&#xff0c;感觉太不…

【FTP】配置FTP服务器并访问测试(已更新)

1.之前访问搭建的FTP服务器&#xff0c;有些现场环境未搭建&#xff0c;在数据处理过程中遇到一些阻力&#xff0c;多有不便之处。 2.熟悉、梳理、总结下FTP服务器相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 基于Linux配置FTP服务器并访问测试文章目录索…

基于V4L2框架的摄像头从上层到底层开发

文章目录 一、V4L2应用开发1、识别摄像头2、查看摄像头设备的能力3、查看支持视频格式4、设置视频格式5、申请帧缓冲6、启动采集7、出队取一帧图像8、入队归还帧缓冲9、停止视频采集10、退出释放资源 二、V4L2框架源码分析1、struct video_device2、struct v4l2_device *v4l2_d…

unity ui 同屏

一共有三个摄像机&#xff0c;上屏&#xff0c;下屏 和 类似照相机的ccamera 类似照相机的ccamera的设置&#xff1a; 下屏摄像机设置&#xff1a; 下屏交互的Canvas设置&#xff1a; 新建一个canvas&#xff0c;下面放上rawimage&#xff1a; 如果下屏不想显示的内容&#xf…

【前端】实现快速改变内容大小选择框

简言 简单实现选择框改变内容大小和位置。 内容 这里实现选择框改变内容大小是让内容宽高等于选择框的百分之百&#xff0c;当选择框大小改变时&#xff0c;内容也会响应的改变。 位置则是根据定位实现的。 选择框 选择框就是一个div&#xff0c;然后定位上下左右四条边和…

Stable Diffusion【古风模型】:喜欢古风的看过来,超写实汉服兼顾现代风格大模型汉服国风桃夭

这次来介绍【Stable Diffusion【古风模型】&#xff1a;喜欢古风的看过来&#xff0c;超写实汉服兼顾现代风格大模型汉服国风桃夭】&#xff0c;对于汉服国风桃妖大模型&#xff0c;不仅在古装国风写实上表现出色&#xff0c;同时该模型也兼容现代风格&#xff0c;并且出图效果…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…

信创基础硬件之芯片

信创基础硬件之芯片 文章目录 信创基础硬件之芯片服务器服务器的定义服务器的功能服务器的构成服务器的性能 处理器&#xff08;CPU&#xff09;CPUGPUDPU CPU的分类按CPU指令集架构分类按CPU体系架构分类 CPU产业链六大国产CPU公司详解海光飞腾鲲鹏兆芯龙芯申威 国产CPU对比从…

自动群发国际短信脚本的详情介绍!

在当今全球化的商业环境中&#xff0c;信息的及时传递显得尤为重要&#xff0c;国际短信作为一种高效、低成本的沟通方式&#xff0c;被广泛应用于企业营销、客户服务、产品推广等领域。 为了满足企业对于群发国际短信的需求&#xff0c;市场上涌现出了许多自动群发国际短信脚…

Golang编译优化——稀疏条件常量传播

文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播&#xff08;constant propagation&#xff09;是一种转换&#xff0c;对于给定的关于某个变量 x x x和一个常量 c …

初探MFC程序混合使用QT

一、背景 随着操作系统国产化替代的趋势越发明显&#xff0c;软件支持国际化、跨平台&#xff0c;已然是必须做的一件事情。原有的软件UI层用的是MFC&#xff0c;将其换成QT&#xff0c;想必是一种较好的方案。对于大型软件&#xff0c;特别是已发布&#xff0c;但还处于不断迭…

43.乐理基础-拍号-常见的拍号与强弱关系

首先拍号的定义&#xff1a;39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 通过 39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 应该可以知道 Y的取值只能是2、4、8、16、32、64。。。。因为Y指的是Y分音符&#xff0c;…

数据库数据恢复—Sql Server数据库文件丢失丢失怎么恢复数据?

数据库数据恢复环境&#xff1a; 5块硬盘组建一组RAID5阵列&#xff0c;划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库&#xff0c;存储空间在操作系统层面划分了三个逻辑分区。 数据库故障&#xff1a; 数据库文件丢失&#xff0c;主要涉及3个…

Adobe系列软件安装

双击解压 先运行Creative_Cloud_Set_Up.exe。 完毕后&#xff0c;运行AdobeGenP.exe 先Path&#xff0c;选路径&#xff0c;如 C:\Program Files\Adobe 后Search 最后Patch。 关闭软件&#xff0c;修图&#xff01;

【LeetCode刷题记录】124. 二叉树中的最大路径和

124 二叉树中的最大路径和 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的…

记录我的程序猿副业首笔创收

在这个充满机遇的数字时代&#xff0c;我&#xff0c;一个普通的程序猿&#xff0c;编程爱好者&#xff0c;终于在云端源想这个平台上收获了属于我的第一桶金。这是一个关于兼职、学习与成长的故事&#xff0c;希望能激发同在编程路上的你&#xff0c;勇敢迈出那一步。 先晒晒…