题目链接: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 方格取数加强版题解的更多相关文章

  1. P2045 方格取数加强版

    P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...

  2. 洛谷 P2045 方格取数加强版【费用流】

        题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...

  3. P2045 方格取数加强版 最大费用最大流

    $ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...

  4. [洛谷P2045]方格取数加强版

    题目大意:有一个n*n的矩阵,每个格子有一个非负整数,规定一个人从(1,1)开始,只能往右或下走,走到(n,n)为止,并把沿途的数取走,取走后数变为0.这个人共取n次,求取得的数的最大总和. 解题思路 ...

  5. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  6. bzoj P2045 方格取数加强版【最大费用最大流】

    今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...

  7. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  8. 【Luogu】P2045方格取数加强版(最小费用最大流)

    题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...

  9. 洛谷P2045 方格取数加强版 最小费用流

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...

  10. [luogu_P2045]方格取数加强版

    [luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...

随机推荐

  1. Selenium使用总结:加载Flash、禁用JS、滚动页面至元素、缩放页面

    前言 前几周做了个使用Selenium的项目,踩了好多好多好多的Selenium的坑,越来越感觉他作为一个第三方库,对于Chrome的操作实在是有局限.另外,推荐大家一个Selenium之外的操作浏览 ...

  2. ABAP 7.55 新特性 (二) ABAP SQL部分

    上一篇文章ABAP 7.55 新特性 (一)介绍了ABAP 7.55中除ABAP SQL外的更新内容,本篇是剩余的ABAP SQL更新部分. 本文链接:https://www.cnblogs.com/ ...

  3. Plumed分子模拟后分析

    技术背景 在前面的几篇博客中,我们分别介绍过Histogram算法的使用.Plumed安装与简单使用.Plumed一般就是两种用法:要么在运行分子动力学模拟的过程中实时的对接,要么就是把分子模拟的相关 ...

  4. elasticsearch02-Request Body深入搜索

    目录 02. Request Body深入搜索 1.1 term查询 1.1.1 term 与 terms 1.1.2 range 范围查询 1.1.3 Constant Score 1.2 全文查询 ...

  5. 基于AIRIOT平台构建低成本、更聪明的智能环卫系统,让管理更加高效智能

    环卫工程作为城市基础设施保障,是城市建设管理中不可或缺的重要组成部分.随着城市进程的加快及技术的进步,环卫工程管理也在逐渐向精细化.智能化.绿色化等趋势发展. 智能环卫依托物联网.AI.大数据等技术, ...

  6. go新手常踩的坑

    作为一个5年的phper,这两年公司和个人都在顺应技术趋势,新项目慢慢从php转向了go语言,从2021年到现在,笔者手上也先后开发了两个go项目.在学习go语言的过程中也学习并总结了一些相关的东西, ...

  7. containerd 源码分析:启动注册流程

    0. 前言 containerd 是一个行业标准的容器运行时,其强调简单性.健壮性和可移植性.本文将从 containerd 的代码结构入手,查看 containerd 的启动注册流程. 1. 启动注 ...

  8. MySQL查询某个字段含有字母数字的值

    1.正则表达式(REGEXP) 查询MySQL表中某个字段含有字母和数字的值,可以使用正则表达式(REGEXP)来匹配这样的模式.在MySQL中,正则表达式是一个强大的工具,可以用来搜索和匹配字符串中 ...

  9. nginx接受请求连接事件模块流程

    操作系统内核: 三次握手,当用户发来一个 SYN 报文时,系统内核会返回一个SYN+ACK确认给客户端,当客户端再次发送ACK来的时候,此时就已经建立了三次握手. 完成三次握手后,操作系统会根据系统内 ...

  10. Qt_Demo_1:实现一个简易的记事本

    1  环境: 系统:windows 10 代码编写运行环境:Qt Creator 4.4.1 (community) GitHub:https://github.com/zhengcixi/Qt_De ...