LG2045 方格取数加强版 费用流
问题描述
题解
费用流。
套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0\)(表示联通)。
然后在\((i,j)\)的出点向\((i+1,j)\),\((i,j+1)\)连边,流量\(INF\),费用\(0\),表示联通。
建立\(S,T\),分别于\((1,1),(n,n)\)相连,流量为\(k\),费用为\(0\),代表可以走\(k\)次。
跑费用最大流即可。
传纸条本质是本题的特殊情况,即\(k=2\)的情况
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
if(ch=='-') ch=getchar(),fh=-1;
else fh=1;
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
x*=fh;
}
const int maxn=53;
const int maxm=1000000;
const int INF=0x3f3f3f3f;
int a[maxn][maxn],n,k;
int Head[maxn*maxn*2],S,T;
int Next[maxm],to[maxm],tot=1,w[maxm],cost[maxm];
void add(int x,int y,int z,int c){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z,cost[tot]=c;
}
int calc(int x,int y,int t){
return (x-1)*n+y+(t-1)*n*n;
}
bool vis[maxm];
int dis[maxm],pre[maxm],now[maxm];
bool spfa(){
memset(vis,0,sizeof(vis));memset(dis,0xcf,sizeof(dis));
memset(pre,0,sizeof(pre));
queue<int>q;q.push(S);vis[S]=1,dis[S]=0;
now[S]=INF;
while(!q.empty()){
int x=q.front();q.pop();
vis[x]=0;
for(int i=Head[x];i;i=Next[i]){
int y=to[i],len=w[i],ct=cost[i];
if(!len||dis[y]>=dis[x]+ct) continue;
dis[y]=dis[x]+ct;now[y]=min(now[x],len);
pre[y]=i;
if(!vis[y]) q.push(y),vis[y]=1;
}
}
return dis[T]!=0xcfcfcfcf;
}
int mx,ans;
void upd(){
mx+=now[T],ans+=dis[T]*now[T];
int p=T;
while(p!=S){
int k=pre[p];
w[k]-=now[T],w[k xor 1]+=now[T];
p=to[k xor 1];
}
}
int main(){
read(n);read(k);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
read(a[i][j]);
}
}
S=n*n*2+1,T=S+1;
add(S,calc(1,1,1),k,0);add(calc(1,1,1),S,0,0);
add(calc(n,n,2),T,k,0);add(T,calc(n,n,2),0,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
add(calc(i,j,1),calc(i,j,2),1,a[i][j]);add(calc(i,j,2),calc(i,j,1),0,-a[i][j]);
add(calc(i,j,1),calc(i,j,2),INF,0);add(calc(i,j,2),calc(i,j,1),0,0);
if(i!=n) add(calc(i,j,2),calc(i+1,j,1),INF,0),add(calc(i+1,j,1),calc(i,j,2),0,0);
if(j!=n) add(calc(i,j,2),calc(i,j+1,1),INF,0),add(calc(i,j+1,1),calc(i,j,2),0,0);
}
}
while(spfa())
upd();
printf("%d\n",ans);
return 0;
}
LG2045 方格取数加强版 费用流的更多相关文章
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- Codevs 1227 方格取数 2(费用流)
1227 方格取数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 查看运行结果 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数 ...
- 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 方格取数加强版(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),每 ...
- Luogu2045 方格取数加强版
题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变 ...
随机推荐
- 零基础入门 实战mpvue2.0多端小程序框架
第1章 课程快速预览(必看!!!)在这一章节中,老师讲带领你快速预览课程整体.其中,涉及到为什么要做这么一门实战课程.制作一个小程序的完整流程是怎么样的,以及如何做项目的技术选型. 第2章 30 分钟 ...
- rss订阅
其实,本质上和爬虫没区别,只不过这是人家主动给你数据,而且是编排好格式后的数据 按个人主页url更新内容 去重,按照redis去重的方式 按时间保存内容 mysql 保存为时间格式(可以根据时间比较大 ...
- [2019BUAA软工助教]下半学期改进计划
[2019BUAA软工助教]下半学期改进计划 结合[2019BUAA软工助教]答黄衫同学,经过26日晚陈彦吉.刘畅.赵奕.李庆想四位助教的讨论,最终整理了以下这份计划 一.技术博客 各个团队在开发的过 ...
- macbook pro更换键盘的排线
以下是拆机图解 很简单的 有点动手能力的都可以更换 另外附加淘宝上的链接 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.68a12e8dYAiQIx ...
- LeetCode 151:给定一个字符串,逐个翻转字符串中的每个单词 Reverse Words in a String
公众号:爱写bug(ID:icodebugs) 翻转字符串里的单词 Given an input string, reverse the string word by word. 示例 1: 输入: ...
- javascript播放图片序列帧
javascript播放图片序列帧1 先预加载<pre>var load_img = [];for(k=0;k<=16;k++){load_img.push( '/cjsxy/ima ...
- svg path 解析
<pre><svg width="100%" height="100%" version="1.1" xmlns=&quo ...
- 【UOJ#48】【UR #3】核聚变反应强度(质因数分解)
[UOJ#48][UR #3]核聚变反应强度(质因数分解) 题面 UOJ 题解 答案一定是\(gcd\)除掉\(gcd\)的最小质因子. 而\(gcd\)的最小值因子一定是\(a_1\)的质因子. 所 ...
- 【目标检测】关于如何在 PyTorch1.x + Cuda10 + Ubuntu18.0 运行 CenterNet 源码
这几天一直在尝试运行CenterNet的源码,但是出现各种问题,本已经打算放弃,中午吃完饭又不甘心,打算重新安装环境再来一遍,没想到竟然成功了.所以,坚持下去,黑夜过后便是黎明. 注意:gcc/g++ ...
- 一篇文章,带你玩转MVVM,Dapper,AutoMapper
一.背景 由于现在做的项目都是采用WPF来进行UI设计,开发过程中都是基于MVVM来进行开发,但是项目中的MVVM并不是真正的把实体和视图进行解耦,而是将实体和视图完全融合起来,ViewModel只是 ...