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. Unity Shader实现各种进度条

    1.圆形进度条shader Shader "ProgressBar360" { Properties { _BGTex("Background Texture" ...

  2. C++ 输出缓冲区的管理

    在C++中,每个I/O对象管理一个缓冲区,用于存储程序读写的数据.本文将对输出缓冲区的管理进行简单的讲解. 举一个简单的例子: myOs << "Please enter a v ...

  3. Java实现断点续传。

    http://www.cnblogs.com/liaojie970/p/5013790.html

  4. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  5. 一 梳理 从 HDFS 到 MR。

      MapReduce 不仅仅是一个工具,更是一个框架.我们必须拿问题解决方案去适配框架的 map 和 reduce 过程   很多情况下,需要关注 MapReduce 作业所需要的系统资源,尤其是集 ...

  6. OpenCV【2】---读取png图片显示到QT label上的问题

    问题一:   操作图片test.png是一个365x365的PNG图片   通过OpenCV自带的GUI显示出来图像是没问题的,例如以下操作代码所看到的: QStringfileName=QFileD ...

  7. 如何测试WCF Rest

    使用SoapUI 1.新建一个rest项目 2.双击上图中的Request1 查询的时候,Method选择post resource的地方要调整到对应的方法 查询的内容是用json格式发送 查询的的结 ...

  8. thinkphp跨模块调用

    thinkphp跨模块调用 跨模块调用模板 return $view->fetch('admin@user/add'); 全路径模板调用: return $view->fetch(APP_ ...

  9. zzuli--1812--sort(模拟水题)

    1812: sort Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 158  Solved: 30 SubmitStatusWeb Board Des ...

  10. 在spring-mybatis.xml 中配置pagehelper

    maven导包:<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</ ...