POJ 2195 Going Home(KM算法模板)
题目链接:http://poj.org/problem?id=2195
题目大意:
给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。
man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。
解题思路:
将每个man和house建边求最佳匹,KM模板。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e2+;
const int INF=0x3f3f3f3f; int ny,nx;
int lx[N],ly[N],link[N],slack[N],g[N][N];
bool visx[N],visy[N]; struct node{
int x,y;
node(){}
node(int x,int y):x(x),y(y){}
}a[N],b[N]; bool dfs(int x){
visx[x]=true;
for(int y=;y<ny;y++){
if(visy[y]) continue;
int tmp=lx[x]+ly[y]-g[x][y];
if(tmp==){
visy[y]=true;
if(link[y]==-||dfs(link[y])){
link[y]=x;
return true;
}
}
else if(slack[y]>tmp)
slack[y]=tmp;
}
return false;
} int KM(){
memset(link,-,sizeof(link));
memset(ly,,sizeof(ly));
for(int i=;i<nx;i++){
lx[i]=-INF;
for(int j=;j<ny;j++){
if(g[i][j]>lx[i])
lx[i]=g[i][j];
}
}
for(int x=;x<nx;x++){
for(int i=;i<ny;i++){
slack[i]=INF;
}
while(true){
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
if(dfs(x)) break;
int d=INF;
for(int i=;i<ny;i++){
if(!visy[i]&&slack[i]<d)
d=slack[i];
}
for(int i=;i<nx;i++){
if(visx[i])
lx[i]-=d;
}
for(int i=;i<ny;i++){
if(visy[i])
ly[i]+=d;
}
}
}
int ans=;
for(int i=;i<ny;i++){
if(link[i]!=-)
ans+=g[link[i]][i];
}
return ans;
} int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
if(n==&&m==) break;
nx=ny=;
char str[N];
for(int i=;i<n;i++){
scanf("%s",str);
for(int j=;j<m;j++){
if(str[j]=='m'){
a[nx++]=node(i,j);
}
else if(str[j]=='H'){
b[ny++]=node(i,j);
}
}
}
for(int i=;i<nx;i++){
for(int j=;j<ny;j++){
g[i][j]=-(abs(a[i].x-b[j].x)+abs(a[i].y-b[j].y));
}
}
printf("%d\n",-KM());
}
return ;
}
POJ 2195 Going Home(KM算法模板)的更多相关文章
- poj 2195 Going Home (km算法)
题目链接: http://poj.org/problem?id=2195 解题思路: 把man和home都提取出来,然后算出每个man和home的距离算出来,然后建立匹配图,套用km算法的模板,求最小 ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- HDU 2255 奔小康赚大钱 (KM算法 模板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- 二分图最大权值匹配 KM算法 模板
KM算法详解+模板 大佬讲的太好了!!!太好了!!! 转载自:http://www.cnblogs.com/wenruo/p/5264235.html KM算法用来求二分图最大权完美匹配. 本文配合该 ...
- poj 2195 最小费用最大流模板
/*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...
- hdu 2255奔小康赚大钱 KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=2255 一,KM算法:(借助这个题写一下个人对km的理解与km模板) KM算法主要是用来求解图的最优匹 ...
- HDU 2255 奔小康,赚钱(KM算法模板)
解决问题的思路: 二部图,正确的匹配,卡费用流,使用KM算法. #include <cstring> #include <algorithm> #include <cst ...
- KM算法模板
大白书P248有证明,此处贴出两种复杂度的方案, n^4 大白书P350 n^3 #include <algorithm> #include <string.h> #inclu ...
- HDU:2255-奔小康赚大钱(KM算法模板)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- hdoj--2255--奔小康赚大钱(KM算法模板)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
随机推荐
- 解题:ZJOI 2013 K大数查询
题面 树套树,权值线段树套序列线段树,每次在在权值线段树上的每棵子树上做区间加,查询的时候左右子树二分 本来想两个都动态开点的,这样能体现树套树在线的优越性.但是常数太大惹,所以外层直接固定建树了QA ...
- HTTP状态码的含义: 200:400:403:404:408:500:503:504
http协议的状态码 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101( ...
- 阿里云上部署了zabbix,突然无法收到报警邮件的解决办法
在阿里云上部署了zabbix,一直能正常接收到zbx发来的报警邮件(报警邮箱是163的),不知是什么原因,突然无法接收到报警邮件了. 但在服务器上手动执行echo "hello"| ...
- P2424 约数和 && 真丶除法分块
P2424 约数和 题目背景 Smart最近沉迷于对约数的研究中. 题目描述 对于一个数X,函数f(X)表示X所有约数的和.例如:f(6)=1+2+3+6=12.对于一个X,Smart可以很快的算出f ...
- [Java] 理解JVM之一:工作机制及基本结构
一.基本结构 类加载器:在 JVM 启动时或在类运行时需要将类的字节码信息加载到 JVM 内存区域中. 执行引擎:负责执行字节码信息中包含的字节码指令,相当于实际机器上的 CPU. 内存区域:也被称为 ...
- Shell记录-Shell脚本基础(六)
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行. 1.命令格式 watch[参数][命令] ...
- python学习笔记2-tuple
tuple: #元组也是List,但是值不能变 a=(') print(a[1]) mysql=(',''root','123456') print(mysql.count('root')) #例子 ...
- python日记---day1
Life is short,Test in python 一.输入输出 1.用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world' print('h ...
- protobuffer
[protobuffer] 1.扩展名为.proto. 2.定义一个协议: 3.定义一个Service: 4.编译器为protoc,使用protoc: 5.style:所有的类型名均CamelCase ...
- javascript 写了个字符串组合的情况
function log() { var i = 0, str = '', args = [].slice.call(arguments); j++; if (isRepeat(args)) { k+ ...