网络流 24 题」数字梯形 【费用流、拆点】

网络流 24 题」数字梯形

1

思路

对于规则 1 1 1,要求的是不相交且不相交,我们可以把边的容量设置成 1 1 1,把点拆分成入点出点,将其内部的容量设置成 1 1 1,这样就可以限制点的流量。
把相应的点之间的边的费用设置成点权的负数,跑最小费用最大流即可

对于规则 2 2 2,允许在数字节点处相交,我们就不用拆点来限制点内流量了,但是点和点之间的边的容量还是为 1 1 1,这样子就允许一个点多次使用,但边只能使用一次

对于规则 3 3 3,我们只需要将所有边权的容量设置为 ∞ \infty 即可

#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
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3f;
const long long INFLL=1e18;typedef long long ll;struct MCF {struct Edge {int v, c, w; //边终点、容量、费用Edge(int v, int c, int w) : v(v), c(c), w(w) {}};const int n;std::vector<Edge> e;std::vector<std::vector<int>> g;std::vector<ll> h, dis;std::vector<int> pre;bool dijkstra(int s, int t) {dis.assign(n + 1, std::numeric_limits<ll>::max());pre.assign(n + 1, -1);std::priority_queue<std::pair<ll, int>, std::vector<std::pair<ll, int>>, std::greater<std::pair<ll, int>>> que;dis[s] = 0;que.emplace(0, s);while (!que.empty()) {ll d = que.top().first;int u = que.top().second;que.pop();if (dis[u] < d) continue;for (int i : g[u]) {int v = e[i].v;int c = e[i].c;int w = e[i].w;if (c > 0 && dis[v] > d + h[u] - h[v] + w) {dis[v] = d + h[u] - h[v] + w;pre[v] = i;que.emplace(dis[v], v);}}}return dis[t] != std::numeric_limits<ll>::max();}MCF(int n) : n(n), g(n + 1) {}void addEdge(int u, int v, int c, int w) {g[u].push_back(e.size());e.emplace_back(v, c, w);g[v].push_back(e.size());e.emplace_back(u, 0, -w);}std::pair<int, ll> flow(int s, int t) {int flow = 0;ll cost = 0;h.assign(n + 1, 0);while (dijkstra(s, t)) {for (int i = 1; i <= n; ++i) h[i] += dis[i];int aug = std::numeric_limits<int>::max();for (int i = t; i != s; i = e[pre[i] ^ 1].v) aug = std::min(aug, e[pre[i]].c);for (int i = t; i != s; i = e[pre[i] ^ 1].v) {e[pre[i]].c -= aug;e[pre[i] ^ 1].c += aug;}flow += aug;cost += ll(aug) * h[t];}return std::make_pair(flow, cost);}
};const int N = 100;int a[N][N];
int id[N][N];
int tot;int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int m, n;std::cin >> m >> n;    fore(i, 1, n + 1)fore(j, 1, i + m){std::cin >> a[i][j];a[i][j] *= -1;id[i][j] = ++tot;}MCF mcf(2 * tot + 2);int S = 2 * tot + 1, T = S + 1;fore(j, 1, m + 1) mcf.addEdge(S, 2 * id[1][j] - 1, INF, 0);fore(i, 1, n)fore(j, 1, i + m){int in = 2 * id[i][j] - 1, out = in + 1;mcf.addEdge(in, out, 1, a[i][j]);mcf.addEdge(out, 2 * id[i + 1][j] - 1, 1, 0);mcf.addEdge(out, 2 * id[i + 1][j + 1] - 1, 1, 0);}fore(j, 1, n + m){int in = id[n][j] * 2 - 1, out = id[n][j] * 2;mcf.addEdge(in, out, 1, a[n][j]);mcf.addEdge(out, T, 1, 0);}std::cout << -mcf.flow(S, T).se << endl;MCF mcf2(tot + 2);S = tot + 1, T = S + 1;fore(j, 1, m + 1) mcf2.addEdge(S, id[1][j], 1, 0);fore(i, 1, n)fore(j, 1, i + m){mcf2.addEdge(id[i][j], id[i + 1][j], 1, a[i][j]);mcf2.addEdge(id[i][j], id[i + 1][j + 1], 1, a[i][j]);}fore(j, 1, n + m){mcf2.addEdge(id[n][j], T, INF, a[n][j]);}std::cout << -mcf2.flow(S, T).se << endl;S = 2 * tot + 1, T = S + 1;MCF mcf3(2 * tot + 2);fore(j, 1, m + 1) mcf3.addEdge(S, 2 * id[1][j] - 1, 1, 0);fore(i, 1, n)fore(j, 1, i + m){int in = 2 * id[i][j] - 1, out = in + 1;mcf3.addEdge(in, out, INF, a[i][j]);mcf3.addEdge(out, 2 * id[i + 1][j] - 1, INF, 0);mcf3.addEdge(out, 2 * id[i + 1][j + 1] - 1, INF, 0);}fore(j, 1, n + m){int in = id[n][j] * 2 - 1, out = id[n][j] * 2;mcf3.addEdge(in, out, INF, a[n][j]);mcf3.addEdge(out, T, INF, 0);}std::cout << -mcf3.flow(S, T).se << endl;return 0;
}

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

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

相关文章

T型槽地轨承载力是如何连接整个制造过程的强力桥梁(北重公司设计)

T型槽地轨承载力的定义和计算 T型槽地轨是一种用于工业设备运输和装配的关键组件。它由世界上各行各业的生产商广泛采用&#xff0c;其有效的承载力使其成为连接整个制造过程的强力桥梁。本文将介绍T型槽地轨的承载力以及相关的设计要点和应用。 承载力的定义和计算 承载力是…

语义分割——脑肿瘤图像分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分

文章目录 一、编写服务器代码1.1、分析一个服务器应具备的功能1.1.1、成员变量1.1.2、对外提供的接口 一、编写服务器代码 再次拿出这张图&#xff0c;前面我们已经将重要概念&#xff1a;VirtualHost、exchange、msgQueue、message、binding 都实现了&#xff0c;此时就可以开…

HTTP 1.1 与 HTTP 1.0

什么是HTTP HTTP 就是一个 超文本传输协议 协议 : 双方 约定 发送的 域名 数据长度 连接(长连接还是短连接) 格式(UTF-8那些) 传输 :数据虽然是在 A 和 B 之间传输&#xff0c;但允许中间有中转或接力。 超文本:图片、视频、压缩包,在HTTP里都是文本 HTTP 常见状态码 比如 20…

网络1--通信过程的理解

1.封装与解包 通信的过程就是不断的封装和解包的过程 封装即就是按照“应用”“传输” “网络” “链路” 层&#xff0c;封装给每一层都加上相应的包头&#xff08;每一层都有协议&#xff0c;&#xff09;解包就是接受到的包文被一层层去掉相对应的包头。 任何一层的协议都…

【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装

5月9日消息&#xff0c;据外电报道&#xff0c;OpenAI 周三发布了文档草案&#xff0c;阐述了它希望 ChatGPT 及其其他人工智能技术如何运作。冗长的Model Spec 文件的一部分透露&#xff0c;该公司正在探索进军色情和其他露骨内容领域。 看完这个&#xff0c;心里有点惊讶&am…

使用LangChain和Neo4j快速创建RAG应用

大家好&#xff0c;Neo4j 通过集成原生的向量搜索功能&#xff0c;增强了其对检索增强生成&#xff08;RAG&#xff09;应用的支持&#xff0c;这标志着一个重要的里程碑。这项新功能通过向量索引搜索处理非结构化文本&#xff0c;增强了 Neo4j 在存储和分析结构化数据方面的现…

你认识edge吗,edge是做什么的

简介 Microsoft Edge&#xff08;研发代号为Project Spartan&#xff0c;又译作微软边缘浏览器&#xff0c;Edge浏览器&#xff09;是一个由微软研发的基于Chromium开源项目及其他开源软件的网页浏览器&#xff0c;于2015年1月21日公布&#xff0c;2015年3月30日公开发布第一个…

走进C++:C到C++的过渡

目录 什么是C呢&#xff1f; C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一&#xff1a;命名空间 命名空间有个强大的功能 如何使用 语法糖二&#xff1a;缺省参数 语法糖三&#xff1a;函数重载 语法糖四&#xff1a;引用 引用传参 引用返回 引用和…

MySQL变量的定义与使用

一、标识符命名规范 1、以字母或下划线开头&#xff0c;不能以数字作为开头 2、不允许使用关键字&#xff0c;不能以数字作为开头 3、只允许使用_和$作为标识符&#xff0c;不允许使用其他标识符。 二、变量的种类 1、用户变量。 用户变量必须以标记作为前缀&#xff0c;…

QX---mini51单片机学习---(6)独立键盘

目录 1键盘简绍 2按键的工作原理 3键盘类型 4独立键盘与矩阵键盘的特点 5本节相关原理图 6按键特性 7实践 1键盘简绍 2按键的工作原理 内部使用轻触按键&#xff0c;常态按下按键触点才闭合 3键盘类型 编码键盘与非编码键盘 4独立键盘与矩阵键盘的特点 5本节相关原理…

Python-VBA函数之旅-slice函数

目录 一、slice函数的常见应用场景 二、slice函数使用注意事项 三、如何用好slice函数&#xff1f; 1、slice函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://blog.csdn.net/ygb_1024?spm1010.…

Xilinx 千兆以太网TEMAC IP核用户接口信号

用户接口包括AX14-Stream发送接口和AX14-Stream接收接口&#xff0c;下文简称为用户发送接口和用户接收接口&#xff0c;数据案度可以是易位或16位&#xff0c;其中&#xff0c;8位接口主要针对标准的以太网应用&#xff0c;它利用一个125MHz的时钟产生1Gbps的数据率;当使用16位…

景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!

随着无人机技术的不断发展与革新&#xff0c;它已成为现代社会中一个前景无限的科技领域。 无人机应用领域 边境巡逻与安防&#xff1a;边境管理部门利用无人机监控边境线&#xff0c;防止非法越境和其他安全威胁&#xff0c;同时也能监控地面安保人员的工作状态和行动路线。 …

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的&#xff0c;有特殊作用的一些单词&#xff0c;不可以把这些单词作为标识符来使用。 注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来作为&#xff1a;类名、变量名、否则会报错。 标识符&#xff1a; 标识符就是…

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接&#xff1a;Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样&#xff0c;得到…

开源相机管理库Aravis例程学习(七)——chunk-parser

开源相机管理库Aravis例程学习&#xff08;七&#xff09;——chunk-parser 简介例程代码函数说明arv_camera_create_chunk_parserarv_camera_set_chunksarv_chunk_parser_get_integer_value 简介 本文针对官方例程中的&#xff1a;05-chunk-parser做简单的讲解。并介绍其中调…

Vue项目npm install certificate has expired报错解决方法

1.Vue项目 npm install 安装依赖突然报错&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/zrender/download/zrender-4.3.0.tgz failed, reason: certificate has expired npm ERR! A com…

Ranger 面试题及答案整理,最新面试题

Ranger 的安全模型是如何设计的&#xff1f; Ranger的安全模型设计主要基于访问控制和安全策略的管理&#xff0c;它通过以下几个关键组件实现&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一个中央管理平台&#xff0c;用于定义、更新和管理安全策略。这些策略根据资…