poj 2195 Going Home (km算法)
题目链接:
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算法)的更多相关文章
- poj 2195 KM算法
题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...
- 【POJ 2195】 Going Home(KM算法求最小权匹配)
[POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ - 2195 Going Home 【KM】
题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4158 Accepted: 1777 Descr ...
- poj 3565 uva 1411 Ants KM算法求最小权
由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...
- (网络流 匹配 KM) Going Home --poj -- 2195
链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/D 有n个人有n栋房子,每栋房子里能进一个人,但每走一格 ...
- poj - 3686 The Windy's (KM算法)
题意:n个订单和m个生产车间,每个订单在不同的车间生产所需要的时间不一样,并且每个订单只能在同一个车间中完成,直到这个车间完成这个订单就可以生产下一个订单.现在需要求完成n个订单的平均时间最少是多少. ...
- KM poj 2195
题意:给出一个地图,地图上有人和房子,问如何分配哪个人去哪个房子,走的路最短? 这道题是个完备匹配的情况下,问怎么才能走的路最少,可以用KM来做. 只不过KM算法是用来求解最大最优值,所以我们得改一下 ...
- poj 2195 二分图带权匹配+最小费用最大流
题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...
随机推荐
- httpclient请求去掉返回结果string中的多余转义字符
public String doGet() { String uriAPI = "http://XXXXX?str=I+am+get+String"; String result= ...
- FM算法及FFM算法
转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...
- 【转】C++函数的重载、覆盖和隐藏区别
网上看到的关于C++函数的重载.覆盖和隐藏区别的回答,如下(其内容来源于C++面试宝典中一道题目): a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:( ...
- Robotframework集成jenkins执行用例
Robotframework+jenkins配置 假设我们完成了一个模块的用例设计,可是想晚上9点或凌晨运行,这时候该怎么实现呢?jenkins可以很好解决我们的疑难. Jenkins安装 这里简单说 ...
- Linux登录自动切换root账户与历史命令优化
1:当我们Linux系统优化完成,会使用oldboy用户远程连接CRT登录,每次连接都需要使用sudo su - 或者su - 输入密码登录,请问如何在CRT连接的时候自动的切换到root账户,(提示 ...
- HiWorkV1.3版震撼公布,今日起正式公开測试!
今天HiWork迎来了公开測试和V1.3大版本号更迭,HiWork集成的机器人达到20种,未读消息提醒亦可从不同维度进行设置,不断变好真是件振奋人心的事儿呢. 在这个看重颜值(kan lian)的互联 ...
- Android签名机制之---签名验证过程具体解释
一.前言 今天是元旦,也是Single Dog的嚎叫之日,仅仅能写博客来祛除寂寞了,今天我们继续来看一下Android中的签名机制的姊妹篇:Android中是怎样验证一个Apk的签名. 在前一篇文章中 ...
- js常用的正则表达操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——编辑功能
本节我们会接着上节课的内容,继续来完成使用Angular来创建简单的笔记存储应用,上一节课,我们完成了笔记的展示功能,本节课,我们来完成编辑功能. 编辑主要是两个功能:编辑现有的笔记以及创建新笔记.首 ...
- ZOJ 3691 Flower(最大流+二分)
Flower Time Limit: 8 Seconds Memory Limit: 65536 KB Special Judge Gao and his girlfriend's ...