题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径。
思路:采用最大权完美匹配
最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。

KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出。否则修改
顶标, 再用匈牙利算法处理, 如此重复。

设二分图的两部分点集分别为 X={X1,X2,…,Xn}X={X1,X2,…,Xn} 和 Y={Y1,Y2,…,Ym}Y={Y1,Y2,…,Ym}, ⟨Xi,Yj⟩⟨Xi,Yj⟩ 的边权为 wij
给两部分点集分别赋点权 {Ai},{Bi}{Ai},{Bi}, 使得 Ai+Bj⩾wij,取等的边的生成子图叫做相等子图。那么相等子图的完美匹配就是最大权匹配。我们需要适当选取权值,使相等子图有完美匹配。
算法步骤:
1.若成功(找到了增广轨),则该点增广完成,进入下一个点的增广
2.若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。
操作为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全 部减去一个常数d,所有在增广轨中的Y方点的标号全部加上一个常数d

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<cstdio>
using namespace std;
const int maxx=105;
const int inf=0x3f3f3f3f;
int linker[maxx];
int lx[maxx],ly[maxx];
char e[maxx][maxx];
int slack[maxx];
int visx[maxx],visy[maxx];
int w[maxx][maxx];
int n,m;
int p;
void init(){p=0;memset(linker,-1,sizeof(linker));memset(e,0,sizeof(e));memset(w,0,sizeof(w));
}int Find(int x){visx[x]=1;for(int y=0;y<p;y++){if(visy[y]==0){int temp=lx[x]+ly[y]-w[x][y];if(temp==0){visy[y]=1;if(linker[y]==-1||Find(linker[y])){linker[y]=x;return 1;}}else{slack[y]=min(slack[y],temp);}}}return 0;
}
int KM(){memset(ly,0,sizeof(ly));for(int i=0;i<p;i++){lx[i]=-inf;}for(int i=0;i<p;i++){for(int j=0;j<p;j++){if(lx[i]<w[i][j]){lx[i]=w[i][j];}}}for(int k=0;k<p;k++){for(int j=0;j<p;j++){slack[j]=inf;}while(true){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));if(Find(k))break;int d=inf;for(int i=0;i<p;i++){if(visy[i]==0){d=min(d,slack[i]);}}for(int i=0;i<p;i++){if(visx[i]==1){lx[i]-=d;}}for(int i=0;i<p;i++){if(visy[i]==1){ly[i]+=d;}else{slack[i]-=d;}}}}int ans=0;for(int i=0;i<p;i++){if(linker[i]!=-1){ans+=-w[linker[i]][i];}}return ans;
}
int main(){while(scanf("%d %d",&n,&m)!=EOF){if(n==0&&m==0)break;init();for(int i=0;i<n;i++){scanf("%s",&e[i]);}int cnt=0,cnt1=0;memset(w,-inf,sizeof(w));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(e[i][j]=='m'){cnt=0;for(int k=0;k<n;k++){for(int t=0;t<m;t++){if(e[k][t]=='H'){w[cnt1][cnt++]=-(abs(i-k)+abs(j-t));}}}cnt1++;}}}p=cnt1;int ans=KM();cout<<ans<<endl;}return 0;
}

poj2195(最大权完美匹配)相关推荐

  1. poj3565(最大权完美匹配)

    题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离! 思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间 ...

  2. HDU3718(最大权完美匹配)

    题意:先给出N个字母,代表要标签:再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值.最后的相似度为最大权值为ans*1.0/n. 最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算 ...

  3. HDU3488(最大权完美匹配)

    题意:有N个城市M单程公路将它们连接起来:要求路路应该包含一个或多个循环a->B->-->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市 ...

  4. HDU2853(最大权完美匹配)

    题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配) 其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边) 这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇.除了 ...

  5. 模板 - KM算法(O(n^3))(二分图最大权完美匹配)

    整理的算法模板合集: ACM模板 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配. 求一种完美匹配的方案,使得最终匹配边的边权之和最大. //Data const ...

  6. poj3686(最小权值完美匹配)

    开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...

  7. HDU1533(最小权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...

  8. HDU2255(最全权完美匹配)

    最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法.当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配.此时问题就转化为二分图最大权完美匹配. ...

  9. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

最新文章

  1. 盘点当下大热的 7 大 Github 机器学习『创新』项目
  2. linux添加域名证书,在Linux服务器上手动安装免费的Let's Encrypt域名证书 - 乐道主机...
  3. 大话PM|产品设计中常被忽视的业务异常
  4. String.format()的使用
  5. 记录---基于BigDecimal的特殊的四舍五入
  6. 加班累到住院,到30岁年薪百万:你所谓的拼命,绝不是职场捷径
  7. 服务器推送_初探 Watermill 构建 Golang 事件驱动程序,SSE 进行 HTTP 服务器推送
  8. 第 4 章 容器 - 030 - 实现容器的底层技术
  9. Linux下通过ODBC连接数据库及ODBC相关操作命令
  10. mysql 修改列格式化_prettytable:像数据库一样格式化输出内容
  11. 第1关:伪分布式环境搭建
  12. c语言中怎么对圆环填充颜色,ps里怎么把圆环填充两种颜色
  13. Jetson nano无法中文输入
  14. 易企秀 背景音乐 下载
  15. 【软件测试】:“用户登录”功能测试用例设计方法
  16. linux 文件打包下载到 Windows
  17. 苹果iOS系统最新市占率统计:iOS 11份额达到52%
  18. 微信公众号python_wechat: 微信 Python SDK,支持微信公众号以及企业号的上行消息及 OAuth 接口...
  19. Android Elevation 无效分析
  20. SpringBoot入门与常用配置

热门文章

  1. 轻松学Pytorch –使用torchvision实现对象检测
  2. 知乎2w人关注,没有工程开发经验的人是怎么找到工作的?
  3. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法
  4. html5--5-15 绘制阴影
  5. 物联网安全领域都有哪些机会?来看看这19家公司都是怎么玩的
  6. POJ 3342 树形DP+Hash
  7. 论工程结构设计的重要性
  8. 【更新】比较智能的爬取姓名
  9. 烂泥:ubuntu 14.04搭建Open***服务器
  10. 陷阱~关于引用类型,请不要模棱两可!