2191. 数字梯形问题(网络流,费用流,最大权不相交路径)

活动 - AcWing

给定一个由 n 行数字组成的数字梯形如下图所示。

梯形的第一行有 m 个数字。

从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。

规则 1:从梯形的顶至底的 m 条路径互不相交。

规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。

规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。

QQ截图20200727103803.png

对于给定的数字梯形,分别按照规则 1,规则 2,和规则 3 计算出从梯形的顶至底的 m 条路径,使这 m 条路径经过的数字总和最大。

输入格式

第 1 行中有 2 个正整数 m 和 n,分别表示数字梯形的第一行有 m 个数字,共有 n 行。

接下来的 n 行是数字梯形中各行的数字。第 1 行有 m 个数字,第 2 行有 m+1 个数字,以此类推。

输出格式

将按照规则 1,规则 2,和规则 3 计算出的最大数字总和输出,每行输出一个最大总和。

数据范围

1≤n,m≤20,
梯形中的数字范围 [1,1000]。

输入样例:
2 5
2 3
3 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1
输出样例:
66
75
77

解析: 

边只能走一次,只需要将边的容量设置成 1 就可以。点只能走一次就需要用一个常用的拆点技巧,将每个点拆成入点和出点,对每个点的限制就可以对入点到出点之间的边做限制,这里每个点只能走一次,那么就将每个点的入点到出点之间的边的容量设置成 1。

然后起点是所有的顶点,终点是所有的底点,因此从源点向所有顶点连一条边,容量是 1。从所有底点向汇点连一条边,如果是规则一,那么容量就是 1,如果是规则二、三,由于点可以相交,最终可能某一个底点是多条路径的终点,因此这时容量应该设成 +∞。

到此为止这个流网络就构建好了,简单证明一下就可以发现,原问题的任意一个可行方案都和流网络中任意一个可行流是一一对应的,并且由于所有方案都有 m 条路径,而源点出去的流量只有 m,因此任意一个可行方案都对应了一个最大流。

然后本题要求的是所有方案中经过点的权值和最大的路径,即权值和最大的一个最大流,我们将每个点的入点到出点的边的费用设置成对应的权值,其余边的费用都设置成 0,那么权值和最大的最大流就等价于最大费用最大流,每次根据不同的规则放开点和边的限制重新求一遍最大费用最大流即可。

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1200 + 100, M = (1200 * 2) * 2 + 10, INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], f[M], w[M], ne[M], idx;
int q[N], d[N], pre[N], incf[N];
bool st[N];
int id[610][610], cost[610][610];void add(int a, int b, int c, int d) {e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx++;e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx++;
}bool spfa() {int hh = 0, tt = 1;memset(d, -0x3f, sizeof d);memset(incf, 0, sizeof incf);q[0] = S, d[S] = 0, incf[S] = INF;while (hh != tt) {int t = q[hh++];if (hh == N)hh = 0;st[t] = 0;for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (f[i] && d[j] < d[t] + w[i]) {d[j] = d[t] + w[i];incf[j] = min(incf[t], f[i]);pre[j] = i;if (!st[j]) {st[j] = 1;q[tt++] = j;if (tt == N)tt = 0;}}}}return incf[T]>0;
}int EK() {int ret = 0;while (spfa()) {int t = incf[T];ret += t * d[T];for (int i = T; i != S; i = e[pre[i] ^ 1]) {f[pre[i]] -= t;f[pre[i] ^ 1] += t;}}return ret;
}int main() {cin >> m >> n;int cnt = 0;S = cnt++;T = cnt++;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m + i - 1; j++) {scanf("%d", &cost[i][j]);id[i][j] = cnt++;}}memset(h, -1, sizeof h);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m + i - 1; j++) {add(id[i][j] * 2, id[i][j] * 2 + 1, 1, cost[i][j]);if (i == 1)add(S, id[i][j] * 2, 1, 0);if (i == n)add(id[i][j] * 2 + 1, T, 1, 0);if (i<n) {add(id[i][j] * 2 + 1, id[i + 1][j] * 2, 1, 0);add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, 1, 0);}}}printf("%d\n", EK());memset(h, -1, sizeof h);idx = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m + i - 1; j++) {add(id[i][j] * 2, id[i][j] * 2 + 1, INF, cost[i][j]);if (i == 1)add(S, id[i][j] * 2, 1, 0);if (i == n)add(id[i][j] * 2 + 1, T, INF, 0);if(i<n) {add(id[i][j] * 2 + 1, id[i + 1][j] * 2, 1, 0);add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, 1, 0);}}}printf("%d\n", EK());memset(h, -1, sizeof h);idx = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m + i - 1; j++) {add(id[i][j] * 2, id[i][j] * 2 + 1, INF, cost[i][j]);if (i == 1)add(S, id[i][j] * 2, 1, 0);if (i == n)add(id[i][j] * 2 + 1, T, INF, 0);if(i<n) {add(id[i][j] * 2 + 1, id[i + 1][j] * 2, INF, 0);add(id[i][j] * 2 + 1, id[i + 1][j + 1] * 2, INF, 0);}}}printf("%d\n", EK());return 0;
}

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

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

相关文章

隧道技术和代理技术(一)

目录 基础知识 单机-防火墙-限制协议出入站 域控-防火墙-组策略对象同步 域控-防火墙-组策略不出网上线 基础知识 -隧道技术&#xff1a;解决不出网协议上线的问题&#xff08;利用出网协议进行封装出网&#xff09; -代理技术&#xff1a;解决网络通讯不通的问题&#xf…

职场卷王:我用可视化大屏模板做工作汇报,惊艳了同事和领导。

2023结束了&#xff0c;我和我的小伙伴们纷纷开始忙碌的年终总结和汇报。 正忙着汇总Excel数据、写word讲稿、找PPT模板时&#xff0c;我发现隔壁组的老王独自在大会议室偷偷调试起了那台汇报用的电视机。 不会吧不会吧&#xff0c;年终汇报还有一周呢&#xff0c;这家伙PPT都…

web组态--新一代全流程低代码物联网平台

先上图&#xff0c;实际完成效果&#xff1a; 1.添加应用图纸 登录by组态后台&#xff1a;http://www.byzt.net:90 ​ 点击组态管理-画面管理&#xff0c;先新建一个组态画面&#xff0c;填写画面名称&#xff0c;保存&#xff0c;进入组态画面。 ​ 选择画面管理&#xff…

mysql高可用架构设计

一、主从架构 主从架构一般如下所示 这里从节点一般设置成只读&#xff08;readonly&#xff09;模式。这样做&#xff0c;有以下几个考虑&#xff1a; 有时候一些运营类的查询语句会被放到备库上去查&#xff0c;设置为只读可以防止误操作&#xff1b; 防止切换逻辑有 bug&a…

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

微服务架构 | 多级缓存

INDEX 通用设计概述2 优势 通用设计概述 通用设计思路如下图 内容分发网络&#xff08;CDN&#xff09; 可以理解为一些服务器的副本&#xff0c;这些副本服务器可以广泛的部署在服务器提供服务的区域内&#xff0c;并存有服务器中的一些数据。 用户访问原始服务器时&#x…

Kafka | SpringBoot集成Kafka

SpringBoot集成Kafka 一、前言二、项目1. pom2. application.properties4. 消息生产者-测试5. 消息消费者 三、启动测试四、有总结的不对的地方/或者问题 请指正, 我在努力中 一、前言 该文章中主要对SpringBoot 集成Kafka 主要是 application.properties 与 pom坐标就算集成完…

【无刷电机学习】光耦HCNR200基本原理及应用(资料摘抄)

【仅作自学记录&#xff0c;不出于任何商业目的。如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01;】 本文摘抄翻译自&#xff1a; https://docs.broadcom.com/wcs-public/products/application-notes/application-note/331/6/av02-1333en-an_5394-16jul10.pdfhtt…

ruoyi-vue-plus4.X版本实现内嵌swagger文档(简单解决方法)

1.在common模块中添加pom依赖 <dependency><groupId>org.webjars</groupId><artifactId>swagger-ui</artifactId><version>4.15.5</version></dependency>结果如下&#xff1a; 2.在ResourcesConfig配置类的addResourceHandl…

打家劫舍(java版)

&#x1f4d1;前言 本文主要是【动态规划】——打家劫舍(java版)的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

LeetCode.232. 用栈实现队列

题目 232. 用栈实现队列 分析 先了解一下栈和队列的特点&#xff1a; 栈&#xff1a;先进后出队列&#xff1a;先进先出 想用栈实现队列的特点&#xff0c;就需要使用两个栈。因为两个栈就可以将列表倒序。 假设第一个栈 s1 [1,2,3]&#xff0c;第二个栈 s2 [] 。若循环…

CAN通信篇 - Can模块配置(一)

文章目录 CanConfigSetCanControllersCanControllerBaudrateConfigCanFilterMask CanHardwareObjectsCanGeneralCanMainfunctionRWPeriods 总结 Can模块的是CAN控制器模块&#xff0c;该模块比较简单&#xff0c;只包括三个部分&#xff1a;Can控制器、Can硬件对象&#xff08;…