http://poj.org/problem?id=3422

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

思路 :http://blog.csdn.net/qq172108805/article/details/7857503,这道题挺难的,我也是看的题解。

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <queue>
  5. #include <stdlib.h>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. const int maxn = ;
  11. const int INF = ;
  12. const int maxm = ;
  13.  
  14. struct node
  15. {
  16. int u,v,c,f,b,next ;
  17. }map[maxm] ;
  18. bool flag[maxn] ;
  19. int cap[][],dist[maxn],pre[maxn],head[maxn] ;
  20. int s,t,n,k,ans,cnt ;
  21. int del,val ;
  22.  
  23. void addedge(int u,int v,int c,int b)
  24. {
  25. map[cnt].u = u ;
  26. map[cnt].v = v ;
  27. map[cnt].c = c ;
  28. map[cnt].b = b ;
  29. map[cnt].f = ;
  30. map[cnt].next = head[u] ;
  31. head[u] = cnt++ ;
  32.  
  33. map[cnt].u = v ;
  34. map[cnt].v = u ;
  35. map[cnt].c = ;
  36. map[cnt].b = -b ;
  37. map[cnt].f = ;
  38. map[cnt].next = head[v] ;
  39. head[v] = cnt++ ;
  40. }
  41.  
  42. void spfa()
  43. {
  44. memset(flag,,sizeof(flag)) ;
  45. queue<int >Q ;
  46. Q.push(s) ;
  47. flag[s] = true ;
  48. while(!Q.empty())
  49. {
  50. int x = Q.front() ;
  51. Q.pop() ;
  52. flag[x] = false ;
  53. for(int i = head[x] ; i+ ; i = map[i].next)
  54. {
  55. int y = map[i].v ;
  56. if(map[i].c > map[i].f && dist[y] < dist[x] + map[i].b)
  57. {
  58. dist[y] = dist[x]+map[i].b ;
  59. pre[y] = i ;
  60. if(!flag[y])
  61. {
  62. flag[y] = true ;
  63. Q.push(y) ;
  64. }
  65. }
  66. }
  67. }
  68. }
  69.  
  70. void mcmf()
  71. {
  72. for( ; ; )
  73. {
  74. memset(dist,-,sizeof(dist)) ;
  75. memset(pre,-,sizeof(pre)) ;
  76. dist[s] = ;
  77. spfa() ;
  78. if(dist[t] == -)
  79. break ;
  80. int minn = INF ;
  81. for(int i = pre[t] ; i+ ; i = pre[map[i].u])
  82. minn = min(minn,map[i].c-map[i].f) ;
  83. for(int i = pre[t] ; i+ ; i = pre[map[i].u])
  84. {
  85. map[i].f += minn ;
  86. map[i^].f -= minn ;
  87. }
  88. ans += dist[t] ;
  89. }
  90. }
  91.  
  92. void Init()
  93. {
  94. cnt = ;
  95. memset(head,-,sizeof(head)) ;
  96. s = ;
  97. t = *n*n+ ;
  98. del = n*n ;
  99. ans = ;
  100. }
  101. int main()
  102. {
  103. scanf("%d %d",&n,&k) ;
  104. Init() ;
  105. for(int i = ; i <= n ; i++)
  106. {
  107. for(int j = ; j <= n ; j++)
  108. scanf("%d",&cap[i][j]) ;
  109. }
  110. addedge(s,,k,) ;
  111. addedge(n*n+del,t,k,) ;
  112. for(int i = ; i <= n ; i++)
  113. {
  114. for(int j = ; j <= n ; j++)
  115. {
  116. val = (i-)*n+j ;
  117. addedge(val,val+del,,cap[i][j]) ;
  118. addedge(val,val+del,INF,) ;
  119. if(j != n) addedge(val+del,val+,INF,) ;
  120. if(i < n) addedge(val+del,val+n,INF,) ;
  121. }
  122. }
  123. mcmf() ;
  124. printf("%d\n",ans) ;
  125. return ;
  126. }

POJ 3422 Kaka's Matrix Travels(最小费用最大流)的更多相关文章

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

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

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

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

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

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

  4. POJ 3422 Kaka's Matrix Travels

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

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

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

  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. wamp 提示 Directive allow_call_time_pass_reference is no longer avaiable in PHP

    在wamp运行时,提示"Directive allow_call_time_pass_reference is no longer avaiable in PHP",点击确定之后, ...

  2. Json-lib - java.util.Date 转换问题

    使用 JSON-lib 将 java.util.Date 对象直接转换成 JSON 字符串时,得到的通常不是想要格式: System.out.println(JSONSerializer.toJSON ...

  3. 转--T-SQL 总结

    把长日期转换为短日期   Convert(char(10),getdate(),120)  MS-SQL数据库开发常用汇总 1.按姓氏笔画排序:Select * From TableName Orde ...

  4. JavaWeb_数据传输_原

    本节目录: 1.如何从Servlet向JSP传送数据:(setAtrribute和getAtrribute)  2.jsp如何输入表达数据以及传数据到servlet(FormAction去向和Inpu ...

  5. 编程中的 if ()else() 语句

    例句    if()  else() double d = Convert.ToDouble(Console .ReadLine()); if (d >= 60 && d< ...

  6. 第九篇、UITabbar增加类别用来标红点

    1.系统中只有设置bage的方式,设置为nil也是为一个红点,但是很大,并不是我们需要的 2.扩充标红点的方法 (常用于有新的动态提示标志) #import <UIKit/UIKit.h> ...

  7. 03静态链表_StaticLinkList--(线性表)

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  8. 16_会话技术_Session

    [Session简述] * 在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下),因此,在需要保存用户数据时,服务 ...

  9. VC++ CTime Format 详解

    参考链接: VC++中CTime类Format参数详解 CTime/COleDateTime::Format方法的使用 http://stat.ethz.ch/R-manual/R-devel/lib ...

  10. hdu 1316 How many Fibs?(高精度斐波那契数)

    //  大数继续 Problem Description Recall the definition of the Fibonacci numbers:  f1 := 1  f2 := 2  fn : ...