题目链接:

  http://poj.org/problem?id=2195

解题思路:

  把man和home都提取出来,然后算出每个man和home的距离算出来,然后建立匹配图,套用km算法的模板,求最小权值匹配,km模板一般是求最大权匹配,求最小的话,一般是取负,当然如果感觉取负逼格太low,也可以用下面的办法,改进模板。

代码:

 //写的代码太菜,不懂建立匹配图的时候为什么下表从零开始就会使劲wa,但是改成1就会ac,有看出来的小伙伴们请大声说出来,跪谢!!!!!
//KM算法求完备匹配下的最小权匹配
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std; #define maxn 110
#define INF 0x3f3f3f3f
int map[maxn][maxn]/*匹配图*/;
int used[maxn]/*x与y的匹配值*/;
int s[maxn]/*修改量*/;
int n, m;
int lx[maxn], ly[maxn];/*顶标*/
int visx[maxn], visy[maxn]; struct node
{
int x, y;
void init(int xx, int yy)
{
x = xx;
y = yy;
}
}; int Fas(int x, int y)
{
if (x > y)
return x - y;
return y - x;
}
int find (int x)
{//匈牙利算法,增广路经,扩大相等子图
visx[x] = ;
for (int i=; i<n; i++)
{
if (!visy[i] && lx[x]+ly[i] == map[x][i])
{
visy[i] = ;
if (!used[i] || find(used[i]))
{
used[i] = x;
return ;
}
}
else
//s[i] = min (s[i], lx[x] + ly[i] - map[x][i]);
//最大权匹配
s[i] = min (s[i], map[x][i] - (lx[x] + ly[i]));//更新修改值,保证最小,使求得的结果最优
}
return ;
}
int KM()
{
memset (used, , sizeof(used));
memset (ly, , sizeof(ly));
for (int i=; i<n; i++)//初始化顶标
lx[i] = INF;//lx[i] = 0;最大权匹配 for (int i=; i<n; i++)
for (int j=; j<n; j++)
lx[i] = min(lx[i], map[i][j]); for (int i=; i<n; i++)
{
for (int j=; j<n; j++)
s[j] = INF;
while ()
{
memset (visx, , sizeof(visx));
memset (visy, , sizeof(visy)); if (find(i))
break; int num = INF;
for (int j=; j<n; j++)
if (!visy[j])//
num = min (num, s[j]); for (int j=; j<n; j++)
{
if (visx[j])
lx[j] += num;//lx[j] -= num;最大权匹配
if (visy[j])
ly[j] -= num;//ly[j] += num;最大权匹配
else
s[j] -= num;
}
}
}
int res = ;
for (int i=; i<n; i++)
res += map[used[i]][i];
return res; }
int main ()
{
char str[maxn];
int a, b;
node home[maxn], man[maxn];
while (scanf ("%d %d", &a, &b), a+b)
{
n = m = ;
memset (map, , sizeof(map)); for (int i=; i<a; i++)
{
scanf ("%s", str);
for (int j=; str[j]; j++)
{
if (str[j] == 'H')
home[n++].init(i, j);
if (str[j] == 'm')
man[m++].init(i, j);
}
}
for (int i=; i<n; i++)
for (int j=; j<m; j++)
map[i][j] = Fas(home[i].x , man[j].x) + Fas(home[i].y , man[j].y);
printf ("%d\n", KM());
}
return ;
}

poj 2195 Going Home (km算法)的更多相关文章

  1. poj 2195 KM算法

    题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...

  2. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. POJ - 2195 Going Home 【KM】

    题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...

  4. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Descr ...

  5. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  6. (网络流 匹配 KM) Going Home --poj -- 2195

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/D 有n个人有n栋房子,每栋房子里能进一个人,但每走一格 ...

  7. poj - 3686 The Windy's (KM算法)

    题意:n个订单和m个生产车间,每个订单在不同的车间生产所需要的时间不一样,并且每个订单只能在同一个车间中完成,直到这个车间完成这个订单就可以生产下一个订单.现在需要求完成n个订单的平均时间最少是多少. ...

  8. KM poj 2195

    题意:给出一个地图,地图上有人和房子,问如何分配哪个人去哪个房子,走的路最短? 这道题是个完备匹配的情况下,问怎么才能走的路最少,可以用KM来做. 只不过KM算法是用来求解最大最优值,所以我们得改一下 ...

  9. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

随机推荐

  1. httpclient失败重连机制

    HttpClient 底层会默认超时自动重发3次,DefaultHttpRequestRetryHandler源码 /**     * Create the request retry handler ...

  2. ubuntu 16.04上安装php5.6

    php --ini 按下面的步骤,在ubuntu 16.04上面安装成功了 php5.6 dpkg -l | grep php| awk '{print $2}' |tr "\n" ...

  3. ln 软连接 & 硬连接

    创建软连接的方式 #ln -s soure /file object 创建软连接是连接文件本身,可以跨分区建立软连接,不会应为不同分区而出现不能使用的问题. 在创建软连接的文件中,修改一处文件另一处同 ...

  4. centos Crontab

    minute   hour   day   month   week   command     顺序:分 时 日 月 周 命令 第1列分钟1-59第2列小时1-23(0表示子夜)第3列日1-31第4 ...

  5. asp.net 实现搜索站内搜索功能

    首先有index和search 两个页面 index页面中有textbox1和button1两个控件 双击button1控件添加代码: protected void Button1_Click(obj ...

  6. ORA-09817

    连接数据库的时候报:ORA-09817:write to audit file,在网上搜索了下,发现时oracle安装目录下面的磁盘空间不够,有不少人给出了解决办法,下面即是一例: 连接oracle  ...

  7. 【Selenium】HTML/XML/XPATH基础

    Html超文本标记语言 网页上单击右键→查看源文件/查看源代码 Html基本结构 <html>               为文档根元素,所有元素都在内部进行 <head>   ...

  8. AutoIT: 返回文件目录下所有的文件名,包括子文件

    _filelist("D:\Snagit 10") Func _filelist($searchdir) ;;;函数名(形参) $search = FileFindFirstFil ...

  9. UI:SQL语句

    sql语句一般不区分大小写,但是我们默认的是关键字要大写是一种好的习惯,比如SELECT 等效于 select.,但是表中的字段,属性区分大小写.Oracle 数据库是一种区分大小写的. Sql语句命 ...

  10. 解决weblogic页面和控制台乱码问题

    转自:https://blog.csdn.net/u010995831/article/details/53283746 之前一直有碰到weblogic各种乱码问题,要不就是页面乱码,要不就是控制台乱 ...