题意:用'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的更多相关文章

随机推荐

  1. Delphi中处理URL编码解码

    Delphi中处理URL编码解码 一.URL简单介绍     URL是网页的地址,比方 http://www.shanhaiMy.com. Web 浏览器通过 URL 从 web server请求页面 ...

  2. Java中的Nested Classes和Inner Classes

    Java中的Nested Classes和Inner Classes Java有嵌套类(Nested Classes)和内部类(Inner Classes)的概念. 嵌套类(Nested Classe ...

  3. karaf增加自己定义log4j的配置

    配置文件: karaf_home/etc/org.ops4j.pax.logging.cfg 增加配置: ### direct log messages to stdout ### log4j.app ...

  4. C# TextBox改变高度的方法(转载)

    最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Text ...

  5. Robot Framework 初学者上手资料

    首先要声明一下这是从http://www.cnblogs.com/yufeihlf/p/5949984.html拷贝的. 在这里只是自己的一个笔记,方便日后添加.修改内容. 总结下Robot Fram ...

  6. P1196 [NOI2002]银河英雄传说(并查集)

    P1196 [NOI2002]银河英雄传说(并查集) 本题关键 用两个一维数组表示了一个稀疏的二维数组. 这两个一维数组一个表示祖先(就是最前面那个),一个表示距离祖先的距离. 并且还有一个关键点是, ...

  7. 【PA 2014】Kuglarz

    [题目链接]            点击打开链接 [算法]            sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数            那么,知道[i,j]这段区间中,藏有球的 ...

  8. 6 Workbook 对象

    6.1 在奔跑之前先学会走路:打开和关闭工作薄 代码清单6.1:一个完整的工作薄批处理框架 '代码清单6.1:一个完整的工作薄批处理框架 Sub ProcessFileBatch() Dim nInd ...

  9. 关于Dubbo中一些小众但很实用的功能

    dubbo功能非常完善,很多时候我们不需要重复造轮子,下面列举一些你不一定知道,但是很好用的功能: 直连Provider 在开发及测试环境下,可能需要绕过注册中心,只测试指定服务提供者,这时候可能需要 ...

  10. jquery autocomplete自动补全

    简单用法: $(function(){ var data = "the People's Republic of China".split(" "); $(&q ...