POJ_2195_Going Home
题意:用'H','m','.'作出矩阵,'H'代表房子,'m'代表人,人一次只能水平或者垂直移动到相邻的点,问所有人一共走的步数的最小值。
分析:明显的求二分图最大权匹配。KM算法求得的是最大权匹配,而题中要求的是最小值,所以要将边的权值以其负值储存。
有一点需要注意:link数组(匹配数组)必须初始化为-1,如果初始化为0,则link[0]=0,则默认第0个人与第0个房子匹配,在执行匈牙利算法是就会出错,找到错误的增广路,第一次提交就错在这。
总结:基本能只用KM算法,熟练度还有待增强。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<stdlib.h>
using namespace std;
#define Del(x,y) memset(x,y,sizeof(x))
#define N 105 struct Point
{
int x,y;
};
Point house[N];
Point man[N]; int n,m;
int cnth,cntm;
int lx[N],ly[N],link[N],w[N][N];
bool S[N],T[N];
char grid[N]; int dis(Point a,Point b)
{
return (abs(a.x-b.x)+abs(a.y-b.y));
}
void update()
{
int a=;
for(int i=; i<cnth; i++)
if(S[i])
for(int j=; j<cntm; j++)
if(!T[j])
a=min(a,lx[i]+ly[j]-w[i][j]);
for(int i=; i<cnth; i++)
{
if(S[i])
lx[i]-=a;
if(T[i])
ly[i]+=a;
}
} bool match(int i)
{
S[i]=true;
for(int j=; j<cntm; j++)
if(lx[i]+ly[j]-w[i][j]==&&!T[j])
{
T[j]=true;
if(link[j]==-||match(link[j]))
{
link[j]=i;
return true;
}
}
return false;
} void KM()
{
Del(link,-); ///必须初始化为-1,如果初始化为0,则link[0]=0,则默认第0个人与第0个房子匹配,在执行匈牙利算法是就会出错,找到错误的增广路
for(int i=; i<cnth; i++)
{
lx[i]=ly[i]=;
for(int j=; j<cntm; j++)
lx[i]=max(lx[i],w[i][j]);
}
for(int i=; i<cnth; i++)
for(;;)
{
Del(S,);
Del(T,);
if(match(i))
break;
else
update();
}
} int main()
{
while(~scanf("%d%d",&n,&m)&&n!=)
{
cntm=cnth=;
for(int i=; i<n; i++)
{
scanf("%s",grid);
for(int j=; j<m; j++)
{
if(grid[j]=='H')
{
house[cnth].x=i;
house[cnth].y=j;
cnth++;
}
if(grid[j]=='m')
{
man[cntm].x=i;
man[cntm].y=j;
cntm++;
}
}
}
for(int i=; i<cnth; i++)
for(int j=; j<cntm; j++)
w[i][j]=-dis(house[i],man[j]);
KM();
int ans=;
for(int i=; i<cntm; i++)
ans+=dis(house[link[i]],man[i]);
printf("%d\n",ans);
}
return ;
}
POJ_2195_Going Home的更多相关文章
随机推荐
- 字节序:Big Endian 和 Little Endian
一.字节序 字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序. 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.例如:如果C/C++中的一个int型变量 a 的起始地址是& ...
- Highcharts构建加权平均值图表
Highcharts构建加权平均值图表 加权平均值图表是将图表中多个数据列值.依据加权算法计算获取平均值,并加入生成一个加权折线.在这里,我们直接使用第三方插件Dynamic Weighted Ave ...
- Linux watchdog 6300esb
基本原理: Linux 自带了一个 watchdog 的实现,用于监视系统的执行,包含一个内核 watchdog module 和一个用户空间的 watchdog 程序.内核 watchdog ...
- 图像处理之基础---yuv420及其rgb,bayer, yuv, RGB的相互转换详解
YUV格式解析1(播放器——project2) 根据板卡api设计实现yuv420格式的视频播放器 打开*.mp4;*.264类型的文件,实现其播放. 使用的视频格式是YUV420格式 YUV格式 ...
- [办公自动化]如何让excel图表标签中显示最新值数据
同事做了一张excel图表,希望最新的数据显示数据标签,其他都不显示.并且当单元格的数据新增加时,这个标签要能自动更新. 这里需要用到公式,获取到这个最新值.在b2输入公式=lookup(9e+307 ...
- javascript下将字符类型转换成布尔值
办不到!孙子,我告诉你,这办不到! 比如说, var sb = "false"; alert(!!sb);//结果显示true! 事前是想得很美的: sb == "fal ...
- 第一次PHP面试题
1.标记符title是放在标记符什么之间:head 2.级联样式表文件的扩展名:CSS 3.html中<pre>的作用:pre 元素可定义预格式化的文本 4.mysql_affected_ ...
- ABAP OLE
OLE DATA: excel TYPE ole2_object, workbook TYPE ole2_object, sheet TYPE ole2_object, cell TYPE ole2_ ...
- USACO Section 1.1PROB Your Ride Is Here
题目传送门 不能提交哦 http://www.nocow.cn/index.php/Translate:USACO/ride /* ID: jusonal1 PROG: ride LANG: C+ ...
- 【Poj3126】【BNUOJ3245】Prime Path
http://poj.org/problem?id=3126 https://www.bnuoj.com/v3/problem_show.php?pid=3245 题目鬼图 刚开始看到题目的图觉得这题 ...