1. /*最小K路径覆盖的模型,用费用流或者KM算法解决,
  2. 构造二部图,X部有N*M个节点,源点向X部每个节点连一条边,
  3. 流量1,费用0,Y部有N*M个节点,每个节点向汇点连一条边,流量1,
  4. 费用0,如果X部的节点x可以在一步之内到达Y部的节点y,那么就连边x->y,
  5. 费用为从x格子到y格子的花费能量减去得到的能量,流量1,
  6. 再在X部增加一个新的节点,表示可以从任意节点出发K次,源点向其连边,
  7. 费用0,流量K,这个点向Y部每个点连边,费用0,流量1,最这个图跑最小费用最大流,
  8. 如果满流就是存在解,反之不存在,最小费用的相反数就是可以获得的最大能量
  9. 因为要求最小路径覆盖,n*m-maxflow<=k ,所以maxflow+k>=n*m,如果是满流的话就存在最小费用最大流可求出,否则*/
  10. #include<stdio.h>
  11. #include<math.h>
  12. #include<string.h>
  13. #include<queue>
  14. using namespace std;
  15. #define inf 0x3fffffff
  16. #define N 500
  17. struct node
  18. {
  19. int u,v,w,f,next;
  20. } bian[N*N*10];
  21. char ss[N][N];
  22. int ma[N][N];
  23. int manha(int i,int j,int ii,int jj)
  24. {
  25. if(ma[i][j]==ma[ii][jj])
  26. return ii-i+jj-j-1-ma[i][j];
  27. return ii-i+jj-j-1;
  28. }
  29. /*模板*/
  30. int dis[N],pre[N],head[N],visit[N],yong,maxflow;
  31. void init()
  32. {
  33. memset(head,-1,sizeof(head));
  34. yong=0;
  35. }
  36. void build(int u,int v,int w,int f)
  37. {
  38. bian[yong].u=u;
  39. bian[yong].v=v;
  40. bian[yong].w=w;
  41. bian[yong].f=f;
  42. bian[yong].next=head[u];
  43. head[u]=yong++;
  44. }
  45. void adde(int u,int v,int w,int f)
  46. {
  47. build(u,v,w,f);
  48. build(v,u,-w,0);
  49. }
  50. int min_cost(int s,int t)
  51. {
  52. int sum=0;
  53. while(1)
  54. {
  55. memset(visit,0,sizeof(visit));
  56. memset(pre,-1,sizeof(pre));
  57. for(int i=0; i<=t; i++) //注意是从0开始而不是从s开始
  58. dis[i]=inf;
  59. queue<int>q;
  60. visit[s]=1;//必须是s
  61. q.push(s);
  62. dis[s]=0;
  63. while(!q.empty ())
  64. {
  65. int u=q.front ();
  66. for(int index=head[u]; index!=-1; index=bian[index].next)
  67. {
  68. int v=bian[index].v;
  69. if(bian[index].f&&dis[v]>dis[u]+bian[index].w)
  70. {
  71. dis[v]=dis[u]+bian[index].w;
  72. pre[v]=index;
  73. if(!visit[v])
  74. {
  75. visit[v]=1;
  76. q.push (v);
  77. }
  78. }
  79. }
  80. q.pop();
  81. visit[u]=0;//是u
  82. }
  83. int i;
  84. if(dis[t]==inf)
  85. break;
  86. int minn=inf;
  87. i=pre[t];
  88. while(i!=-1)
  89. {
  90. if(minn>bian[i].f)
  91. minn=bian[i].f;
  92. i=pre[bian[i].u];
  93. }
  94. maxflow+=minn;
  95. sum=sum+minn*dis[t];
  96. i=pre[t];
  97. while(i!=-1)
  98. {
  99. bian[i].f-=minn;
  100. bian[i^1].f+=minn;
  101. i=pre[bian[i].u];
  102. }
  103. }
  104. return sum;
  105. }
  106. /*最小费用最大流*/
  107. int main()
  108. {
  109. int n,m,i,j,k,s,t,T,kk,r,l,su,index=0;
  110. scanf("%d",&T);
  111. while(T--)
  112. {
  113. init();
  114. scanf("%d%d%d",&n,&m,&k);
  115. for(i=1; i<=n; i++)
  116. scanf("%s",ss[i]+1);
  117. for(i=1; i<=n; i++)
  118. for(j=1; j<=m; j++)
  119. ma[i][j]=ss[i][j]-'0';
  120. s=0;
  121. kk=2*n*m+1;
  122. t=kk+1;
  123. for(i=1; i<=n*m; i++)
  124. adde(s,i,0,1);
  125. adde(s,kk,0,k);
  126. for(i=n*m+1; i<=n*m*2; i++)
  127. {
  128. adde(kk,i,0,1);
  129. adde(i,t,0,1);
  130. }
  131. for(i=1; i<=n; i++)
  132. for(j=1; j<=m; j++)
  133. {
  134. for(r=j+1; r<=m; r++)
  135. {
  136. int w=manha(i,j,i,r);
  137. adde((i-1)*m+j,(i-1)*m+r+n*m,w,1);
  138. }
  139. for(r=i+1; r<=n; r++)
  140. {
  141. int w=manha(i,j,r,j);
  142. adde((i-1)*m+j,(r-1)*m+j+n*m,w,1);
  143. }
  144. }
  145. maxflow=0;
  146. su=min_cost(s,t);
  147. printf("Case %d : ",++index);
  148. if(maxflow==n*m)
  149. printf("%d\n",-su);
  150. else
  151. printf("%d\n",-1);
  152. }
  153. return 0;
  154. }

hdu 4862KM&最小费用最大流的更多相关文章

  1. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  2. hdu 1533(最小费用最大流)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. HDU 1533 最小费用最大流(模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 这道题直接用了模板 题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用 要注意void ...

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

    Transportation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. hdu 6437 /// 最小费用最大流 负花费 SPFA模板

    题目大意: 给定n,m,K,W 表示n个小时 m场电影(分为类型A.B) K个人 若某个人连续看了两场相同类型的电影则失去W 电影时间不能重叠 接下来给定m场电影的 s t w op 表示电影的 开始 ...

  6. hdu 4067(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4067 思路:很神奇的建图,参考大牛的: 如果人为添加t->s的边,那么图中所有顶点要满足的条件都 ...

  7. hdu 2485(最小费用最大流)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2485 思路:题目的意思是删除最少的点使1,n的最短路大于k.将点转化为边,容量为1,费用为0,然后就是 ...

  8. hdu 6201(最小费用最大流)

    transaction transaction transaction Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/1 ...

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

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

随机推荐

  1. 一、Linux文件权限与目录配置

    行文结构如下: 用户和用户组 Linux文件权限概念 Linux目录配置 重点回顾 1.用户与用户组 Linux是个多用户.多任务的系统,可能有多人同时使用这台机器进行工作,为了考虑每个人的隐私和工作 ...

  2. K8S之利用Label控制Pod位置

    首先介绍下什么是Label? Label是Kubernetes系列中一个核心概念.是一组绑定到K8s资源对象上的key/value对.同一个对象的labels属性的key必须唯一.label可以附加到 ...

  3. 客户端JavaScript基础 网页上的输入输出

    创建: 2017/10/06 完成: 2017/10/07   更新: 2017/10/15 增加了通过事件监听器登陆事件的方法的链接   # TODO: 补充 基于Canvas的图象 客户端Java ...

  4. [Apple开发者帐户帮助]七、注册设备(2)注册多个设备

    如果您有许多测试设备,则可以创建包含设备名称和设备ID的文件,并将整个文件上载到开发人员帐户.您的开发人员帐户支持以下两种文件格式:具有.deviceids文件扩展名和纯文本文件的属性列表文件.您选择 ...

  5. Eclipse 添加 YAML插件

    官网:https://github.com/oyse/yedit 离线版本:(链接: https://pan.baidu.com/s/1PJzkS1tI-VigZvfbYXUh9A 密码: gfep) ...

  6. [Luogu 2678] noip15 子串

    [Luogu 2678] noip15 子串 题目描述 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出 ...

  7. ACM_填格子

    填格子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 在一个n*n格子里边已经填了部分大写字母,现在给你个任务:把剩下的格子也填 ...

  8. [转] 64位Oracle 11g R2的客户端连接时报ORA-01019错误

    本文转自:http://blog.csdn.net/downmoon/article/details/8038583 在Win8企业版64位环境下,连接Oracle11g 服务端,搞了整整两天,特将过 ...

  9. 6.11---上传图片遇到的bug,字节流输入流输出流----图解----图片必须是post

    !!!这里要注意不能是目录必须是指定的文件名+目录,不然就存照片到指定的目录不成功 ----------------------------------------完整controller-servi ...

  10. Android 解决ScrollView嵌套RecyclerView导致滑动不流畅的问题

    最近做的项目中遇到了ScrollView嵌套RecyclerView,刚写完功能测试,直接卡出翔了,后来通过网上查找资料和 自己的实践,找出了两种方法解决这个问题. 首先来个最简单的方法: recyc ...