网络流 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.hqwc.cn/news/688280.html

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

相关文章

C++基础中的存储类别

存储的类别是变量的属性之一&#xff0c;C语言定义了4种变量的存储类别&#xff0c;分别是auto变量、static变量、register变量和extern变量。以下重点介绍这几种类型。 一、auto变量 auto变量是C默认的存储类型。函数内未加存储类型说明的变量均被称为自动变量&#xff0c;即…

【CTFHub】HTTP 请求方式 302跳转 cookie WP

1.请求方式 打开给出的URL进入一个页面&#xff0c;提示原方法是GET&#xff0c;用CTFHUB方法就能获得flag 思路&#xff1a;抓包&#xff0c;将GET方法改成CTFHUB方法进行重新发送请求&#xff0c;查看响应情况 1.打开代理服务器 2.打开BurpSuite 刷新页面获得拦截 3.发送…

东南亚服务器租用托管的优势

东南亚地区在国际贸易领域展现出了巨大的潜力和吸引力&#xff0c;其未来的外贸发展前景被认为是广阔且充满了无限商机。这一地区以其人口众多、经济快速发展的特点&#xff0c;结合独特的地理优势和丰富的自然资源&#xff0c;正在吸引全球企业的目光。今天我们一起来看看东南…

matlab 基于拉依达检验法(3σ准则) 实现多类别多参数的批量异常样本检验 V2.0

简介 拉依达检验法&#xff08;3σ准则&#xff09;是一种统计学方法&#xff0c;用于检测数据中的异常值。这种方法基于正态分布的特性来确定数据点是否可能是异常值。以下是关于拉依达检验法&#xff08;3σ准则&#xff09;的详细介绍&#xff1a; 基本原理&#xff1a; 拉…

uni-app安卓本地打包个推图标配置

如果什么都不配置&#xff0c;默认的就是个推小鲸鱼图标 默认效果 配置成功效果 个推图标配置 新建目录 drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi 目录中存放图标 每个目录中存放对应大小的图标&#xff0c;大图…

谁使用DITA?

▲ 搜索“大龙谈智能内容”关注公众号▲ Keith根据LinkedIn上的数据进行的统计&#xff0c;主要反应的西方世界使用DITA的公司。因为LinkedIn在国内不能访问&#xff0c;笔者认为针对中国的数据并不准确。 作者 | John Walker - NXP销售和市场营销业务分析师 2013年4月18日 …

5.9网络协议

由网卡发送数据通过网线进行发送&#xff0c;当网卡接收到信号以后将数据传给内核数据区&#xff0c;然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现&#xff0c;这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

代码质量检查jacoco环境搭建

这里主要介绍集成和系统测试覆盖率环境搭建&#xff0c;并简单介绍各个工具。 关于单元测试的覆盖率监控(只需要修改ant或maven配置即可)&#xff0c;下一篇说明 环境准备 需要环境 jdk1.8centos 7posgresql 9.6 工具下载 jacoco 0.8.2 https://www.eclemma.org/jacoco/ a…

一个“彩光”的自白:入室10万间的变革路

从0到10W 锐捷以太彩光的每一步 2021年 以太全光奠基 锐捷网络创新性提出了以太全光路线的代表性方案——极简以太全光解决方案1.0,在采用光纤作为传播介质的基础上,将交换机直接下沉至房间内。这一举措不仅简化了布线,新增业务只需在房间内灵活扩展,即可完成终端入网,而且通…

【C++】 类的6个默认成员函数

目录 1. 类的6个默认成员函数 一.构造函数 1.基本概念 2 特性 注意&#xff1a;C11 中针对内置类型成员不初始化的缺陷&#xff0c;又打了补丁&#xff0c; 3.构造函数详解 3.1构造函数体赋值 3.2 初始化列表 3.3 explicit关键字 二.析构函数 1 概念 2 特性 两个栈实…

NPDP|传统行业产品经理如何跨越鸿沟,从用户角度审视产品

随着科技的飞速发展和互联网的普及&#xff0c;产品经理的角色已经从单纯的产品规划者逐渐转变为全方位的用户体验设计者。对于传统行业的产品经理来说&#xff0c;这是一个挑战与机遇并存的时代。他们不仅要面对激烈的市场竞争&#xff0c;还要学会如何跨越与新兴科技行业之间…

C++ 搜索二叉树

目录 1.二叉搜索树概念 2. 实现二叉搜索树 2.1. 二叉搜索树的插入 2.2查找 2.3删除节点 3.二叉树的应用&#xff08;KV结构&#xff09; 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为…