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算法目 ...
随机推荐
- mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样
Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- rocketmq消费队列代码
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(Constant.operationLogGroup); try { consum ...
- iOS开发人员:事实上你还有非常多东西须要学
iOS 新特性总结(since iOS6) iOS 6 1.废除viewDidUnLoad 收到内存警告须要到didReceiveMemoryWarning中处理 [小技巧] -(void)didRe ...
- c中常用的关键字static const volatile
在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数 ...
- [读书笔记]《没人会告诉你的PPT真相》
这本书分了三部分.第一部分偏重于基础技能,其中分为三部分,打印.放映.保存.第二部分是进阶,分为模板下载.模板修改.增加自定义页面等.第三部分是打造商业范的PPT,分为商业范的特征,具体技能体现(重复 ...
- [办公自动化]计算机突然断电,微软office文档(有asd文件)如何恢复?
今天同事使用office软件时,突然故障.结果他忙了半天的word文档内容都找不见了. 经过查找,在其硬盘根目录找到了asd文档. 但是用当前版本的word和高版本的word软件都无法打开. 又查找了 ...
- 队列,管道,manager模块
###生产者消费者关系### 主要是解耦(高内聚,低耦合),借助队列来实现生产者消费者 模型 栈:先进后出(First In Last Out 简称:FILO) 队列:先进先出(First In Fi ...
- Lightoj 1018 - Brush (IV)
1018 - Brush (IV) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...
- i节点,容易被人遗忘的节点
部分内容转自点击打开链接 点击打开链接 前段时间做了RHCE的一道题,是iSCSi的,后来在挂载的时候说是磁盘被占用.当时资料找了很多结果还是没有找到解决方法.反倒是发现了这个inode,也是关于被占 ...