1. /*
  2. 带权二分图匹配
  3. 用费用流求,增加源点s 和 汇点t
  4. */
  5. #include<bits/stdc++.h>
  6. using namespace std;
  7. #define maxn 10005
  8. #define maxm 200005
  9. struct Edge{int to,nxt,w,c;}e[maxm<<];
  10. int head[maxn],tot,n,m,s,t,ans,maxflow;
  11. char mp[maxn][maxn];
  12. vector<pair<int,int> >M,H;
  13. void add(int u,int v,int w,int c){
  14. e[tot].to=v;e[tot].w=w;e[tot].c=c;e[tot].nxt=head[u];head[u]=tot++;
  15. e[tot].to=u;e[tot].w=;e[tot].c=-c;e[tot].nxt=head[v];head[v]=tot++;
  16. }
  17.  
  18. int d[maxn],v[maxn],incf[maxn],pre[maxn];
  19. bool spfa(){
  20. queue<int>q;
  21. memset(d,0x3f,sizeof d);
  22. memset(v,,sizeof v);
  23. q.push(s);d[s]=;v[s]=;
  24. incf[s]=<<;
  25. while(q.size()){
  26. int x=q.front();q.pop();v[x]=;
  27. for(int i=head[x];i!=-;i=e[i].nxt){
  28. int y=e[i].to;
  29. if(e[i].w==)continue;
  30. if(d[y]>d[x]+e[i].c){
  31. d[y]=d[x]+e[i].c;
  32. incf[y]=min(incf[x],e[i].w);
  33. pre[y]=i;
  34. if(!v[y])v[y]=,q.push(y);
  35. }
  36. }
  37. }
  38. if(d[t]==0x3f3f3f3f)return false;
  39. return true;
  40. }
  41. void update(){
  42. int x=t;
  43. while(x!=s){
  44. int i=pre[x];
  45. e[i].w-=incf[t];
  46. e[i^].w+=incf[t];
  47. x=e[i^].to;
  48. }
  49. maxflow+=incf[t];
  50. ans+=d[t]*incf[t];
  51. }
  52.  
  53. void init(){
  54. memset(head,-,sizeof head);
  55. tot=ans=maxflow=;
  56. M.clear();H.clear();
  57. }
  58. int dis(pair<int,int> a,pair<int,int> b){
  59. return abs(a.first-b.first)+abs(a.second-b.second);
  60. }
  61.  
  62. int main(){
  63. while(cin>>n>>m&&n){
  64. init();
  65. for(int i=;i<=n;i++)
  66. for(int j=;j<=m;j++){
  67. scanf("\n%c",&mp[i][j]);
  68. if(mp[i][j]=='m')
  69. M.push_back(make_pair(i,j));
  70. if(mp[i][j]=='H')
  71. H.push_back(make_pair(i,j));
  72. }
  73. s=,t=*M.size()+;
  74. for(int i=;i<M.size();i++)
  75. add(s,i+,,);
  76. for(int i=;i<H.size();i++)
  77. add(i++M.size(),t,,);
  78. for(int i=;i<M.size();i++)
  79. for(int j=;j<H.size();j++)
  80. add(i+,j++M.size(),,dis(M[i],H[j]));
  81. while(spfa())
  82. update();
  83. cout<<ans<<'\n';
  84. }
  85. }

费用流模板(带权二分图匹配)——hdu1533的更多相关文章

  1. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  2. 运动员最佳匹配问题 KM算法:带权二分图匹配

    题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  3. POJ 2195 Going Home (带权二分图匹配)

    POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...

  4. POJ 2195 Going Home | 带权二分图匹配

    给个地图有人和房子 保证人==房子,每个人移动到房子处需要花费曼哈顿距离的代价 问让人都住在房子里最小代价 显然是个带权二分图最大匹配 转化成以一个网络,规定w是容量,c是代价 1.S向人连边,w=1 ...

  5. hdu5045:带权二分图匹配

    题目大意 : n个人 做m道题,其中 每连续的n道必须由不同的人做 已知第i人做出第j题的概率为pij,求最大期望 思路:考虑每连续的n道题 都要n个人来做,显然想到了带权的二分图匹配 然后就是套模板 ...

  6. Glorious Brilliance (最短路 + 带权二分图匹配)

    这是一道代码大题.一开始读错题意了,然后理解成直接看上去的那种相邻,然后想不通好久!!! 把不同联通的图分离出来,然后先预处理一下形成之后的相邻图的状态,然后根据01确定哪一些是需要更换状态的,然后建 ...

  7. [HAOI2008]移动玩具(状压&带权二分图)

    题目描述 • 一个 4 × 4 的 0/1 矩阵 • 每次可以交换相邻两个元素 • 求从初始状态到目标状态的最小交换次数 输入格式 前四行,每行一个长为 4 的 0/1 字符串,描述初始状态. 后四行 ...

  8. KM(Kuhn-Munkres)算法求带权二分图的最佳匹配

    KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后, ...

  9. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

随机推荐

  1. boost asio acceptor 构造

    boost::asio::io_service io_svc; boost::asio::ip::address_v4 lis_ip; // 默认监听本机所有IP boost::asio::ip::t ...

  2. mfc中的_T

    mfc 中的字符串表示常用_T,意为text,定义为宏定义,可以方便的定义所有字符串为UNICODE(16位,长字符)或者ANSI(8位,短字符). 如果对于所有的字符串定义了_T并且定义了预处理标志 ...

  3. Replication Controller、Replica Set

    假如我们现在有一个Pod正在提供线上的服务,我们来想想一下我们可能会遇到的一些场景: 某次运营活动非常成功,网站访问量突然暴增 运行当前Pod的节点发生故障了,Pod不能正常提供服务了 第一种情况,可 ...

  4. shell脚本中:单引号和双引号的区别

    单引号和双引号的区别 前面我们还留下一个疑问,定义变量时,变量的值可以由单引号' '包围,也可以由双引号" "包围,它们到底有什么区别呢?不妨以下面的代码为例来说明: #!/bin ...

  5. SCOI 2014 省选总结

    总的来说作为高一党,去做省选难度的题完全就是去玩的,还是找惯例起身跪hja. 跪毕,看看自己惨不忍睹的成绩,我只想说:电子坑大为什么day1的暴力只有10分!为什么呢?我笑看题面: 方伯伯种玉米,方伯 ...

  6. JavaScript中深拷贝实现

    JavaScript 中深拷贝实现   拷贝时候涉及到: 1.循环结构 2.判断数组 Array 还是对象 Object   函数实现 /** * 获取满足条件的数组中的第一个元素 * @param ...

  7. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

  8. 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686

    换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...

  9. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_part.h> UF_initialize ...

  10. Cstring转char、string、int等数据类型的方法(转载)

    Cstring转char.string.int等数据类型的方法 (-- ::) 转载 标签: 杂谈 分类: VC CString 转char * CString cstr; char *p = (LP ...