hdoj--1533--Going Home(KM)
Going Home
Total Submission(s): 3787 Accepted Submission(s): 1944
step he moves, until he enters a house. The task is complicated with the restriction that each house can accommodate only one little man.
Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates
there is a little man on that point.

You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.
map. You may assume both N and M are between 2 and 100, inclusive. There will be the same number of 'H's and 'm's on the map; and there will be at most 100 houses. Input will terminate with 0 0 for N and M.
2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
0 0
2
10
28
n*m的图中,m是人在的位置,H是房子,一个房子住一个人,求使得所有人到房子中 最少距离,
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f
int lx[110],ly[110];
int map[110][110];
bool visx[110],visy[110];
int slock[110];
int match[110];
int nx,ny;
int N,M,m_cnt,h_cnt;
char str[110][110];
int dis(int x1,int y1,int x2,int y2)
{
return abs(x1-x2)+abs(y1-y2);
}
struct node
{
int x,y;
};
node m[110],h[110];
void getMap()
{
memset(str,'\0',sizeof(str));
m_cnt=h_cnt=0;
for(int i=0;i<N;i++)
{
scanf("%s",str[i]);
for(int j=0;j<M;j++)
{
if(str[i][j]=='m')
{
m_cnt++;
m[m_cnt].x=i;
m[m_cnt].y=j;
}
if(str[i][j]=='H')
{
h_cnt++;
h[h_cnt].x=i;
h[h_cnt].y=j;
}
}
}
int k=m_cnt;
nx=ny=k;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=k;j++)
{
int d=dis(h[i].x,h[i].y,m[j].x,m[j].y);
map[i][j]=-d;
}
}
}
int DFS(int x)
{
visx[x]=true;
for(int y=1;y<=ny;y++)
{
if(visy[y]) continue;
int t=lx[x]+ly[y]-map[x][y];
if(t==0)
{
visy[y]=true;
if(match[y]==-1||DFS(match[y]))
{
match[y]=x;
return 1;
}
}
else if(t<slock[y])
slock[y]=t;
}
return 0;
}
void KM()
{
memset(match,-1,sizeof(match));
memset(ly,0,sizeof(ly));
for(int x=1;x<=nx;x++)
{
lx[x]=-INF;
for(int y=1;y<=ny;y++)
lx[x]=max(lx[x],map[x][y]);
}
for(int x=1;x<=nx;x++)
{
for(int y=1;y<=ny;y++)
slock[y]=INF;
while(1)
{
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
if(DFS(x)) break;
int d=INF;
for(int i=1;i<=ny;i++)
{
if(!visy[i]&&slock[i]<d)
d=slock[i];
}
for(int i=1;i<=nx;i++)
{
if(visx[i])
lx[i]-=d;
}
for(int i=1;i<=ny;i++)
{
if(visy[i])
ly[i]+=d;
else
slock[i]-=d;
}
}
}
int ans = 0;
for(int i = 1;i <= ny; i++)
ans += map[match[i]][i];
printf("%d\n",-ans);
}
int main()
{
while(scanf("%d%d",&N,&M),N||M)
{
getMap();
KM();
}
return 0;
}
hdoj--1533--Going Home(KM)的更多相关文章
- hdoj--3488--Tour(KM)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submi ...
- HDU 1533 Going Home (最小费用流)
题意: 一个矩阵n*m,其中有k个房子和k个人,k个人分别必须走到任意一个房子中(匹配),但是权值就是长度(非欧拉距离),求匹配完的权之和. 思路: 建图方法是,首先将k个人和k个房子分别抽出来到集合 ...
- 【HDU 1533】 Going Home (KM)
Going Home Problem Description On a grid map there are n little men and n houses. In each unit time, ...
- HDU 1533 Going Home(KM完美匹配)
HDU 1533 Going Home 题目链接 题意:就是一个H要相应一个m,使得总曼哈顿距离最小 思路:KM完美匹配,因为是要最小.所以边权建负数来处理就可以 代码: #include <c ...
- 【UVA 1411】 Ants (KM)
Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- 奔小康赚大钱(km)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDOJ.1113 Word Amalgamation(map)
Word Amalgamation 点我挑战题目 点我一起学习STL-MAP 题意分析 给出字典.之后给出一系列======乱序======单词,要求你查字典,如过这个乱序单词对用有多个有序单词可以输 ...
- HDOJ.2094 产生冠军(map)
产生冠军 点我挑战题目 点我一起学习STL-MAP 题意分析 给出n组数据,代表a打败了b,让判断根据这n组数据是否能判断出来产生了冠军.一开始以为这道题很难,其实用map可以应付. 大原则,赢了的人 ...
- POJ 1486 Sorting Slides (KM)
Sorting Slides Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2831 Accepted: 1076 De ...
随机推荐
- jquery中的left和top
left 和 top /*1. 获取元素基于定位容器的位置*/ /*返回的是对象 属性 left top */ var position = $('.inner').position(); conso ...
- ThinkPHP3.2.3对数据的添、删、改、查(CURD)
对数据的添加: public function form() { parent::common(); $obj = D('Leave'); if (IS_POST) { $data = I('post ...
- Deutsch lernen (05)
1. die Wahrheit, -en 真理: - 真言,实情 Wir sollen die Wahrheit festhalten. 坚持:紧握 Im Wein liegt Wahrheit. ...
- QS之force(2)
Examples 1) Force input1 to 0 at the current simulator time. force input1 0 2) Force the fourth elem ...
- 安卓代码迁移:Make.exe: *** [libs/armabi-v7a/gdbserver] Error 1
解决办法1:安装ndk和eclipse修改为x86操作系统 解决办法2:降低更换NDK版本
- Arduino ULN2009驱动步进电机
一.实物图 二.例子代码 注:代码来自老外 http://www.4tronix.co.uk/arduino/Stepper-Motors.php 功能:控制电机正反转 // This Arduino ...
- (转) OpenLayers3基础教程——加载资源
概述: 本节讲述如何在Ol3中加载wms图层并显示到地图中. Ol3下载: 你可以在OL官网去下载,下载地址为http://openlayers.org/download/,也可以去我的百度云盘下载, ...
- 微信jssdk图片上传
一.html页面如下: <div class="weui-cell"> <div class="weui-cell__hd"></ ...
- react工具库
采用了react框架后,需要找到一些常用的库,常见的需求比如: 1)react生成二维码 2)react的轮播banner图 随着react的社区的壮大,以上的需求都有专门的库帮我们做这个: 1)re ...
- jQuery实现菜单全选/不选
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...