P2045 方格取数加强版题解
题目链接:P2045 方格取数加强版 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目:
出一个 n*n 的矩阵,每一格有一个非负整数 A{i,j}且A{i,j} <=10^3 现在从 (1,1) 出发,可以往右或者往下走,最后到达 (n,n),每达到一格,把该格子的数取出来,该格子的数就变成 0,这样一共走 K 次,现在要求 K 次所达到的方格的数的和最大。
解析:
一次方格取数原题是一个四位dp,但走k次的限制很难用dp在图上转移。
因为我们看到题目对每条边有限制,考虑用网络流,拆点建图来满足条件。
拆点可以得到两条边,(i,j)的入点向(i,j)的出点连一条费用为-1*(i,j)的值,流量限制为1(乘-1的原因是我们只能算最小费用最大流,这道题最大费用最大流,所以将费用取为负数,就可以做了),以及一条(i,j)的入点向(i,j)的出点连一条费用为0,流量限制为k-1的边。
同时由题意可知,(i,j)的出点向(i,j+1)和(i+1,j)连一条边,边的费用为0,流量限制为k。
再由网络流的性质,建超级源点向起点的入点连边和终点的出点向汇点连边。这些边的费用为0,流量限制为k,仅仅意味联通。
最后跑最小费用最大流即可
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
const int M=300010;
const int INF=2139062143;
int n,k,dis[N],pre[N],vis[N],flow[N],go[M],nxt[M],hd[N],jz[M],fl[M],tot=1;
int id(int x,int y)
{
return (x-1)*n+y;
}
bool spfa(int s,int t)
{
memset(dis,0x7f,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s);
dis[s]=0;
vis[s]=1;
flow[s]=INF;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=0;
for(int i=hd[u];i;i=nxt[i])
{
int v=go[i];
if(fl[i]==0)continue;
if(fl[i]>0&&dis[v]>dis[u]+jz[i])
{
dis[v]=dis[u]+jz[i];
flow[v]=min(flow[u],fl[i]);
pre[v]=i;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
if(dis[t]==INF)return 0;
return 1;
}
long long ans=0,maxflow;
void zdfy(int s,int t)
{
while(spfa(s,t))//图s,t是否联通
{
maxflow+=flow[t];
ans+=dis[t]*flow[t];//一趟的价值为流量乘从s开始走的边的价值
int x=t;
while(x!=s)
{
int las=pre[x];
fl[las]-=flow[t];//注意流量只消耗了flow[t]
fl[las^1]+=flow[t];
x=go[las^1];
}
}
}
void add(int x,int y,int j,int f)
{
nxt[++tot]=hd[x];go[tot]=y,jz[tot]=j,fl[tot]=f,hd[x]=tot;
nxt[++tot]=hd[y];go[tot]=x,jz[tot]=-j,fl[tot]=0,hd[y]=tot;
return ;
}//dinic算法要反向边
int main()
{
scanf("%d%d",&n,&k);
int s=0,t=2*n*n+1;
add(s,id(1,1),0,k);
add(id(n,n)+n*n,t,0,k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int x;scanf("%d",&x);
add(id(i,j),id(i,j)+n*n,-x,1);
add(id(i,j),id(i,j)+n*n,0,INF);
if(i<n)add(id(i,j)+n*n,id(i+1,j),0,INF);
if(j<n)add(id(i,j)+n*n,id(i,j+1),0,INF);
}
//建图
zdfy(s,t);
printf("%lld\n",-1*ans);//答案取反
return 0;
}
P2045 方格取数加强版题解的更多相关文章
- P2045 方格取数加强版
P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...
- 洛谷 P2045 方格取数加强版【费用流】
题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...
- P2045 方格取数加强版 最大费用最大流
$ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...
- [洛谷P2045]方格取数加强版
题目大意:有一个n*n的矩阵,每个格子有一个非负整数,规定一个人从(1,1)开始,只能往右或下走,走到(n,n)为止,并把沿途的数取走,取走后数变为0.这个人共取n次,求取得的数的最大总和. 解题思路 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- bzoj P2045 方格取数加强版【最大费用最大流】
今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- 【Luogu】P2045方格取数加强版(最小费用最大流)
题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...
- 洛谷P2045 方格取数加强版 最小费用流
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...
- [luogu_P2045]方格取数加强版
[luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...
随机推荐
- 建立成功平台工程的关键:自助式 IaC
从技术上讲,云一直都是自助式服务,但由于其在实践中的复杂性,许多开发人员并不喜欢.随着公司采用现代架构(云原生.无服务器等)和新的提供商(多云.SaaS 应用程序),以及云提供商发布更多服务,云变得更 ...
- Deepin安装Python3
https://www.jianshu.com/p/0c61bdfb9589 也可以看这篇,本文是这篇的简捷版,均原创 首先,把系统更到最新,并复制下面的代码 sudo apt update 更新软件 ...
- git安装和git命令:全局设置用户名邮箱配置
在网上下载并安装git:https://git-scm.com/downloads在开始菜单里面找到 "Git --> Git Bash",如下 运行Git Bash: 如果 ...
- 远程协助软件哪个好,IT远程支持用什么软件
软件行业做售后支持,有时候需要远程控制客户电脑以实现远程协助,远程解决客户问题. IT远程支持用什么软件比较好?这个我们可以逐个分析下. 一.QQ远程 一看就不专业,的确也不专业.QQ远程协助可以实现 ...
- C 语言编程 — 逻辑控制语句
目录 文章目录 目录 前文列表 结构化程序设计 条件分支语句 if/else 语句 if 语句 if/else 语句 if/else-if/else 语句 嵌套 if 语句 switch 语句 swi ...
- 【HarmonyOS NEXT】获取卸载APP后不变的设备ID
1. 背景 在HarmonyOS NEXT中,想要获取设备ID,有3种方式 UDID:deviceinfo.udid,仅限系统应用使用 AAID: aaid.getAAID(),然而卸载APP/恢复设 ...
- python基础环境
刚开始接触并学习一门开发语言,带着不求甚解的想法,其实也挺有好处的:我并不是所有的东西都知道,但是代码跑起来了. 但是时间久了,还是带着这种想法,可能就会遇到一些棘手的问题.比如电脑上不知不觉已经安装 ...
- 热更学习笔记10~11----lua调用C#中的List和Dictionary、拓展类中的方法
[10]Lua脚本调用C#中的List和Dictionary 调用还是在上文中使用的C#脚本中Student类: lua脚本: print("------------访问使用C#脚本中的Li ...
- vue-element-admin 运行踩坑笔记
npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x. npm E ...
- kubernetes自动扩缩容[HPA控制器 horizontal pod autoscaler]
kubernetes自动扩缩容[HPA控制器 horizontal pod autoscaler] #查看当前hpa控制器版本: [root@k8s-master01 ~]# kubectl get ...