Going Home(回家)(标签:二部图,匈牙利算法,KM算法)

题目描述

在网格地图上,有n个男人和n个房屋。 在每个单位时间内,每个小人都可以水平或垂直移动一个单位步长到相邻的点。 对于每个小人,您需要为他移动的每一步支付$ 1的旅行费,直到他进入房屋。 每个房子只能容纳一个小人。

您的任务是计算您需要支付的最低金额,以便将这n个小人送入这n个不同的房子。 输入是方案图,“.”表示空白处,“ H”表示该点上的房屋,而“ m”表示该点上有一个小人。

您可以将栅格地图上的每个点都视为一个很大的正方形,因此它可以同时容纳n个矮个子。 同样,如果一个小男人跨进带有房屋的网格而不进入该房屋也可以。

Input

输入中有一个或多个测试用例。 每种情况都从给出两个整数N和M的行开始,其中N是地图的行数,M是列数。 输入的其余部分将是描述地图的N行。 您可以假设N和M都在2到100之间(含2和100)。 地图上的“ H”和“ m”数量相同; 最多将有100所房屋。 N和M的输入将以0 0终止。

Output

对于每个测试用例,需要输出一个单个整数,这是您需要付的最小金额(以美元为单位)。

Sample Input

2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
0 0

Sample Output

2
10
28

解题思路

对于此题,看起来十分复杂,没有思路,但是如果你了解二部图以及相关算法,这个题目可以直接套模板解决。我在网络上经过了仔细的查找,发现两篇不错的博文,使用了简单易懂的例子,讲的特别清晰,如下:

本题目需要用到的是KM算法,但是,其基础是匈牙利算法,所以,如果大家不理解匈牙利算法应该先看第一篇博文。

上文中,讲解KM算法的那篇博文里,用的是找对象的例子,匹配原则是好感度尽可能大,此题目的匹配原则是回家的花费尽可能少,所以需要在博文中给出的算法模板中稍作修改,即可使用。

修改的第一个地方:

// 每个女生的初始期望值是与她相连的男生最大的好感度
for (int i = ; i < N; ++i) {
ex_girl[i] = love[i][];
for (int j = ; j < N; ++j) {
ex_girl[i] = max(ex_girl[i], love[i][j]);
}
} ------改为------ // 改为取最小值
for (int i = ; i < N; ++i) {
ex_girl[i] = love[i][];
for (int j = ; j < N; ++j) {
ex_girl[i] = min(ex_girl[i], love[i][j]);
}
}

修改的第二个地方:

for (int j = ; j < N; ++j) {
// 所有访问过的女生降低期望值
if (vis_girl[j]) ex_girl[j] -= d; // 所有访问过的男生增加期望值
if (vis_boy[j]) ex_boy[j] += d;
// 没有访问过的boy 因为girl们的期望值降低,距离得到女生倾心又进了一步!
else slack[j] -= d; ------改为------ for (int j = ; j < N; ++j) {
// 改为增加
if (vis_girl[j]) ex_girl[j] += d; // 所有访问过的减少
if (vis_boy[j]) ex_boy[j] -= d;
// 没有访问过的增加
else slack[j] += d;

经过以上两个地方的i修改,就成了求解最小期望和的模板,与此题目相适应,套一下模板即可。源代码戳下面链接即可,有完整注释~

源代码

~~~Code~~~

C++ 11新标准实现POJ No.2195-GoingHome的更多相关文章

  1. C++ 11新标准实现POJ No.1002-487-3279

    487-3279(重复的电话号码查询)(标签:优先队列,哈希表) 题目描述 企业喜欢用容易被记住的电话号码.让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语.例如,你需要给滑铁卢大学 ...

  2. C++ 11新标准实现POJ No.1001-Exponentiation

    Exponentiation(高精度幂计算)(标签:链表,字符串,快速幂计算) 题目描述 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要你解 ...

  3. C++11新标准学习

    <深入理解C++11:C++11新特性解析与应用> <华章科技:深入理解C++11:C++11新特性解析与应用>一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中 ...

  4. C++11新标准:nullptr关键字

    一.nullptr的意义 1.NULL在C中的定义 #define NULL (void*)0 2.NULL在C++中的定义 #ifndef NULL #ifdef __cplusplus #defi ...

  5. C++11新标准:decltype关键字

    一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型 ...

  6. C++11新标准:auto关键字

    一.auto意义 编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然后要做到这一点并非那么容易.为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能 ...

  7. c++11新标准for循环和lambda表达式

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  8. 关注C++细节——C++11新标准之decltype的使用注意

    c++11新特性--decltype decltype是C++11加入的一个新的keyword,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式 ...

  9. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

随机推荐

  1. Essay写作如何提升自己的辩驳水平?

    辩证思维在英文写作上的表现方式有许多种,今天来讲讲Counterargument&Rebut,广泛用于英文写作和口语辩论.其作用就是通过辩驳和你论点相反的意见,来突出自己的论点更正确. 话说衡 ...

  2. 最简单的前端获取后台的json值(后台怎么返回一个json对象到前台)

    (说一下这个外部包jackson一般不用了,现在大家都用马云儿子的FastJson 下面服务器代码我就不改了大家随意用什么外部包)2019.1.14日改 我使用了外部包jackson(杰克逊哈哈哈啊) ...

  3. 吴裕雄--天生自然C++语言学习笔记:C++ 异常处理

    异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw ...

  4. Python MySQL Join

    章节 Python MySQL 入门 Python MySQL 创建数据库 Python MySQL 创建表 Python MySQL 插入表 Python MySQL Select Python M ...

  5. python+selenium 发送邮件

    import time from selenium import webdriver from selenium.webdriver import ChromeOptions from seleniu ...

  6. POJ - 1321 棋盘问题(简单搜索)

    题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方 ...

  7. POJ 1039:Pipe 计算几何

    Pipe Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9773   Accepted: 2984 Description ...

  8. 自定义环形进度条RoundProgressBar

    一.效果图: Canvas画圆环说明: 圆环宽度不必在意,只是画笔宽度设置后达到的效果. 二.实现步骤 1.自定义View-RoundProgressBar 2.设置属性resources(decle ...

  9. git使用代理

    在使用git科隆一个repo的时候,因为这个repo的子模块是托管在google上的,还是因为gfw导致子模块科隆不下来 只好使用代理了,那么怎么配置git使用代理呢 代码如下 因为我用的是ss所以这 ...

  10. Activity LauchMode设置

    lauchMode: standard:       标准模式,每次调用startActivity()方法就会产生一个新的实例. singleTop:       如果已经有一个实例位于Activit ...