问题描述

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}\)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. template <typename Tp>
  4. void read(Tp &x){
  5. x=0;char ch=1;int fh;
  6. while(ch!='-'&&(ch>'9'||ch<'0')) ch=getchar();
  7. if(ch=='-') ch=getchar(),fh=-1;
  8. else fh=1;
  9. while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
  10. x*=fh;
  11. }
  12. const int maxn=53;
  13. const int maxm=1000000;
  14. const int INF=0x3f3f3f3f;
  15. int a[maxn][maxn],n,k;
  16. int Head[maxn*maxn*2],S,T;
  17. int Next[maxm],to[maxm],tot=1,w[maxm],cost[maxm];
  18. void add(int x,int y,int z,int c){
  19. to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z,cost[tot]=c;
  20. }
  21. int calc(int x,int y,int t){
  22. return (x-1)*n+y+(t-1)*n*n;
  23. }
  24. bool vis[maxm];
  25. int dis[maxm],pre[maxm],now[maxm];
  26. bool spfa(){
  27. memset(vis,0,sizeof(vis));memset(dis,0xcf,sizeof(dis));
  28. memset(pre,0,sizeof(pre));
  29. queue<int>q;q.push(S);vis[S]=1,dis[S]=0;
  30. now[S]=INF;
  31. while(!q.empty()){
  32. int x=q.front();q.pop();
  33. vis[x]=0;
  34. for(int i=Head[x];i;i=Next[i]){
  35. int y=to[i],len=w[i],ct=cost[i];
  36. if(!len||dis[y]>=dis[x]+ct) continue;
  37. dis[y]=dis[x]+ct;now[y]=min(now[x],len);
  38. pre[y]=i;
  39. if(!vis[y]) q.push(y),vis[y]=1;
  40. }
  41. }
  42. return dis[T]!=0xcfcfcfcf;
  43. }
  44. int mx,ans;
  45. void upd(){
  46. mx+=now[T],ans+=dis[T]*now[T];
  47. int p=T;
  48. while(p!=S){
  49. int k=pre[p];
  50. w[k]-=now[T],w[k xor 1]+=now[T];
  51. p=to[k xor 1];
  52. }
  53. }
  54. int main(){
  55. read(n);read(k);
  56. for(int i=1;i<=n;i++){
  57. for(int j=1;j<=n;j++){
  58. read(a[i][j]);
  59. }
  60. }
  61. S=n*n*2+1,T=S+1;
  62. add(S,calc(1,1,1),k,0);add(calc(1,1,1),S,0,0);
  63. add(calc(n,n,2),T,k,0);add(T,calc(n,n,2),0,0);
  64. for(int i=1;i<=n;i++){
  65. for(int j=1;j<=n;j++){
  66. 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]);
  67. add(calc(i,j,1),calc(i,j,2),INF,0);add(calc(i,j,2),calc(i,j,1),0,0);
  68. 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);
  69. 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);
  70. }
  71. }
  72. while(spfa())
  73. upd();
  74. printf("%d\n",ans);
  75. return 0;
  76. }

LG2045 方格取数加强版 费用流的更多相关文章

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

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

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

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

  3. Codevs 1227 方格取数 2(费用流)

    1227 方格取数 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 查看运行结果 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数 ...

  4. P2045 方格取数加强版

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

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

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

  6. Luogu2045 方格取数加强版(K取方格数) 费用流

    题目传送门 题意:给出一个$N \times N$的方格,每个格子中有一个数字.你可以取$K$次数,每次取数从左上角的方格开始,每一次只能向右或向下走一格,走到右下角结束,沿路的方格中的数字将会被取出 ...

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

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

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

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

  9. Luogu2045 方格取数加强版

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

随机推荐

  1. 弄明白kubernetes中的“三种IP”

    Node IP : Node节点的IP地址 Pod IP:Pod的IP地址 Cluster IP : Service 的IP地址 首先,Node IP是Kubernetes集群中每个节点(服务器)物理 ...

  2. 第04组 Alpha冲刺(6/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 协调了一下组内的工作 复习了一下SuffixAutomata 接下来的计划 实现更多的功能 ...

  3. Gin实现依赖注入

    前言 依赖注入的好处和特点这里不讲述了,本篇文章主要介绍gin框架如何实现依赖注入,将项目解耦. 项目结构 ├── cmd 程序入口 ├── common 通用模块代码 ├── config 配置文件 ...

  4. Harbor + Https 部署

    关闭防火墙和selinux systemctl stop firewalld sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selin ...

  5. IEEE 二进制浮点数的表示

    朋友在谈一个物流相关的项目,是以前项目的一个延续,涉及到后台的扩展,手机端的App,外加两个App的对接的蓝牙打印机.这个项目前后说了一个多月了吧,最近才草拟了协议.项目本来不复杂,但是客户却如此的拖 ...

  6. jquery 属性名修改

    jquery   attr <script> // 获取class 名 $(".box").attr("class") // 修改或添加class名 ...

  7. C++:Copy & Reference Count

    浅拷贝.深拷贝 通常,我们会按如下方式书写拷贝构造函数: class LiF { public: LiF(int _lif = 0) : lif(_lif) {} // 默认构造函数 LiF(cons ...

  8. python threading ThreadPoolExecutor源码解析

    future: 未来对象,或task的返回容器 1. 当submit后: def submit(self, fn, *args, **kwargs): with self._shutdown_lock ...

  9. windows上mysql解压缩版本、centos上rpm方式的安装、初始化等

    一.windows版本: https://dev.mysql.com/doc/refman/5.7/en/windows-install-archive.html 启动或者暂停mysql服务: htt ...

  10. C# 多线程处理List数据

    代码思路 将要处理的数据放到ConcurrentQueue中,然后开启多个线程去处理数据,处理完成后,再到队列中获取下一个待处理数据. ConcurrentQueue 表示线程安全的先进先出 (FIF ...