【LGP2045】方格取数加强版
还纠结了一下是费用流还是最小割
最终还是决定让最小割去死吧
我们的问题就是让一个点的点权只被计算一次
考虑拆点
将所有点拆成入点和出点,入点向出点连流量为\(1\)的边
每一个出点往下连能到达的点,向入点连费用为该点点权容量为\(0\)的边,向出点连费用为\(0\)容量为\(k-1\)的边
这样我们就能保证一个点的点权只被计算一次了
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn=5005;
const int inf=99999999;
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt,w,f;}e[maxn*100];
const int dx[]={0,1};
const int dy[]={1,0};
std::queue<int> q;
int n,num=1,S,T,m,a[51][51],out[51][51],in[51][51];
int head[maxn],vis[maxn],d[maxn];
inline void C(int x,int y,int w,int f) {
e[++num].v=y;e[num].nxt=head[x];head[x]=num;
e[num].w=w;e[num].f=f;
}
inline void add(int x,int y,int w,int f) {C(x,y,-1*w,f),C(y,x,w,0);}
inline int SPFA() {
for(re int i=S;i<=T;i++) vis[i]=0,d[i]=inf;
d[T]=0,q.push(T);
while(!q.empty()) {
int k=q.front();q.pop();vis[k]=0;
for(re int i=head[k];i;i=e[i].nxt)
if(e[i^1].f&&d[e[i].v]>d[k]+e[i^1].w) {
d[e[i].v]=d[k]+e[i^1].w;
if(!vis[e[i].v]) q.push(e[i].v),vis[e[i].v]=0;
}
}
return d[S]<inf;
}
int dfs(int x,int now) {
if(x==T||!now) return now;
int flow=0,ff;vis[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(e[i].f&&!vis[e[i].v]&&d[e[i].v]==d[x]+e[i^1].w) {
ff=dfs(e[i].v,min(now,e[i].f));
if(ff<=0) continue;
flow+=ff,now-=ff,e[i].f-=ff,e[i^1].f+=ff;
if(!now) break;
}
return flow;
}
int main() {
n=read(),m=read();
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++) a[i][j]=read();
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++) in[i][j]=++T,out[i][j]=++T;
++T;
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++) add(in[i][j],out[i][j],0,1);
for(re int i=1;i<=n;i++)
for(re int j=1;j<=n;j++)
for(re int k=0;k<2;k++) {
int x=i+dx[k],y=j+dy[k];
if(x<1||y<1||x>n||y>n) continue;
add(out[i][j],in[x][y],a[x][y],1);
add(out[i][j],out[x][y],0,inf);
}
int ans=0;
add(S,in[1][1],a[1][1],1);add(S,out[1][1],0,m-1);
add(out[n][n],T,0,m);
while(SPFA()) {
vis[T]=1;
while(vis[T]) {
for(re int i=S;i<=T;i++) vis[i]=0;
ans-=dfs(S,inf)*d[S];
}
}
printf("%d\n",ans);
return 0;
}
【LGP2045】方格取数加强版的更多相关文章
- P2045 方格取数加强版
P2045 方格取数加强版 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格 ...
- [luogu_P2045]方格取数加强版
[luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...
- Luogu2045 方格取数加强版
题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变 ...
- Luogu2045 方格取数加强版(K取方格数) 费用流
题目传送门 题意:给出一个$N \times N$的方格,每个格子中有一个数字.你可以取$K$次数,每次取数从左上角的方格开始,每一次只能向右或向下走一格,走到右下角结束,沿路的方格中的数字将会被取出 ...
- 洛谷 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),每 ...
- poj 3422 洛谷P2045 K取方格数(方格取数加强版)
Description: 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来 ...
- [洛谷P2045]方格取数加强版
题目大意:有一个n*n的矩阵,每个格子有一个非负整数,规定一个人从(1,1)开始,只能往右或下走,走到(n,n)为止,并把沿途的数取走,取走后数变为0.这个人共取n次,求取得的数的最大总和. 解题思路 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
随机推荐
- 基于ASP.NET Core 创建 Web API
使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...
- JavaScript中自定义函数以及文本框、radio、下拉框的值的获取,结合淘宝竞拍案例来理解。。。
淘宝竞拍案例: HTML部分代码: <form action="#" method="post"> <h2>欢迎进入淘宝竞拍</h ...
- Java:类加载器(ClassLoader)
听上去很高端,其实一般自定义类加载器不需要用户去实现解析的过程,只要负责实现获取类对应的.class字节流部分就ok了,摘录深入理解Java虚拟机的一段话 虚拟机设计团队把类加载阶段中的“通过一个类的 ...
- 理解position:relative
前言:position有5个属性:static.absolute.relative.fixed和inherit.本篇博客主要介绍relative属性,因为似乎很多人对这个属性的理解很模糊,而且不清楚r ...
- window.event.srcElement与window.event.target 触发事件的元素 触发事件对象的获取,window.event与时间函数参数的event是同一个 事件对象
判断事件触发的元素: var tag = window.event.target || window.event.srcElement; if (tag.tagName.toLowerC ...
- Nodejs + express post get 参数获取小结
req.params.xxxxx 从path中的变量 req.query.xxxxx 从get中的?xxxx=中 req.body.xxxxx 从post中的变量 Post下别忘了: app.use( ...
- 【js编程艺术】 之有用的函数
学习js的过程中有几个有用的函数. //添加事件函数 function addLoadEvent(func) { var oldonload = window.onload; if(typeof wi ...
- jQuery 所有版本在线引用
jquery-3.1.1(最新) 官网jquery压缩版引用地址: <script src="https://code.jquery.com/jquery-3.1.1.min.js&q ...
- 修改maven默认的jdk版本
修改maven默认的jdk版本,想改彻底需要在maven的全局配文件(settings.xml)增加以下信息: 在profiles 节点下增加: <profile> <id> ...
- centos django+Nginx+uwsgi部署
第五天 部署python3+uwsgi+nginx的博客系统 ================================ mysql基本命令 mysql mysql -p mysqladmin ...