LOJ #6010. 「网络流 24 题」数字梯形
#6010. 「网络流 24 题」数字梯形
题目描述
给定一个由 n nn 行数字组成的数字梯形如下图所示。梯形的第一行有 m mm 个数字。从梯形的顶部的 m mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。
分别遵守以下规则:
- 从梯形的顶至底的 m mm 条路径互不相交;
- 从梯形的顶至底的 m mm 条路径仅在数字结点处相交;
- 从梯形的顶至底的 m mm 条路径允许在数字结点相交或边相交。
输入格式
第 1 11 行中有 2 22 个正整数 m mm 和 n nn,分别表示数字梯形的第一行有 m mm 个数字,共有 n nn 行。接下来的 n nn 行是数字梯形中各行的数字。
第 1 11 行有 m mm 个数字,第 2 22 行有 m+1 m + 1m+1 个数字 ……
输出格式
将按照规则 1,规则 2,和规则 3 计算出的最大数字总和并输出,每行一个最大总和。
样例
样例输入
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≤m,n≤20 1 \leq m, n \leq 201≤m,n≤20
code
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
const int N = ;
const int INF = 1e9; struct Edge{
int u,v,f,c,nxt;
Edge(){}
Edge(int a,int b,int flow,int cost,int nt) {
u = a;v = b;f = flow;c = cost;nxt = nt;
}
}e[];
int head[N],dis[N],q[],pre[N],a[][],b[][];
bool vis[N];
int n,m,S,T,tn,L,R,Mc,ans,tot; inline char nc() {
static char buf[],*p1 = buf,*p2 = buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2) ? EOF :*p1++;
}
inline int read() {
int x = ,f = ;char ch=nc();
for (; ch<''||ch>''; ch=nc()) if(ch=='-')f=-;
for (; ch>=''&&ch<=''; ch=nc()) x=x*+ch-'';
return x*f;
}
void add_edge(int u,int v,int f,int c) {
e[++tot] = Edge(u,v,f,c,head[u]);head[u] = tot;
e[++tot] = Edge(v,u,,-c,head[v]);head[v] = tot;
}
bool spfa() {
for (int i=; i<=T; ++i) vis[i]=false,dis[i]=INF;
L = ;R = ;
dis[S] = ;
q[++R] = S;vis[S] = true;pre[S] = ;
while (L <= R) {
int u = q[L++];
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].v;
if (dis[v]>dis[u]+e[i].c && e[i].f > ) {
dis[v] = dis[u] + e[i].c;
pre[v] = i;
if (!vis[v]) q[++R] = v,vis[v] = true;
}
}
vis[u] = false;
}
return dis[T]!=INF;
}
void mcf() {
int zf = INF;
for (int i=T; i!=S; i=e[pre[i]].u)
zf = min(zf,e[pre[i]].f);
for (int i=T; i!=S; i=e[pre[i]].u)
e[pre[i]].f -= zf,e[pre[i]^].f += zf;
Mc += dis[T]*zf;
}
int work() {
Mc = ;
while (spfa()) mcf();
printf("%d\n",-Mc);
}
void init() {
tot = ;
memset(head,,sizeof(head));
}
void build_1() {
init();
S = tn + tn + ;T = tn + tn + ;
for (int i=; i<=n; ++i)
for (int j=; j<=m+i-; ++j) {
add_edge(b[i][j],b[i][j]+tn,,-a[i][j]);
add_edge(b[i][j]+tn,b[i+][j],,);
add_edge(b[i][j]+tn,b[i+][j+],,);
if (i==) add_edge(S,b[i][j],,);
if (i==n) add_edge(b[i][j]+tn,T,,);
}
}
void build_2() {
init();
S = tn + ;T = tn + ;
for (int i=; i<=n; ++i) {
for (int j=; j<=m+i-; ++j) {
add_edge(b[i][j],b[i+][j],,-a[i][j]);
add_edge(b[i][j],b[i+][j+],,-a[i][j]);
if (i==) add_edge(S,b[i][j],,);
if (i==n) add_edge(b[i][j],T,INF,-a[i][j]);
}
}
}
void build_3() {
init();
S = tn + ;T = tn + ;
for (int i=; i<=n; ++i) {
for (int j=; j<=m+i-; ++j) {
add_edge(b[i][j],b[i+][j],INF,-a[i][j]);
add_edge(b[i][j],b[i+][j+],INF,-a[i][j]);
if (i==) add_edge(S,b[i][j],,);
if (i==n) add_edge(b[i][j],T,INF,-a[i][j]);
}
}
}
int main() {
m = read(),n = read();
for (int i=; i<=n; ++i)
for (int j=; j<=m+i-; ++j) a[i][j] = read(),b[i][j] = ++tn; build_1();work();
build_2();work();
build_3();work();
return ;
}
LOJ #6010. 「网络流 24 题」数字梯形的更多相关文章
- 【刷题】LOJ 6010 「网络流 24 题」数字梯形
题目描述 给定一个由 \(n\) 行数字组成的数字梯形如下图所示.梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至 ...
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
- Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)
Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...
- 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题
题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...
- [luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划
[luogu_P1251][LOJ#6008]「网络流 24 题」餐巾计划 试题描述 一个餐厅在相继的 \(N\) 天里,第 \(i\) 天需要 \(R_i\) 块餐巾 \((i=l,2,-,N)\) ...
- [LOJ#6002]「网络流 24 题」最小路径覆盖
[LOJ#6002]「网络流 24 题」最小路径覆盖 试题描述 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交)的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 ...
- loj #6014. 「网络流 24 题」最长 k 可重区间集
#6014. 「网络流 24 题」最长 k 可重区间集 题目描述 给定实直线 L LL 上 n nn 个开区间组成的集合 I II,和一个正整数 k kk,试设计一个算法,从开区间集合 I II 中选 ...
- loj #6013. 「网络流 24 题」负载平衡
#6013. 「网络流 24 题」负载平衡 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时 ...
- loj #6122. 「网络流 24 题」航空路线问题
#6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...
随机推荐
- springBoot学习 错误记录
1.下面结果 会出现500错误 原因:thymeleaf相关包版本不兼容导致 解决:之前配置的3.0.9对应2.1.1&2.2.2,3.0.6对应2.2.2&2.1.1都不可以,下面的 ...
- 给类型为text的input设置value值却无法修改
给类型为text的input设置value值后就无法修改了 我的页面显示为如下但是退格却无法改变他的值 原来是缺少onChange事件,没法监听value的改变 所以需要添加 onChange={th ...
- contenttype组件、Django缓存机制以及跨域请求
1 昨日回顾 版本控制 *** (1)url=127.0.0.1/course/?version=v100000 1 versioning_class=QueryParameterVersioning ...
- 学习笔记:location.hash和history.pushState()
在浏览器中改变地址栏url,将会触发页面资源的重新加载,这使得我们可以在不同的页面间进行跳转,得以浏览不同的内容.但随着单页应用的增多,越来越多的网站采用ajax来加载资源.因为异步加载的特性,地址栏 ...
- ajax请求总是返回error的问题
多半是因为返回值格式的问题,在后台返回的应与前台设定的值一直,不然就会进入error,会报404服务器错误,极有可能是后台返回的数据类型不对 public void exitSystem( HttpS ...
- centos7.4 安装后的基本设置
centos7.4 安装后的基本设置 设置主机名称 设置IP地址,网关 修改网卡名称 内核优化 系统安全设置 防火墙设置 ssh设置 同步系统时间 安装基础软件包 软件配置 设置主机名称 hostna ...
- Redis分片(分区)
分区的概念 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集. 如果只使用一个redis实例时,其中保存了服务器中全部的缓存数据,这样会有很大风险,如果单台redis服 ...
- ADO数据库编程详解(C++)----初级入门篇
一.概述 ADO即Microsoft ActiveXData Object,是Microsoft继ODBC之后,基于OLE DB技术的一种数据库操作技术,使您能够编写通过 OLE DB提供者对在数据库 ...
- centos6.5_64bit-nginx安装部署
1.配置防火墙,开启80端口.3306端口 vim /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dpor ...
- 企业常用的站内收索、QQ群、在线客服
<div class="toplinks"> <form target="_blank"> ...