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

最大费用最大流:

拆点,在自点之间连两条边,一条容量为1,边权为数字;一条容量为k-1,边权为0;表示可以走k次,只有一次能取到数字;

从每个格子能向下或向右走,于是向下面的点、右面的点连边;

将E-K算法中的bfs改成spfa求最长路(边权最大),找出最大流即为答案;

因为对E-K算法不太熟练,WA了n遍,最后发现是不能像dinic一样在bfs中途找到汇点就退出,因为不是构建分层图,而是spfa求最长路。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. queue<int>q;
  7. int n,k,ans,head[],ct=,s,t,inf=1e9,dis[],pre[],incf[];
  8. bool vis[];
  9. struct N{
  10. int to,next,w,v;
  11. N(int t=,int n=,int ww=,int vv=):to(t),next(n),w(ww),v(vv) {}
  12. }edge[];
  13. void add(int x,int y,int ww,int vv)
  14. {
  15. edge[++ct]=N(y,head[x],ww,vv);head[x]=ct;
  16. edge[++ct]=N(x,head[y],,-vv);head[y]=ct;
  17. }
  18. bool bfs()
  19. {
  20. memset(vis,,sizeof vis);
  21. memset(pre,,sizeof pre);
  22. memset(dis,-,sizeof dis);
  23. memset(incf,,sizeof incf);
  24. while(q.size())q.pop();
  25. q.push(s);vis[s]=;dis[s]=;
  26. while(q.size())
  27. {
  28. int x=q.front();q.pop();vis[x]=;
  29. for(int i=head[x];i;i=edge[i].next)
  30. {
  31. int u=edge[i].to;
  32. // if(vis[u])continue;
  33. if(edge[i].w&&dis[u]<dis[x]+edge[i].v)//残量网络spfa
  34. {
  35. dis[u]=dis[x]+edge[i].v;
  36. incf[u]=min(edge[i].w,incf[x]);
  37. pre[u]=i;
  38. if(!vis[u])q.push(u),vis[u]=;
  39. // if(u==t)return 1;//!!!
  40. }
  41. }
  42. }
  43. if(dis[t]<)return ;
  44. else return ;
  45. // return 0;
  46. }
  47. void up()
  48. {
  49. int x=t;
  50. while(x!=s)
  51. {
  52. int i=pre[x];
  53. edge[i].w-=incf[t];
  54. edge[i^].w+=incf[t];
  55. ans+=edge[i].v*incf[t];//
  56. x=edge[i^].to;
  57. }
  58. // ans+=dis[t]*incf[t];// 皆可
  59. }
  60. int main()
  61. {
  62. scanf("%d%d",&n,&k);
  63. for(int i=;i<=n;i++)
  64. for(int j=;j<=n;j++)
  65. {
  66. int x,p=(i-)*n+j,p2=p+n*n;
  67. scanf("%d",&x);
  68. add(p,p2,,x);
  69. add(p,p2,k-,);//
  70. if(i<n)add(p2,p+n,k,);
  71. if(j<n)add(p2,p+,k,);
  72. }
  73. s=;t=*n*n+;
  74. add(s,,k,);
  75. add(*n*n,t,k,);
  76. while(bfs())up();
  77. printf("%d",ans);
  78. return ;
  79. }

附数据:

  1.  

数据

poj3422K方格取数——最大费用最大流的更多相关文章

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

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

  2. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

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

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

  4. LG2045 方格取数加强版 费用流

    问题描述 LG2045 题解 费用流. 套路拆点,把\((i,j)\)拆为两个点,在这两个点之间连边:一条边流量为\(1\),费用为\(a_{i,j}\),另一条边为流量为\(INF\),费用为\(0 ...

  5. 【wikioi】1907 方格取数3(最大流+最大权闭合子图)

    http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...

  6. 「网络流24题」「LuoguP2774」方格取数问题(最大流 最小割

    Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于给定的方 ...

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

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

  8. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

随机推荐

  1. Linux命令apt-get apt的常见用法

    高级包装工具(英语:Advanced Packaging Tools,缩写为APT) apt-cache search foo //搜索和"foo"匹配的包. apt-cache ...

  2. C++钩子程序浅析

    在网上搜索“键盘记录C++”实现可以找到很多相关文章,我也是照着上面的介绍去研究去试着做的,从懂到不懂.那么为什么有那么多材料我还要去写这样一篇 文章,我想这个是我个人需要关心的问题,我不是那种ctr ...

  3. 如何给UIViewController瘦身

    本文转载至  http://www.cocoachina.com/ios/20141128/10356.html 随着程序逻辑复杂度的提高,你是否也发现了App中一些ViewController的代码 ...

  4. EasyPlayerPro Windows播放器实时流进行本地缓冲区即时回放功能实现

    背景描述 参照国内视频监控行业监控软件,实现当前视频的即时回放功能,例如: 监控人员发现刚刚的某个视频点有可疑,就像录像回放一样,想倒回去看一下,但又不想切换到录像回放界面, 此处就体现即时回放的价值 ...

  5. java 对象变量 c++对象指针 初始化对象变量的2中方法

    java 对象变量 c++对象指针 java null引用 c++ null指针 Date deadline  是 对象变量,它可以引用Date类型的对象,但它不是一个对象,实际上它也没有引用对象. ...

  6. eclipse中 svn出现 E220000 解决办法

    这种情况,先试试修改svnserve.conf 中的 anon-access = none 然后重启eclipse   如果还是不行,还有可能是因为你修改了svn的配置链接后 跟他人的svn连接方式有 ...

  7. Django项目之【学员管理系统】

    Django项目[学员管理系统] 项目规划阶段 项目背景 现实生活中,特别是在学校,传统的excel统计管理学员信息的方式已经无法满足日渐增长的业务需求. 因此需一套方便易用的“学员管理系统”,来提高 ...

  8. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  9. 在EditText插入表情,并发送表情

    在EditText插入表情,点击发送按钮,将qq表情显示在TextView中: [mw_shl_code=java,true]public class EditTextActivity extends ...

  10. python 列表之队列

    列表实现队列操作(FIFO),可以使用标准库里的 collections.deque,deque是double-ended quene的缩写,双端队列的意思,它可以实现从队列头部快速增加和取出对象. ...