<题目链接>

题目大意:
给你一张地图,地图上m代表人,H代表房子,现在所有人要走到房子内,且一个房子只能容纳一个人(人和房子的数量相同),人每移动一步,需要花1美元,问所有人走到房子中的最小花费。

解题分析:
一个人对应一个房子,并且人与房子之间的花费相当于权值,很明显的最大权完美匹配,直接套用KM算法即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. #define INF 0x3f3f3f3f
  8. #define rep(i,s,t) for(int i=s;i<=t;i++)
  9. #define mem(a,b) memset(a,b,sizeof(a))
  10. #define mp make_pair
  11. #define fi first
  12. #define se second
  13. const int N = ;
  14. char str[];
  15. typedef pair<int,int>pii;
  16. int n,m,nx,ny;
  17. int lx[N],ly[N];
  18. int linker[N],slack[N],visx[N],visy[N],w[N][N];
  19. pii locx[N],locy[N]; //记录二分图中x,y两部分所有点的坐标
  20. inline int dis(pii tmp1,pii tmp2){ //计算两点之间的花费
  21. return (abs(tmp1.fi-tmp2.fi)+abs(tmp1.se-tmp2.se));
  22. }
  23. bool DFS(int x){
  24. visx[x]=;
  25. rep(y,,ny){
  26. if(visy[y])continue;
  27. int tmp=lx[x]+ly[y]-w[x][y];
  28. if(!tmp){
  29. visy[y]=;
  30. if(linker[y]==-||DFS(linker[y])){
  31. linker[y]=x;
  32. return true;
  33. }
  34. }else slack[y]=min(slack[y],tmp);
  35. }
  36. return false;
  37. }
  38. int KM(){
  39. mem(linker,-);mem(ly,);
  40. rep(i,,nx){
  41. lx[i]=-INF;
  42. rep(j,,ny)lx[i]=max(lx[i],w[i][j]);
  43. }
  44. rep(x,,nx){
  45. rep(i,,ny)slack[i]=INF;
  46. while(true){
  47. mem(visx,);mem(visy,);
  48. if(DFS(x))break;
  49. int d=INF;
  50. rep(i,,ny)if(!visy[i])d=min(d,slack[i]);
  51. rep(i,,nx)if(visx[i])lx[i]-=d;
  52. rep(i,,ny)
  53. if(visy[i])ly[i]+=d;
  54. else slack[i]-=d;
  55. }
  56. }
  57. int res=;
  58. rep(y,,ny)
  59. if(linker[y]!=-)
  60. res+=w[linker[y]][y];
  61. return res;
  62. }
  63. int main(){
  64. while(~scanf("%d%d",&n,&m),n||m){
  65. nx=ny=;
  66. rep(i,,n){
  67. scanf("%s",str+);
  68. rep(j,,m){
  69. if(str[j]=='m')locx[++nx]=mp(i,j); //存下x,y两部分坐标
  70. if(str[j]=='H')locy[++ny]=mp(i,j);
  71. }
  72. }
  73. rep(i,,nx) rep(j,,ny){
  74. w[i][j]=-dis(locx[i],locy[j]); //得到两点之间的最短距离,也就是人到对应的房子所需花的钱,因为最后要求最小花费,所以这里要先取反
  75. }
  76. printf("%d\n",(-)*KM()); //得到最小花费
  77. }
  78. }

2018-11-18

HDU 1533 Going Home (最大权完美匹配)的更多相关文章

  1. HDU 1533 Going Home(KM完美匹配)

    HDU 1533 Going Home 题目链接 题意:就是一个H要相应一个m,使得总曼哈顿距离最小 思路:KM完美匹配,因为是要最小.所以边权建负数来处理就可以 代码: #include <c ...

  2. HDU 3488 Tour (最大权完美匹配)【KM算法】

    <题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...

  3. hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)

    /** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...

  4. 【模板】二分图最大权完美匹配KM算法

    hdu2255模板题 KM是什么意思,详见百度百科. 总之知道它可以求二分图最大权完美匹配就可以了,时间复杂度为O(n^3). 给张图. 二分图有了边权,求最大匹配下的最大权值. 所以该怎么做呢?对啊 ...

  5. 【二分图最大权完美匹配】【KM算法】【转】

    [文章详解出处]https://www.cnblogs.com/wenruo/p/5264235.html KM算法是用来求二分图最大权完美匹配的.[也就算之前的匈牙利算法求二分最大匹配的变种??] ...

  6. 二分图学习记 之 KM算法 二分图最大权完美匹配。

    前置知识 :匈牙利算法 首先有这样一张图,求这张图的最大权完美匹配. 当然如果你不想看这些渣图的话,您可以转到 洛谷 运动员最佳匹配问题 下面我来强行解释一下KM算法 左边一群妹子找汉子,但是每个妹子 ...

  7. 【模板】二分图最大权完美匹配(KM算法)/洛谷P6577

    题目链接 https://www.luogu.com.cn/problem/P6577 题目大意 给定一个二分图,其左右点的个数各为 \(n\),带权边数为 \(m\),保证存在完美匹配. 求一种完美 ...

  8. Solution -「洛谷 P6577」「模板」二分图最大权完美匹配

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w( ...

  9. hdu 1853 Cyclic Tour 最大权值匹配 全部点连成环的最小边权和

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) ...

随机推荐

  1. jmeter测试mysql遇到的问题

    1. 1.防火墙未关 错误: Communications link failure The last packet sent successfully to the server was 0 mil ...

  2. 神经网络之 Batch Normalization

    知乎 csdn Batch Normalization 学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50866313 作者:hjimce ...

  3. Confluence 6 € 欧元字符集不能正常显示

    € (euro) 标记 是一个 3 字节字符,在 (UTF-8)中这个字符被表示为 0xE2, 0x82, 0xAC. 有时候,你的系统中没有设置所有的地方为相同的字符集的时候(Confluence, ...

  4. 【Web】servlet、filter和listener

    一般地,servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是:context-param -> listener -> filter -&g ...

  5. doy09 文件处理,拷贝文件

    一\在python中打开文件,得到文件语句并赋值给一个变量 f=open('a.txt','r',encoding='utf-8'))  默认打开模式就为r: 2.通过句柄对文件进行操作 data=f ...

  6. maven添加镜像与常用配置

    maven解压后conf文件夹有个 settings.xml 在这个文件中可以配置我们的maven 配置镜像: 找到<mirrors></mirrors>找到这个节点在节点中添 ...

  7. Nginx详解七:Nginx基础篇之Nginx官方模块

    Nginx官方模块 --with-http_stub_status_module:Nginx的客户端状态,用于监控连接的信息,配置语法如下:配置语法:stub_status;默认状态:-配置方法:se ...

  8. 怎样在win7 IIS中部署网站

    怎样在win7 IIS中部署网站? IIS作为微软web服务器的平台,可以轻松的部署网站,让网站轻而易举的搭建成功,那么如何在IIS中部署一个网站呢,下面就跟小编一起学习一下吧. 第一步:发布IIS文 ...

  9. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  10. MyBatis - 4.动态SQL

    动态 SQL是MyBatis强大特性之一.极大的简化我们拼装SQL的操作. 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似. MyBatis 采用功能强大的基于 OGNL ...