职务地址:

pid=4862">HDU4862

最小费用流做的还是太少。

建图想不出来。

直接引用官方题解的话吧。。。

最小K路径覆盖的模型。用费用流或者KM算法解决,构造二部图,X部有N*M个节点。源点向X部每一个节点连一条边,流量1,费用0,Y部有N*M个节点,每一个节点向汇点连一条边。流量1,费用0。假设X部的节点x能够在一步之内到达Y部的节点y,那么就连边x->y,费用为从x格子到y格子的花费能量减去得到的能量。流量1,再在X部添加一个新的节点,表示能够从随意节点出发K次,源点向其连边,费用0。流量K。这个点向Y部每一个点连边,费用0,流量1,最这个图跑最小费用最大流,假设满流就是存在解。反之不存在,最小费用的相反数就是能够获得的最大能量

代码例如以下:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <math.h>
  6. #include <ctype.h>
  7. #include <queue>
  8. #include <map>
  9. #include<algorithm>
  10. using namespace std;
  11. const int INF=0x3f3f3f3f;
  12. int head[500], source, sink, cnt, flow, cost;
  13. int cur[500], d[500], vis[500], mp[20][20];
  14. struct node
  15. {
  16. int u, v, cap, cost, next;
  17. } edge[1000000];
  18. void add(int u, int v, int cap, int cost)
  19. {
  20. edge[cnt].v=v;
  21. edge[cnt].cap=cap;
  22. edge[cnt].cost=cost;
  23. edge[cnt].next=head[u];
  24. head[u]=cnt++;
  25.  
  26. edge[cnt].v=u;
  27. edge[cnt].cap=0;
  28. edge[cnt].cost=-cost;
  29. edge[cnt].next=head[v];
  30. head[v]=cnt++;
  31. }
  32. int spfa()
  33. {
  34. memset(d,INF,sizeof(d));
  35. memset(vis,0,sizeof(vis));
  36. queue<int>q;
  37. q.push(source);
  38. d[source]=0;
  39. cur[source]=-1;
  40. int minflow=INF, i;
  41. while(!q.empty())
  42. {
  43. int u=q.front();
  44. q.pop();
  45. vis[u]=0;
  46. for(i=head[u]; i!=-1; i=edge[i].next)
  47. {
  48. int v=edge[i].v;
  49. if(d[v]>d[u]+edge[i].cost&&edge[i].cap)
  50. {
  51. d[v]=d[u]+edge[i].cost;
  52. minflow=min(minflow,edge[i].cap);
  53. cur[v]=i;
  54. if(!vis[v])
  55. {
  56. vis[v]=1;
  57. q.push(v);
  58. }
  59. }
  60. }
  61. }
  62. if(d[sink]==INF) return 0;
  63. flow+=minflow;
  64. cost-=minflow*d[sink];
  65. for(i=cur[sink]; i!=-1; i=cur[edge[i^1].v])
  66. {
  67. edge[i].cap-=minflow;
  68. edge[i^1].cap+=minflow;
  69. }
  70. return 1;
  71. }
  72. void mcmf(int sum)
  73. {
  74. while(spfa());
  75. if(flow==sum)
  76. printf("%d\n",cost);
  77. else
  78. printf("-1\n");
  79. }
  80. int main()
  81. {
  82. int t, n, m, i, j, k, h, num=0;
  83. char s[30];
  84. scanf("%d",&t);
  85. while(t--)
  86. {
  87. num++;
  88. scanf("%d%d%d",&n,&m,&k);
  89. for(i=0; i<n; i++)
  90. {
  91. scanf("%s",s);
  92. for(j=0; j<m; j++)
  93. {
  94. mp[i][j]=s[j]-'0';
  95. }
  96. }
  97. source=0;
  98. sink=2*n*m+2;
  99. cnt=0;
  100. memset(head,-1,sizeof(head));
  101. flow=0;
  102. cost=0;
  103. for(i=1; i<=n*m; i++)
  104. {
  105. add(source,i,1,0);
  106. add(i+n*m+1,sink,1,0);
  107. add(n*m+1,i+n*m+1,1,0);
  108. }
  109. add(source,n*m+1,k,0);
  110. int z;
  111. for(i=0; i<n; i++)
  112. {
  113. for(j=0; j<m; j++)
  114. {
  115. for(h=j+1; h<m; h++)
  116. {
  117. z=0;
  118. if(mp[i][j]==mp[i][h])
  119. z=mp[i][j];
  120. add(i*m+j+1,n*m+1+i*m+h+1,1,h-j-1-z);
  121. }
  122. for(h=i+1; h<n; h++)
  123. {
  124. int z=0;
  125. if(mp[i][j]==mp[h][j])
  126. z=mp[i][j];
  127. add(i*m+j+1,n*m+1+h*m+j+1,1,h-i-1-z);
  128. }
  129. }
  130. }
  131. printf("Case %d : ",num);
  132. mcmf(n*m);
  133. }
  134. return 0;
  135. }

版权声明:本文博主原创文章。博客,未经同意不得转载。

HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)的更多相关文章

  1. HDU 4864Task(更多的联合培训学校1)(贪婪)

    职务地址:pid=4864">HDU4864 这题又是一上来觉得是最小费用流,可是边太多.果然,敲完交上去后不断TLE.. 小优化了两次也没过. . . sad.. 后来看了题解才发现 ...

  2. hdu 2686 Matrix 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n ...

  3. hdu 1533 Going Home 最小费用最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1533 On a grid map there are n little men and n house ...

  4. hdu 4494 Teamwork 最小费用最大流

    Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 ...

  5. HDU 5988.Coding Contest 最小费用最大流

    Coding Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  6. hdu 3667(拆边+最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3667 思路:由于花费的计算方法是a*x*x,因此必须拆边,使得最小费用流模板可用,即变成a*x的形式. ...

  7. hdu 2686&&hdu 3376(拆点+构图+最小费用最大流)

    Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  8. hdu 3488(KM算法||最小费用最大流)

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  9. hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)

    Cyclic Tour Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Total ...

随机推荐

  1. SVGALib

    SVGALib是一套运行于Linux及FreeBSD下的开放源代码低阶绘图函式库,它允许程式设计人员变更视讯模式及全屏幕图像,许多热门的电脑游戏如Quake及Doom都源自此技术. 范例 编辑 #in ...

  2. JavaScript中双叹号“!!”作用

    1.JavaScript的逻辑非(!)操作符的作用 (逻辑非) 如果操作数能够转换为true则返回false:否则返回true. 2.!!的作用 !!一般用来将后面的表达式强制转换为布尔类型的数据(b ...

  3. LA 3026 - Period KMP

    看题传送门:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  4. [慕课笔记] node+mongodb建站攻略

    如何利用node+mongodb来快速搭建一个电影网站? 一:后端部分 整个网站的后端是由node.js来驱动的,所以在后端需要安装node.js,以及在这个基础之上的框架express,它能够帮助我 ...

  5. RISC-V工具链环境(基于Debian/Linux操作系统)

    RISC-V工具链环境(基于Debian/Linux操作系统) 提要 Debian/Linux虚拟机导入 启动虚拟机 SiFive/Nuclei SDK运行指南 Debian/Linux虚拟机存储位置 ...

  6. UI组件之AdapterView及其子类关系,Adapter接口及事实上现类关系

    AdapterView本身是一个抽象基类,它派生的的子类在使用方法上十分类似.AdapterView直接派生的三个子类:AbsListView.AbsSpinner,AdapterViewAnimat ...

  7. eclipse调试鼠标放上去显示变量值

    在eclipse中调试时,鼠标移动到变量上不显示值,这个原来自己也遇到过,没注意,反正就使用ctrl+shift+i嘛,也可以的,刚查了一下,解决方法如下: Window->Preference ...

  8. wikioi 1051哈希表

    题目描写叙述 Description 给出了N个单词,已经按长度排好了序.假设某单词i是某单词j的前缀,i->j算一次接龙(两个同样的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙 ...

  9. ZOJ 3204 Connect them 继续MST

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3367 题目大意: 让你求最小生成树,并且按照字典序输出哪些点连接.无解输出-1 ...

  10. https://github.com/mvf/svn_wfx

    https://github.com/mvf/svn_wfx 2003.net对应的vc是7.0版本.需要更高的. 在哪里可以下载呢 https://www.tjupt.org/没有校外种子 Proj ...