原题

给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0。求可取得的最大的值。

要求最大值,所以把边权全为负跑最小费用即可。因为只有第一次经过该点的时候会得到价值,所以我们将一个点拆为两个,连一条容量为1费用为负权的边和一条容量为k-1费用为0的边。然后和右和下的点连边为容量为k,费用为0的边。跑费用流即可。

  1. #include<cstdio>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<cstring>
  5. #define N 5010
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. int n,m,head[N],dis[N],cur[N],ans,cnt=2,s,t,ANS,T,a[55][55],k;
  9. queue <int> q;
  10. bool vis[N];
  11. struct hhh
  12. {
  13. int to,next,w,cost;
  14. }edge[N*N];
  15. int read()
  16. {
  17. int ans=0,fu=1;
  18. char j=getchar();
  19. for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
  20. if (j=='-') fu=-1,j=getchar();
  21. for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
  22. return ans*fu;
  23. }
  24. void add(int u,int v,int w,int c)
  25. {
  26. edge[cnt].to=v;
  27. edge[cnt].w=w;
  28. edge[cnt].next=head[u];
  29. edge[cnt].cost=c;
  30. head[u]=cnt++;
  31. }
  32. void addEdge(int u,int v,int w,int c)
  33. {
  34. add(u,v,w,c);
  35. add(v,u,0,-c);
  36. }
  37. bool bfs()
  38. {
  39. for (int i=s;i<=t;i++)
  40. vis[i]=0,cur[i]=head[i],dis[i]=inf;
  41. q.push(s);
  42. dis[s]=0;
  43. vis[s]=1;
  44. while(!q.empty())
  45. {
  46. int r=q.front();
  47. q.pop();
  48. vis[r]=0;
  49. for (int i=head[r],v;i;i=edge[i].next)
  50. {
  51. v=edge[i].to;
  52. if (edge[i].w>0 && dis[r]+edge[i].cost<dis[v])
  53. {
  54. dis[v]=dis[r]+edge[i].cost;
  55. if (!vis[v])
  56. {
  57. vis[v]=1;
  58. q.push(v);
  59. }
  60. }
  61. }
  62. }
  63. return dis[t]!=inf;
  64. }
  65. int dfs(int x,int f)
  66. {
  67. if (x==t) return ANS+=f*dis[t],f;
  68. int ha=0,now;
  69. vis[x]=1;
  70. for (int &i=cur[x],v;i;i=edge[i].next)
  71. {
  72. v=edge[i].to;
  73. if (vis[v]) continue;
  74. if (edge[i].w>0 && dis[v]==dis[x]+edge[i].cost)
  75. {
  76. now=dfs(v,min(f-ha,edge[i].w));
  77. if (now)
  78. {
  79. ha+=now;
  80. edge[i].w-=now;
  81. edge[i^1].w+=now;
  82. }
  83. }
  84. if (ha==f) return ha;
  85. }
  86. return ha;
  87. }
  88. int main()
  89. {
  90. n=read();
  91. k=read();
  92. for (int i=1;i<=n;i++)
  93. for (int j=1;j<=n;j++)
  94. a[i][j]=read();
  95. s=0;
  96. t=2*n*n+1;
  97. addEdge(s,1,k,0);
  98. for (int i=1;i<=n;i++)
  99. for (int j=1,p;j<=n;j++)
  100. {
  101. p=n*(i-1)+j;
  102. addEdge(p,p+n*n,1,-a[i][j]);
  103. addEdge(p,p+n*n,k-1,0);
  104. if (i<n) addEdge(p+n*n,p+n,k,0);
  105. if (j<n) addEdge(p+n*n,p+1,k,0);
  106. }
  107. addEdge(2*n*n,t,k,0);
  108. while (bfs()) ans+=dfs(s,inf);
  109. printf("%d",-ANS);
  110. return 0;
  111. }

[poj] 3422 Kaka's Matrix Travels || 最小费用最大流的更多相关文章

  1. POJ 3422 Kaka's Matrix Travels(费用流)

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6792   Accepted:  ...

  2. POJ 3422 Kaka's Matrix Travels 【最小费用最大流】

    题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题 ...

  3. POJ 3422 Kaka's Matrix Travels

    Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9567   Accepted:  ...

  4. poj3422 Kaka's Matrix Travels(最小费用最大流问题)

    /* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a‘ 之间建立怎样的两条边,导致程序 ...

  5. POJ 3422 Kaka's Matrix Travels(最小费用最大流)

    http://poj.org/problem?id=3422 题意 : 给你一个N*N的方格,每个格子有一个数字,让你从左上角开始走,只能往下往右走,走过的数字变为0,走K次,问最大能是多大,累加的. ...

  6. POJ 3422 Kaka's Matrix Travels (K取方格数:最大费用流)

    题意 给出一个n*n大小的矩阵,要求从左上角走到右下角,每次只能向下走或者向右走并取数,某位置取过数之后就只为数值0,现在求解从左上角到右下角走K次的最大值. 思路 经典的费用流模型:K取方格数. 构 ...

  7. poj 3422 Kaka's Matrix Travels 费用流

    题目链接 给一个n*n的矩阵, 从左上角出发, 走到右下角, 然后在返回左上角,这样算两次. 一共重复k次, 每个格子有值, 问能够取得的最大值是多少, 一个格子的值只能取一次, 取完后变为0. 费用 ...

  8. POJ 3422 Kaka's Matrix Travels(拆点+最大费用流)题解

    题意:小A从左上角走到右下角,每个格子都有一个价值,经过这个格子就把价值拿走,每次只能往下或往右走,问你走k次最多能拿多少价值的东西. 思路:这里有一个限制条件就是经过之后要把东西拿走,也就是每一格的 ...

  9. POJ 3422 Kaka's Matrix Travels K取方格数

    题目:给出n*n的方格矩阵,现在从左上方走m次到右下方,问m次能够获得的最大价值和. 分析:最大费用流.拆点进行限制每个格子只取一次,假设点x拆成 x,xx,右边(假设有)y,yy,下方(假设有)z, ...

随机推荐

  1. Q&A - Nginx与Tomcat的区别?

    web上的server都叫web server,但是大家分工也有不同的. nginx常用做静态内容服务和代理服务器(不是你FQ那个代理),直面外来请求转发给后面的应用服务(tomcat,django什 ...

  2. 返回用户指定页面的web服务器

    import socket import re import os def handle_client(socket_con): """ 接收来自客户端的请求,并接收请求 ...

  3. nuxt generate静态化后回退问题

    之前线上的项目是nuxt build后的项目发布在服务器上,pm2来管理node的进程,nuxt还是运行在node的环境里. 这个方案用了半年左右,访问速度什么的确实很快,pm2管理下的node在wi ...

  4. ASPX页面请求响应过程

  5. keil5的安装及问题

    win8+keil 注意,在进行破解的时候首先要打开一个工程,而且keil要用管理员的身份进行运行, 才可以破解完成 发现打开之后,出现这样的错误. 原因是因为在创建工程的时候在下图中点了是,要点否才 ...

  6. 快速排序算法Java实现

    1) 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行 示例: package ...

  7. C语言结构体篇 结构体

    在描述一个物体的属性的时候,单一的变量类型是无法完全描述完全的.所以有了灵活的结构体变量. 结构体变量从意义上来讲是不同数据类型的组合,从内存上来讲是在一个空间内进行不同的大小划分. 1.1 结构体类 ...

  8. 裸机——wdt

    1. 首先晓得看门狗的基本知识 看门狗是带复位功能的定时器,用于在系统跑飞时复位系统. 接下来按照上次的知识对看门狗进行推导 看门狗的关键词是 定时器 复位 定时器 关键是 时间段 中断 时间段 关键 ...

  9. PHP.21-商品信息管理

    商品信息管理 在线增删改查和图片信息管理 主要技术:文件上传.图片缩放.数据库基本操作 思路: 1.设计并创建数据库 库名:demodb 表名:goods 编号(id) 名称(name) 商品类型(t ...

  10. 4,远程连接Linux

    为什么要远程连接Linux 在实际的工作场景中,虚拟机界面或者物理服务器本地的终端都是很少接触的,因为服务器装完系统之后,都要拉倒IDC机房托管,如果是购买的云主机,那更碰不到服务器本体了,只能通过远 ...