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算法目 ...
随机推荐
- Java8初体验(二)Stream语法详解(转)
本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com上篇文章Java8初体验(一 ...
- html5开发手机打电话发短信功能
原文:http://www.open-open.com/code/view/1449843459332 在很多的手机网站上,有打电话和发短信的功能,对于这些功能是如何实现的呢.其实不难,今天我们就用h ...
- History(历史)命令用法 15 例
如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...
- day5-WordCount
1. wordcount示例开发 1.1. wordcount程序整体运行流程示意图 map阶段: 将每一行文本数据变成<单词,1>这样的kv数据 reduce阶段:将相同单词的一组k ...
- Angular2.x-服务
heroes之旅HeroesComponent目前正在获取并显示虚假数据. 在本教程重构之后,HeroesComponent将会精益求精并专注于支持视图.用模拟服务进行单元测试也会更容易. 为什么服务 ...
- 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解
说在前头:楼主之前没有不论什么flash开发经验,仅仅是从一次尝试中总结自己的理解和经验而已.假设有写的不正确的地方,欢迎大家指正. 前一段时间尝试想用flash(as3)又一次制作一下之前做的一个游 ...
- Oracle改动字段类型
因为需求变动.现要将一个类型NUMBER(8,2)的字段类型改为 char. 大体思路例如以下: 将要更改类型的字段名改名以备份.然后加入一个与要更改类型的字段名同名的字段(原字段已经改名 ...
- HTML的高富帅
1,前端的内容(组成部分有以下三部分) HTML CSS JS 裸体的人 穿上好看的衣服 ...
- Hibernate 之 Locking
在我们业务实现的过程中,往往会有这样的需求:保证数据访问的排他性,也就是我正在访问的数据,别人不能够访问,或者不能对我的数据进行操作.面对这样的需求,就需要通过一种机制来保证这些数据在一定的操作过程中 ...
- qrcode.react和jquery.qrcode生成二维码
qrcode.react 1.安装 npm install qrcode.react 2.用法(这里用的ant design) import React from 'react'; import QR ...