当前位置: 首页 > news >正文

P2045 方格取数加强版

P2045 方格取数加强版

大意

\(N \times N\) 的方格上走 \(K\),走过的地方就变成收益为 \(0\) 的点,求最大收益。

思路

那么我们思考一下,如何处理,首先是,我们要保证的事情是第一次走有收益,那么我们只需要流的时候流量为 \(K\),这样可以限制次数,那么最后的收益就用花费求,那么如何做到这一点呢?

我们考虑拆点,拆为 in 和 out,那么我们在 in 和 out 间连容量为 \(1\) 的,那么就保证了这个地方只会做一次收益,再连收益为 \(0\) 的边,容量为 \(k - 1\) ,这样下次还能经过,只不过没有收益了,然后就是正常的由 out 点向下面和右边的 in 连边,容量为 \(k\),花费为 \(0\),那么就可以正常的走动。

然后对我们建完的这个图跑最小费用最大流。

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 5005;
const int MAXM = 40005;
struct node{int u, v, nxt, c, w;
}e[MAXM * 4];int S, T;
int tot, h[MAXN], d[MAXN], pre[MAXN];
bool vis[MAXN];
void init(){tot = 0;memset(h, -1, sizeof(h));
}void add(int u, int v, int c, int w){e[tot] = {u, v, h[u], c, w};h[u] = tot ++;e[tot] = {v, u, h[v], 0, -w};h[v] = tot ++;
}bool spfa(){memset(vis, 0, sizeof(vis));memset(d, -1, sizeof(d));memset(pre, -1, sizeof(pre));queue<int> q;q.push(S);d[S] = 0;vis[S] = true;while(!q.empty()){int u = q.front();q.pop();vis[u] = false;for(int i = h[u];~i;i = e[i].nxt){int v = e[i].v;if(e[i].c){if(d[v] < d[u] + e[i].w){d[v] = d[u] + e[i].w;pre[v] = i;if(!vis[v]){q.push(v);vis[v] = true;}}}}}return (d[T] != -1);
}int EK(){int res = 0;while(spfa()){int Min = 1e9;for(int i = T;i != S;i = e[pre[i]].u){Min = min(Min, e[pre[i]].c);}for(int i = T;i != S;i = e[pre[i]].u){e[pre[i]].c -= Min;e[pre[i] ^ 1].c += Min;res += e[pre[i]].w * Min;}}return res;
}int n, k;
int a[MAXN][MAXN];int id(int x, int y){return (x - 1) * n + y;
}int main(){// freopen("maze.in", "r", stdin);// freopen("maze.out", "w", stdout);cin >> n >> k;init();for(int i = 1;i <= n;i ++){for(int j = 1;j <= n;j ++){cin >> a[i][j];}}for(int i = 1;i <= n;i ++){for(int j = 1;j <= n;j ++){int in = id(i, j), out = in + n * n;add(in, out, 1, a[i][j]);add(in, out, k - 1, 0);if(i + 1 <= n){add(out, id(i + 1, j), k, 0);}if(j + 1 <= n){add(out, id(i, j + 1), k, 0);}}}S = 0, T = 2 * n * n + 1;add(S, id(1, 1), k, 0);add(id(n, n) + n * n, T, k, 0);cout << EK() << endl;return 0;
}
http://www.jsqmd.com/news/379503/

相关文章:

  • 学习记录260213
  • OpenCSG(开放传神)赋能科研机构:广东省智能院的AI一体化研发基座
  • AI计算平台前沿进展:下一代AI计算平台——“OpenEmbodied AI Platform (OEAP)设计框架(2)
  • TDengine IDMP 数据可视化 6. 资产列表
  • Java计算机毕设之springboot基于WIFI协议的课堂点名系统的设计与实现基于java+springboot+vue的课堂点名系统(完整前后端代码+说明文档+LW,调试定制等)
  • Java计算机毕设之基于SpringBoot的校园一卡通系统的设计与实现基于web的高校一卡通管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 通胀保值投资:实物资产在投资组合中的角色
  • P2740 [USACO4.2] 草地排水 Drainage Ditches
  • 异步编程中的共享变量与竞态条件
  • 2026广东最新紫晶洞厂家top5推荐!广州等地优质天然水晶源头供应商权威榜单,品类全货源稳,助力客商高效采购 - 品牌推荐2026
  • 2026广东最新巴西紫水晶洞生产厂家top5推荐!广州等地优质巴西紫水晶洞供应商权威榜单发布,货源品质双优助力批发采购 - 品牌推荐2026
  • 【毕业设计】springboot基于WIFI协议的课堂点名系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • P6577 【模板】二分图最大权完美匹配
  • 详细介绍:Maven 编译的settings配置和pom、idea配置关系
  • 【毕业设计】基于SpringBoot生活版青年学习平台(源码+文档+远程调试,全bao定制等)
  • 3D感知技术与实践(2020年)-04:深度图和点云数据底层处理算法
  • 【毕业设计】基于web的高校一卡通管理系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • 基于Python的Qt研发之Pyside6 QtSerialPort库的运用
  • 【计算机毕业设计案例】springboot基于WIFI协议的课堂点名系统的设计与实现(程序+文档+讲解+定制)
  • 提示工程架构师如何用提示设计打造极致用户体验?
  • 实用指南:Python测试开发工具库:日志脱敏工具(敏感信息自动屏蔽)
  • 2026原创:演唱会门票在线订票系统界面(可定制)
  • ODT
  • 大模型缓存命中
  • 永无乡
  • 2026广东最新紫晶洞厂家top5推荐!广州等地优天然水晶源头供应商权威榜单,品类全货源稳,助力客商高效采购 - 品牌推荐2026
  • 信息系统仿真:信息系统基础理论_(10).仿真结果的验证与校验
  • 假期作业
  • 1950-2024年中国与各大国之间的关系数据
  • P5521 梅深不见冬