题目链接

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

费用流第一题, 将每个格子拆为两个点, u向u'连一条容量为1, 费用为格子的值的边, u向u'再连一条容量为k-1, 费用为0的边。u'向他右边和下边的格子连一条容量为k, 费用为0的边, 跑一遍费用流就可以。

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <cmath>
  7. #include <map>
  8. #include <set>
  9. #include <string>
  10. #include <queue>
  11. using namespace std;
  12. #define pb(x) push_back(x)
  13. #define ll long long
  14. #define mk(x, y) make_pair(x, y)
  15. #define lson l, m, rt<<1
  16. #define mem(a) memset(a, 0, sizeof(a))
  17. #define rson m+1, r, rt<<1|1
  18. #define mem1(a) memset(a, -1, sizeof(a))
  19. #define mem2(a) memset(a, 0x3f, sizeof(a))
  20. #define rep(i, a, n) for(int i = a; i<n; i++)
  21. #define ull unsigned long long
  22. typedef pair<int, int> pll;
  23. const double PI = acos(-1.0);
  24. const double eps = 1e-;
  25. const int mod = 1e9+;
  26. const int inf = ;
  27. const int dir[][] = { {, }, {, }, {, -}, {, } };
  28. const int maxn = 2e5+;
  29. int num, head[maxn*], s, t, n, k, nn, dis[maxn], flow, cost, cnt, cap[maxn], q[maxn], cur[maxn], vis[maxn];
  30. struct node
  31. {
  32. int to, nextt, c, w;
  33. node(){}
  34. node(int to, int nextt, int c, int w):to(to), nextt(nextt), c(c), w(w) {}
  35. }e[maxn*];
  36. int spfa() {
  37. int st, ed;
  38. st = ed = ;
  39. mem2(dis);
  40. ++cnt;
  41. dis[s] = ;
  42. cap[s] = inf;
  43. cur[s] = -;
  44. q[ed++] = s;
  45. while(st<ed) {
  46. int u = q[st++];
  47. vis[u] = cnt-;
  48. for(int i = head[u]; ~i; i = e[i].nextt) {
  49. int v = e[i].to, c = e[i].c, w = e[i].w;
  50. if(c && dis[v]>dis[u]+w) {
  51. dis[v] = dis[u]+w;
  52. cap[v] = min(c, cap[u]);
  53. cur[v] = i;
  54. if(vis[v] != cnt) {
  55. vis[v] = cnt;
  56. q[ed++] = v;
  57. }
  58. }
  59. }
  60. }
  61. if(dis[t] == inf)
  62. return ;
  63. cost += dis[t]*cap[t];
  64. flow += cap[t];
  65. for(int i = cur[t]; ~i; i = cur[e[i^].to]) {
  66. e[i].c -= cap[t];
  67. e[i^].c += cap[t];
  68. }
  69. return ;
  70. }
  71. int mcmf() {
  72. flow = cost = ;
  73. while(spfa())
  74. ;
  75. return cost;
  76. }
  77. void add(int u, int v, int c, int val) {
  78. e[num] = node(v, head[u], c, -val); head[u] = num++;
  79. e[num] = node(u, head[v], , val); head[v] = num++;
  80. }
  81. void input() {
  82. int x;
  83. for(int i = ; i<n; i++) {
  84. for(int j = ; j<n; j++) {
  85. scanf("%d", &x);
  86. add(i*n+j, i*n+j+nn, , x);
  87. add(i*n+j, i*n+j+nn, k-, );
  88. }
  89. }
  90. add(s, , k, );
  91. add(*nn-, t, k, );
  92. for(int i = ; i<n; i++) {
  93. for(int j = ; j<n; j++) {
  94. for(int k1 = ; k1<; k1++) {
  95. int x = dir[k1][]+i;
  96. int y = dir[k1][]+j;
  97. if(x>=&&x<n&&y>=&&y<n) {
  98. add(i*n+j+nn, x*n+y, k, );
  99. }
  100. }
  101. }
  102. }
  103. }
  104. void init() {
  105. mem1(head);
  106. num = cnt = ;
  107. mem(vis);
  108. }
  109. int main()
  110. {
  111. while(~scanf("%d%d", &n, &k)) {
  112. init();
  113. nn = n*n;
  114. s = *nn, t = s+;
  115. input();
  116. int ans = mcmf();
  117. printf("%d\n", -ans);
  118. }
  119. return ;
  120. }

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

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

  3. POJ3422 Kaka's Matrix Travels[费用流]

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

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

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

  5. [poj] 3422 Kaka's Matrix Travels || 最小费用最大流

    原题 给一个N*N的方阵,从[1,1]到[n,n]走K次,走过每个方格加上上面的数,然后这个格上面的数变为0.求可取得的最大的值. 要求最大值,所以把边权全为负跑最小费用即可.因为只有第一次经过该点的 ...

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

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

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

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

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

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

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

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

随机推荐

  1. express中路由设置的坑-----1

    router.get('/commodities/sortable', utils.logged, function (req, res) { Commodity.find({force_top:tr ...

  2. python代码的书写要求

    刚刚接触python,python是对缩进要求很严格的语言,对于我这种平时tab,空格乱用的菜鸟来说简直是吃劲苦头阿,经常出现IndentationError.在这里我就结合自己的经历说说书写格式,如 ...

  3. 从零开始Unity3D游戏开发【2 简单的水管工例子】

    1.首先,创建一个新的Project. 2.hierarchy(层)窗体下的Create下添加一个plane(平面) 3.调整Main Camera的视角,让panel显示在Game窗体.这一步比较困 ...

  4. new、delete与malloc、free的详解

    内容清单: 1.  C语言中的函数malloc和free 2.  C++中的运算符new和delete 3.  new/delete与malloc/free之间的联系和区别 4.  C/C++程序的内 ...

  5. 动态加载 js

    要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write(& ...

  6. iOS iOS9下修改回HTTP模式进行网络请求

    升级为iOS9后,默认请求类型为https,如何使用http进行请求会报错 The resource could not be loaded because the App Transport Sec ...

  7. 关于group by的一段SQl语句——Oracle

    select cc.fformulacode, cc.rangedate, dd.fpervalue from (select n1.fformulacode, max(n1.frangedate) ...

  8. 获取文件数据流+叠加byte数组(给byte数组加包头包尾)

    OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "(*.mp4)|*.mp4|(*.*)|*.*"; ofd.Res ...

  9. vs vsvim viemu vax 备忘

    使用gt和gT往返标签 gd:到达光标所在处函数或者变量的定义处. *:读取光标处的字符串,并且移动光标到它再次出现的地方. #:和上面的类似,但是是往反方向寻找. /text:从当前光标处开始搜索字 ...

  10. 为什么Java项目前会出现一个红色感叹号!

    先看看问题,如下图所示: 造成这个问题的原因是,我把一个 jar 包删除了,然后又配了个新的进去,然后就一直有这个错误,刚开始很郁闷,怎么已经配置过儿,还出现这个问题?关键是代码里面没有报错的.郁闷的 ...