http://acm.hdu.edu.cn/showproblem.php?pid=4862

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <queue>
  6. using namespace std ;
  7. const int INF=0xfffffff ;
  8. struct node{
  9. int s,t,cap,cost,nxt ;
  10. }e[] ;
  11. int sumflow ;
  12. int cnt,head[],vis[],dis[],pre[] ;
  13. void add(int s,int t,int cap,int cost)
  14. {
  15. e[cnt].s=s ;e[cnt].t=t ;e[cnt].cap=cap ;e[cnt].cost=cost ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;
  16. e[cnt].s=t ;e[cnt].t=s ;e[cnt].cap= ;e[cnt].cost=-cost ;e[cnt].nxt=head[t] ;head[t]=cnt++ ;
  17. }
  18. int spfa(int s,int t,int N)
  19. {
  20. for(int i= ;i<=N ;i++)
  21. dis[i]=INF ;
  22. dis[s]= ;
  23. memset(vis,,sizeof(vis)) ;
  24. memset(pre,-,sizeof(pre)) ;
  25. vis[s]= ;
  26. queue <int> q ;
  27. q.push(s) ;
  28. while(!q.empty())
  29. {
  30. int u=q.front() ;
  31. q.pop() ;
  32. vis[u]= ;
  33. for(int i=head[u] ;i!=- ;i=e[i].nxt)
  34. {
  35. int tt=e[i].t ;
  36. if(e[i].cap && dis[tt]>dis[u]+e[i].cost)
  37. {
  38. dis[tt]=dis[u]+e[i].cost ;
  39. pre[tt]=i ;
  40. if(!vis[tt])
  41. {
  42. vis[tt]= ;
  43. q.push(tt) ;
  44. }
  45. }
  46. }
  47. }
  48. if(dis[t]==INF)return ;
  49. return ;
  50. }
  51. int mincost ;
  52. int MCMF(int s,int t,int N)
  53. {
  54. int flow,minflow ;
  55. mincost=flow= ;
  56. while(spfa(s,t,N))
  57. {
  58. minflow=INF ;
  59. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  60. minflow=min(minflow,e[i].cap) ;
  61. flow+=minflow ;
  62. for(int i=pre[t] ;i!=- ;i=pre[e[i].s])
  63. {
  64. e[i].cap-=minflow ;
  65. e[i^].cap+=minflow ;
  66. }
  67. mincost+=dis[t]*minflow ;
  68. }
  69. sumflow=flow ;//最大流
  70. return sumflow ;
  71. }
  72. char g[][] ;
  73. int gm[][] ;
  74. int main()
  75. {
  76. int T ;
  77. scanf("%d",&T) ;
  78. for(int cas= ;cas<=T ;cas++)
  79. {
  80. cnt= ;
  81. memset(head,-,sizeof(head)) ;
  82. int N,M,K ;
  83. scanf("%d%d%d",&N,&M,&K) ;
  84. for(int i= ;i<N ;i++)
  85. scanf("%s",g[i]) ;
  86. int S,T,V ;
  87. S= ;T=*N*M+ ;V=T+ ;
  88. add(S,V,K,) ;
  89. for(int i= ;i<=N*M ;i++)
  90. {
  91. add(S,i,,) ;
  92. add(i+N*M,T,,) ;
  93. add(V,i+N*M,,) ;
  94. }
  95. int ct= ;
  96. for(int i= ;i<N ;i++)
  97. {
  98. for(int j= ;j<M ;j++)
  99. {
  100. gm[i][j]=ct++ ;
  101. }
  102. }
  103. for(int i= ;i<N ;i++)
  104. {
  105. for(int j= ;j<M ;j++)
  106. {
  107. for(int k=j+ ;k<M ;k++)
  108. {
  109. if(g[i][j]==g[i][k])
  110. {
  111. add(gm[i][j],gm[i][k]+N*M,,-(g[i][j]-''-(k-j-))) ;
  112. }
  113. else
  114. {
  115. add(gm[i][j],gm[i][k]+N*M,,k-j-) ;
  116. }
  117. }
  118. for(int k=i+ ;k<N ;k++)
  119. {
  120. if(g[i][j]==g[k][j])
  121. {
  122. add(gm[i][j],gm[k][j]+N*M,,-(g[i][j]-''-(k-i-))) ;
  123. }
  124. else
  125. {
  126. add(gm[i][j],gm[k][j]+N*M,,k-i-) ;
  127. }
  128. }
  129. }
  130. }
  131. printf("Case %d : ",cas) ;
  132. if(MCMF(S,T,*N*M+)==N*M)
  133. printf("%d\n",-mincost) ;
  134. else puts("-1") ;
  135. }
  136. return ;
  137. }

最小k路径覆盖模型,解法是建二分图求最优匹配

建图如下,重点是V点的建立,这个点和S点连容量k费用0的边和拆的另一半点连容量1费用0的边,可以保证小于等于k次完成(每次匹配一定要消耗S-V的一个单位流量,因为如果不消耗匹配不会停止,这是这个模型建图的最精髓之处),别的点就是正常的费用流求二分图最优匹配的建图方法,最后看求出的最大流是否等于N*M,等于证明有解

HDU 4862的更多相关文章

  1. hdu 4862 KM算法 最小K路径覆盖的模型

    http://acm.hdu.edu.cn/showproblem.php?pid=4862 选t<=k次,t条路要经过全部的点一次而且只一次. 建图是问题: 我自己最初就把n*m 个点分别放入 ...

  2. HDU 4862 Jump(更多的联合培训学校1)(最小费用最大流)

    职务地址:pid=4862">HDU4862 最小费用流做的还是太少. 建图想不出来. . . 直接引用官方题解的话吧... 最小K路径覆盖的模型.用费用流或者KM算法解决,构造二部图 ...

  3. HDU 4862 Jump(最小K路径覆盖)

    输入一个n×m网格图,每个结点的值为0-9,可以从任意点出发不超过k次,走完每个点且仅访问每个结点一次,问最终的能量最大值.不可全部走完的情况输出-1. 初始能量为0. 而结点(x,y)可以跳跃到结点 ...

  4. HDU 4862(费用流)

    Problem Jump (HDU4862) 题目大意 给定一个n*m的矩形(n,m≤10),每个矩形中有一个0~9的数字. 一共可以进行k次游戏,每次游戏可以任意选取一个没有经过的格子为起点,并且跳 ...

  5. 【HDU 2014 Multi-University Training Contest 1 1002】/【HDU 4862】Jump

    多校训练就这么华丽丽的到了 ,于是乎各种华丽丽的被虐也開始了. 这是多校的1002; 最小费用最大流. 题目大意: 有n*m个方格,每一个方格都一个的十进制一位的数.你能够操作K次. 对于每一次操作, ...

  6. HDU 4862 Jump 费用流

    又是一个看了题解以后还坑了一天的题…… 结果最后发现是抄代码的时候少写了一个负号. 题意: 有一个n*m的网格,其中每个格子上都有0~9的数字.现在你可以玩K次游戏. 一次游戏是这样定义的: 你可以选 ...

  7. HDU 4862 Jump 任意起点最大权K链不相交覆盖

    你可以从任意起点开始起跳最多K次 每次跳你可以选择往右或者往下跳 从(x1,y1)跳到(x2,y2) 消耗的能量是曼哈顿距离-1 但是如果每次跳的起点和终点格子里的数字是相同的为X的话你会得到X能量 ...

  8. HDU 4862 JUMP 最小费用最大流

    2014 多校的B题,由于我不怎么搞图论,当时碰到这个题目,我怎么想都没往网络流方面弄,不过网络流真的是个好东西,对于状态多变,无法用动规或者数据结构来很好表示的时候,非常有用 这个题目要求每个点一定 ...

  9. HDU ACM 1134 Game of Connections / 1130 How Many Trees?(卡特兰数)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1134 [解题背景]这题不会做,自己推公式推了一段时间,将n=3和n=4的情况列出来了,只发现第n项与 ...

随机推荐

  1. Android本地广播

    Android中使用的广播一般是系统全局广播,即发出的广播可以被其他任何应用程序接收到,并且我们也可以接收来自于其他任何应用程序的广播.这样就很容易会引起安全性的问题,比如说我们发送的一些携带关键性数 ...

  2. 利用JSP中的过滤器解决中文乱码问题

    首先我们创建过过滤器: package com.gbx; import java.io.IOException; import javax.servlet.Filter; import javax.s ...

  3. SQL Insert Case When Update

    CREATE TABLE LoadTestTable ( ID INT IDENTITY(1,1), FIRSTNAME VARCHAR(50), LASTNAME VARCHAR(50), GEND ...

  4. MongoDB(课时12 字段判断)

    3.4.2.7 判断某个字段是否存在 使用“$exists”可以判断某个字段是否存在,如果设置为true表示存在,false表示不存在. 范例:查询具有parents成员的数据 db.students ...

  5. DrawDibDraw__ZC测试

    ZC: 先把 自己尝试成功的代码 记录下来,不要 弄没了之后 又忘了怎么弄... ZC: 代码 有点乱,没整理.没写 哪些是 原来MFC里面的 哪些是我自己写的,参考上一篇文章来看吧 1.VC6 的一 ...

  6. ZendFramework中实现自动加载models

    最近自学Zendframework中,写Controller的时候总要require model下的类文件,然后才能实例化,感觉非常不爽 Google了许久,找到个明白人写的方法不错,主要就是修改ap ...

  7. English trip -- VC(情景课)2 D Reading

    Xu言: 业精于勤,荒于嬉:行成于思,毁于随 Before you read 阅读准备 Talk about the picture, what do you see?看图说话,你看到了什么? Lis ...

  8. Connected Components? CodeForces - 920E (bfs)

    大意:给定无向图, 求补图的连通块数 bfs模拟即可, 这里用了map存图, set维护未划分的点集, 复杂度$O(nlog^2n)$, 用链表的话可以$O(n)$ #include <iost ...

  9. gradle 编译 No such property: sonatypeUsername错误解决

    No such property: sonatypeUsername for class: org.gradle.api.publication.maven.internal.ant.DefaultG ...

  10. 『PyTorch』第七弹_nn.Module扩展层

    有下面代码可以看出torch层函数(nn.Module)用法,使用超参数实例化层函数类(常位于网络class的__init__中),而网络class实际上就是一个高级的递归的nn.Module的cla ...