HDU 1533 Going Home

题目链接

题意:就是一个H要相应一个m,使得总曼哈顿距离最小

思路:KM完美匹配,因为是要最小。所以边权建负数来处理就可以

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int MAXNODE = 105; typedef int Type;
const Type INF = 0x3f3f3f3f; struct KM {
int n;
Type g[MAXNODE][MAXNODE];
Type Lx[MAXNODE], Ly[MAXNODE], slack[MAXNODE];
int left[MAXNODE];
bool S[MAXNODE], T[MAXNODE]; void init(int n) {
this->n = n;
} void add_Edge(int u, int v, Type val) {
g[u][v] = val;
} bool dfs(int i) {
S[i] = true;
for (int j = 0; j < n; j++) {
if (T[j]) continue;
Type tmp = Lx[i] + Ly[j] - g[i][j];
if (!tmp) {
T[j] = true;
if (left[j] == -1 || dfs(left[j])) {
left[j] = i;
return true;
}
} else slack[j] = min(slack[j], tmp);
}
return false;
} void update() {
Type a = INF;
for (int i = 0; i < n; i++)
if (!T[i]) a = min(a, slack[i]);
for (int i = 0; i < n; i++) {
if (S[i]) Lx[i] -= a;
if (T[i]) Ly[i] += a;
}
} int km() {
for (int i = 0; i < n; i++) {
left[i] = -1;
Lx[i] = -INF; Ly[i] = 0;
for (int j = 0; j < n; j++)
Lx[i] = max(Lx[i], g[i][j]);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) slack[j] = INF;
while (1) {
for (int j = 0; j < n; j++) S[j] = T[j] = false;
if (dfs(i)) break;
else update();
}
}
int ans = 0;
for (int i = 0; i < n; i++)
ans += g[left[i]][i];
return ans;
}
} gao; const int N = 105;
int n, m;
char str[N]; struct Point {
int x, y;
Point() {}
Point(int x, int y) {
this->x = x;
this->y = y;
}
} hp[N], mp[N]; int dis(Point a, Point b) {
return abs(a.x - b.x) + abs(a.y - b.y);
} int hn, mn; int main() {
while (~scanf("%d%d", &n, &m) && n || m) {
hn = mn = 0;
for (int i = 0; i < n; i++) {
scanf("%s", str);
for (int j = 0; j < m; j++) {
if (str[j] == 'H') hp[hn++] = Point(i, j);
if (str[j] == 'm') mp[mn++] = Point(i, j);
}
}
gao.n = hn;
for (int i = 0; i < hn; i++) {
for (int j = 0; j < mn; j++) {
gao.g[i][j] = -dis(hp[i], mp[j]);
}
}
printf("%d\n", -gao.km());
}
return 0;
}

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

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

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

  2. (step6.3.5)hdu 1281(棋盘游戏——二分图的完美匹配)

    题目大意:本体是中文题.读者可以直接在OJ上看 解题思路: 1)完美匹配:所有的端点都是匹配点 2)对于二分图的完美匹配,我们需要用一个数组来存储匹配点.(而二分图的其他问题(我们则可以直接使用变量来 ...

  3. hdu 1533 Going Home (KM)

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

  4. HDU 1533 Going Home (最大权完美匹配)

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

  5. hdu1533 Going Home km算法解决最小权完美匹配

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

  6. 【HDU 1533】 Going Home (KM)

    Going Home Problem Description On a grid map there are n little men and n houses. In each unit time, ...

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

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

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

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

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

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

随机推荐

  1. Raspberry Pi - 调整你的SD卡分割区的大小

    在使用Win32DiskImager为一张空白的SD卡刷入新的Rasbian系统后,卡上的可用剩余空间并不大, 本人有一张8G的SD卡,但是刷入4.1的Rasbian后,用df -h查看,根目录下的空 ...

  2. [Recompose] Create Stream Behaviors to Push Props in React Components with mapPropsStream

    Rather than using Components to push streams into other Components, mapPropsStream allows you to cre ...

  3. awk条件语句

    条件语句用于在运行操作之前做一个測试.在前面的章节中,我们看到了模式匹配规则的一些演示样例. 模式匹配规则本质上就是影响输入循环的条件表达式. 在这一部分,我们主要就在action中所使用的条件语句进 ...

  4. Android ImageView设置图片原理(下)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 写完上一篇后,总认为介绍的知识点不多,仅仅是一种在UI线程解析载入图片.两种在子线程解析,在UI线程 ...

  5. cigarette

    #include<iostream> using namespace std; int main() { int N; cin>>N; while(N--) { int Who ...

  6. 远程带参数POST访问接口,返回数据

    1. string token = GetRequest.GetString("token"); int customer_id = GetRequest.GetInt(" ...

  7. js生成验证码并验证的登录页面

    <!Doctype html> <html> <head> <meta charset="utf-8"/> <title> ...

  8. 如何在VMware中创建虚拟机

    今天给大家分享如何在VMware中创建虚拟机,具体的教程如下.在这里小编提前下载了Ubuntu14.04桌面系统,为后面在虚拟机中安装Ubuntu14.04桌面系统做准备. 1.从官网上或者直接百度上 ...

  9. 使用python制作二维码

    python-qrcode是个用来生成二维码图片的第三方模块,主要依赖的是 PIL 模块和 qrcode 库.(PIL模块只支持python2.7及以下版本,python3之后无法使用,官方推荐pyt ...

  10. 织梦(dedecms)彩色标签云(tag)随机颜色和字体大小

    1.选择你所要加页面的模板,一般是在首页index.htm 加上如下代码 01 <!-- /下面开始tag标签云 --> 02 <dl class="tbox light& ...