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 ...
随机推荐
- C#/C++ 通过ODBC连接OceanBase Oracle租户
概述 近期我们项目正处于将Oracle数据库迁移到OceanBase Oracle租户模式的阶段.考虑到我们项目采用了C++和C#混合开发,并且使用了多种技术,因此存在多种数据库连接方式.然而,针对C ...
- ubuntu16下升级python3的版本--升级到3.8
ubuntu16下升级python3的版本,这里是升级到3.8. 1.首先添加安装源,在命令行输入如下命令: $ sudo add-apt-repository ppa:jonathonf/pytho ...
- 【项目学习】Timeswap:第一个完全去中心化的基于 AMM 的货币市场协议
总览 Timeswap 是世界上第一个完全去中心化的基于 AMM 的货币市场协议,无需预言机或清算人即可工作. Timeswap 采用 3 变量来维持 AMM 的运作.它通过允许用户决定他们的风险状况 ...
- 处理flex布局
点击查看代码 <view class="recommend-view"> <view class="title-view"> 热门推荐 ...
- C# 实现Ping远程主机功能
C#实现Ping远程主机功能. 1.引用nuget包 Wesky.Net.OpenTools OpenTools是一个用于提高开发效率的开源工具库.该项目为个人开源项目,采用MIT开源协议,永不更改协 ...
- 智能工作流:Spring AI高效批量化提示访问方案
基于SpringAI搭建系统,依靠线程池\负载均衡等技术进行请求优化,用于解决科研&开发过程中对GPT接口进行批量化接口请求中出现的问题. github地址:https://github.co ...
- C 语言编程 — 数据类型转换
目录 文章目录 目录 前文列表 数据类型转换 隐式(自动)类型转换 常用的算术转换 显式(强制)类型转换 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法& ...
- 10分钟搞定Mysql主从部署配置
流程 Master数据库安装 Slave数据库安装 配置Master数据库 配置Slave数据库 网络信息 Master数据库IP:192.168.198.133 Slave数据库IP:192.168 ...
- centos7源码编译安装nginx1.19并调优,向已安装的nginx添加新模块
目录 一.关于nginx 二.nginx的安装方式 三.源码编译安装nginx 3.1 下载nginx源码并解压 3.2 创建nginx用户和组 3.3 安装nginx编译环境(解决依赖问题) 3.4 ...
- Go post重定向的两种方式
1.Location 2.http.Redirect 代码 /index -> /login -> /home package main import ( "fmt" ...