HDU--1533--Going Home--KM算法
Going Home
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
#include <iostream>
#include <cstring>
#define MAX (1<<30)
#define MIN -MAX
using namespace std;
struct ssss
{
int x,y;
};
ssss s1[111],s2[111];
int n,m,l1,l2,map[111][111];
int rode[111],r[111];
bool vx[111],vy[111];
int sx[111],sy[111];
int dfs(int x)
{
vx[x]=1; //标记增广路左边已訪问的点
int i,j,k,l;
for(i=0;i<l2;i++)
if(!vy[i])
{
k=sx[x]+sy[i]-map[x][i];
if(k==0)
{
vy[i]=1;//訪问它再标记已訪问
if(rode[i]==-1||dfs(rode[i])) //假设右边的点没有匹配或者有匹配(继续用他的匹配点继续找)
{
rode[i]=x; //记录右边点匹配到的左边点的序号
return 1;
}
}else if(r[i]>k)r[i]=k; //记录右端点没訪问的边的最小差值。用来导入
}
return 0;
}
int Dinic()
{
int i,j,k,l;
memset(sy,0,sizeof(sy)); //标记右端点权值
memset(rode,-1,sizeof(rode)); //右端点匹配点初始化为-1
for(i=0;i<l1;i++)
{
sx[i]=MIN;
for(j=0;j<l2;j++)
sx[i]=max(sx[i],map[i][j]); //左端点权值取最大的边的值
}
for(i=0;i<l1;i++)
{
for(j=0;j<l2;j++)r[j]=MAX;
while(1)
{
memset(vx,0,sizeof(vx)); //訪问标记初始化
memset(vy,0,sizeof(vy));
if(dfs(i))break; //匹配到了就结束
k=MAX;
for(j=0;j<l2;j++)
if(!vy[j])k=min(k,r[j]); //不然导入差值最小的边(这是保证匹配的总值从最大逐渐减小)
for(j=0;j<l1;j++)
if(vx[j])sx[j]-=k; //左端点权值减小
for(j=0;j<l2;j++)
if(vy[j])sy[j]+=k; //右端点权值曾加
//这样导入了边之后其它匹配不变x+y=(x-k)+(y+k)
}
}
for(i=k=0;i<l2;i++)
k+=map[rode[i]][i];
return -k;
}
int bb(int x)
{
return x>0?x:-x;
}
int main (void)
{
int i,j,k,l;
char c;
while(cin>>n>>m&&n)
{
l1=l2=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>c;
if(c=='m')
{
s1[l1].x=i;
s1[l1].y=j;
l1++;
}
if(c=='H')
{
s2[l2].x=i;
s2[l2].y=j;
l2++;
}
}
for(i=0;i<l1;i++)
for(j=0;j<l2;j++)
{
k=bb(s1[i].x-s2[j].x)+bb(s1[i].y-s2[j].y);
map[i][j]=(k<0?k:-k);
}
cout<<Dinic()<<endl;
}
return 0;
}
HDU--1533--Going Home--KM算法的更多相关文章
- hdu 1533 Going Home (KM)
Going HomeTime Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
- hdu 2426 Interesting Housing Problem 最大权匹配KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2426 For any school, it is hard to find a feasible ac ...
- 【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 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU 2255 奔小康赚大钱 (KM算法 模板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 3488(KM算法||最小费用最大流)
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submis ...
- HDU:2255-奔小康赚大钱(KM算法模板)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Mem ...
随机推荐
- 解决Ubuntu root账户的问题
问题的提出:在Linux环境下,许多操作需要有管理员权限才能进行.如果没有root权限,就连基本的文件拷贝操作都只能在用户文件夹下进行,而对于Ubuntu系统,安装时是没有设定root帐号的,那么怎样 ...
- Jmeter java协议配置文件导入
一. 方法一 通过ClassLoader获取当前路径,想在java脚本里读取druid.properties,路径如下 apache-jmeter --bin --druid.properties 相 ...
- ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER003_播放mp3
一.简介 1.在onListItemClick中实现点击条目时,跳转到PlayerActivity,mp3info通过Intent传给PlayerActivity 2.PlayerActivity通过 ...
- 对于Unicode编码在js中和html中
1.对于Unicode在js中 var a="\u9102WQW121" 中"\"是需要转义的,直接在页面输出的效果
- 【POJ】2823 Sliding Window
单调队列. /* 2823 */ #include <iostream> #include <sstream> #include <string> #include ...
- ☀【移动】UC极速模式
UC浏览器的部分版本默认是“极速”模式,有何办法能控制UC自动改变其浏览模式? √http://www.zhihu.com/question/20582949 关于UC极速模式下访问网站错乱 √htt ...
- Android学习之路——简易版微信为例(二)
1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样, ...
- SharePoint 2010 PowerShell 系列 之 备份、还原、部署 .WSP
转:http://www.cnblogs.com/Fengger/archive/2012/08/24/2654093.html PowerShell系列目录 最近在部署测试环境,就顺便把PowerS ...
- Ubuntu 安装Chrome步骤
一.添加PPA 从Google Linux Repository(http://www.google.com/linuxrepositories/)下载安装Key,或把下面的代码复制进终端,回车,需要 ...
- Spring MVC Controller配置方式
第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置 以上配置,访问/hello.do就会寻找ID为/hello.do的Bean,此类方式仅适用小型的应用系统 第二种 为UR ...