题意:

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

思路:

最小费用最大流的题目。

建图自己没想出来,看了大神的建边,把每个点分解成两个点,一个代表进入一个代表出去,然后每个进入和每个出去连边,容量是1价值是这个点的矩阵的数值。然后因为可以不进去,所以起点要和别的矩阵元素的起点建边,终点也要和别的矩阵矩阵元素的起点建边,最后跑下最小费用最大流。

这题最右下角的矩阵元素需要特殊处理下.然后源点和左上角的矩阵元素的起点连边,容量为k,权值是0.

  1. #include<stdio.h>
  2. #include<queue>
  3. #define MAXN 6003
  4. #define MAXM 10002*4
  5. #define INF 10000000
  6. using namespace std;
  7. //起点编号必须最小,终点编号必须最大
  8. bool vis[MAXN]; //spfa中记录是否在队列里边
  9. struct edge{
  10. edge *next,*op; //op是指向反向边
  11. int t,c,v; //t下一个点编号,c容量,v权值
  12. }ES[MAXM],*V[MAXN]; //ES边静态邻接表,V点的编号
  13. int N,M,S,T,EC=-; //S源点最小,T汇点最大,EC当前边数
  14. int demond[MAXN],sp[MAXN],prev[MAXN]; //spSPFA中记录距离,prev记录上一个点路径
  15. edge *path[MAXN]; //与prev同步记录,记录到上一条边
  16. void addedge(int a,int b,int v,int c=INF){
  17. edge e1={V[a],,b,c,v},e2={V[b],,a,,-v};
  18. ES[++EC]=e1;V[a]=&ES[EC];
  19. ES[++EC]=e2;V[b]=&ES[EC];
  20. V[a]->op=V[b];V[b]->op=V[a];
  21. }
  22. void init(){
  23. int n,k;
  24. scanf("%d%d",&n,&k);
  25. for(int i=;i<=n;i++)
  26. for(int j=;j<=n;j++){
  27. int tmp;
  28. scanf("%d",&tmp);
  29. addedge((i-)*n+j,n*n+(i-)*n+j,-tmp,);
  30. if(j<n){
  31. addedge(n*n+(i-)*n+j,(i-)*n+j+,);
  32. addedge((i-)*n+j,(i-)*n+j+,);
  33. }
  34. if(i<n){
  35. addedge(n*n+(i-)*n+j,i*n+j,);
  36. addedge((i-)*n+j,i*n+j,);
  37. }
  38. }
  39. S=,T=n*n*+;
  40. addedge(n*n,T,);
  41. addedge(S,,,k);
  42. addedge(n*n*,T,);
  43. }
  44. bool SPFA(){
  45. int u,v;
  46. for(u=S;u<=T;u++){
  47. sp[u]=INF;
  48. }
  49. queue<int>q;
  50. prev[S]=-;
  51. q.push(S);
  52. sp[S]=;
  53. vis[S]=;
  54. while(!q.empty()){
  55. u=q.front();
  56. vis[u]=;
  57. q.pop();
  58. for(edge *k=V[u];k;k=k->next){
  59. v=k->t;
  60. if(k->c>&&sp[u]+k->v<sp[v]){
  61. sp[v]=sp[u]+k->v;
  62. prev[v]=u;
  63. path[v]=k;
  64. if(vis[v]==){
  65. vis[v]=;
  66. q.push(v);
  67. }
  68. }
  69. }
  70. }
  71. return sp[T]!=INF;
  72. }
  73. int argument(){
  74. int i,cost=INF,flow=;
  75. edge *e;
  76. for(i=T;prev[i]!=-;i=prev[i]){
  77. e=path[i];
  78. if(e->c<cost)cost=e->c;
  79. }
  80. for(int i=T;prev[i]!=-;i=prev[i]){
  81. e=path[i];
  82. e->c-=cost;e->op->c+=cost;
  83. flow+=e->v*cost;
  84. }
  85. return flow;
  86. }
  87. int maxcostflow(){
  88. int Flow=;
  89. while(SPFA()){
  90. Flow+=argument();
  91. }
  92. return Flow;
  93. }
  94. int main(){
  95. init();
  96. printf("%d\n",-maxcostflow());
  97. return ;
  98. }

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

    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. jQuery Mobile_公司简介

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  2. CSS 使用小结

    1.文字过长显示省略号(....)  white-space: nowrap;overflow: hidden;text-overflow: ellipsis; 2.获取当前的ID : <asp ...

  3. 解压jar

    unzip EtnetChinaApplication.jar -d app进入临时目录app,编辑文件

  4. oracle 自定义异常处理

    --第一种方式:使用raise_application_error抛出自定义异常declare i number:=-1;begin if i=-1 then raise_application_er ...

  5. [nginx]Nginx禁止访问robots.txt防泄漏web目录

    关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...

  6. [原]对Linux环境下任务调度一点认识

    我一直以来有一个误解,那就是在终端运行某个程序时,按下Ctrl + D时我误以为就是杀死了这个进程,今天才知道原来不是.比如我利用libevent在Linux环境下写了一个网络监听程序,当启动程序之后 ...

  7. 03 在Linux下安装Myeclipse及Tomcat(含下载)

    测试环境: 主机系统:Win 7 虚拟机:VMware workstation 11.1.0 虚拟机OS: centos 6.5 64位 Kernel 2.6.32-431-e16.x86_64 My ...

  8. 个人卡付款sql

    select arap_djfb.billdate as 单据日期, bd_corp.unitname as 付款单位, arap_djfb.zy as 付款摘要, bd_cubasdoc.custc ...

  9. (VS TFS) Adding existing project to solution in TFS.

    正常的情况话,直接加入project,然后选择"Source control" -> “Add selected projects to source control.... ...

  10. Platform Invoke

    PInvoke 允许managed code 来调用在DLL中实施的unmanged function. Platform invoke relies on metadata to locate ex ...