题意:给出一个地图,地图上有人和房子,问如何分配哪个人去哪个房子,走的路最短?

这道题是个完备匹配的情况下,问怎么才能走的路最少,可以用KM来做。

只不过KM算法是用来求解最大最优值,所以我们得改一下数据,将每个人去房子的路程都改为负数。

最后再得出 -KM()即刻

 #include<cstdio>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<iostream>
using namespace std;
const int maxn=1e2+;
const int inf=0x3f3f3f3f;
int lx[maxn],ly[maxn];
int match[maxn];
int visx[maxn],visy[maxn];
struct node
{
int x,y;
}a[maxn],b[maxn];
int G[maxn][maxn];
int numa,numb;
int dfs(int k)
{
visx[k]=;
for(int i=;i<=numa;i++){
if(!visy[i]&&G[k][i]==lx[k]+ly[i]){
visy[i]=;
if(!match[i]||dfs(match[i])){
match[i]=k;
return ;
}
}
}
return ;
}
int KM()
{
for(int i=;i<=numa;i++){
lx[i]=-inf,ly[i]=;
for(int j=;j<=numa;j++)
lx[i]=max(lx[i],G[i][j]);
}
for(int k=;k<=numa;k++){
while(){
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(dfs(k)) break;
int mn=inf; for(int i=;i<=numa;i++) if(visx[i])
for(int j=;j<=numa;j++) if(!visy[j])
mn=min(mn,lx[i]+ly[j]-G[i][j]);
if(mn==inf) return -;
for(int i=;i<=numa;i++) if(visx[i]) lx[i]-=mn;
for(int i=;i<=numa;i++) if(visy[i]) ly[i]+=mn;
}
}
int ans=;
for(int i=;i<=numa;i++)
if(match[i])
ans+=G[match[i]][i];
return ans;
}
void init()
{
numa=numb=;
memset(match,,sizeof(match));
memset(G,,sizeof(G));
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==&&m==) break;
init();
char t;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
cin>>t;
if(t=='H'){
numa++;
a[numa].x=i;
a[numa].y=j;
}
else if(t=='m'){
numb++;
b[numb].x=i;
b[numb].y=j;
}
}
}
for(int i=;i<=numa;i++){
int x1=a[i].x,y1=a[i].y;
for(int j=;j<=numb;j++){
int x2=b[j].x,y2=b[j].y;
int w=fabs(x1-x2)+fabs(y1-y2);
G[i][j]=-w;
}
}
printf("%d\n",-KM());
}
return ;
}

KM poj 2195的更多相关文章

  1. 【POJ 2195】 Going Home(KM算法求最小权匹配)

    [POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  2. poj 2195 二分图带权匹配+最小费用最大流

    题意:有一个矩阵,某些格有人,某些格有房子,每个人可以上下左右移动,问给每个人进一个房子,所有人需要走的距离之和最小是多少. 貌似以前见过很多这样类似的题,都不会,现在知道是用KM算法做了 KM算法目 ...

  3. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  4. POJ 2195 Going Home (带权二分图匹配)

    POJ 2195 Going Home (带权二分图匹配) Description On a grid map there are n little men and n houses. In each ...

  5. POJ 2195 Going Home 最小费用最大流 尼玛,心累

    D - Going Home Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Subm ...

  6. poj 2195 Going Home(最小费最大流)

    poj 2195 Going Home Description On a grid map there are n little men and n houses. In each unit time ...

  7. poj 2195 KM算法

    题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...

  8. POJ 2195 Going Home(KM算法模板)

    题目链接:http://poj.org/problem?id=2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致. man每移动一格需花费$1 ...

  9. poj 2195(KM求最小权匹配)

    题目链接:http://poj.org/problem?id=2195 思路:我们都知道KM使用来求最大权匹配的,但如果要求最小权匹配,只需把图中的权值改为负值,求一次KM,然后权值和取反即可. ht ...

随机推荐

  1. 转载:openmax bellagio

    https://wenku.baidu.com/view/18472c1387c24028915fc3e9.html https://wenku.baidu.com/view/1e380bc20c22 ...

  2. 记录 Docker 的学习过程 (单机编排)

    容器的编排 什么是容器的编排?就是让容器有序的启动并在启动的过程加以控制 docker-compose -f bainpaiwenjian.yul up 如果编排文件为默认名称docker-compo ...

  3. 从ASCII到Unicode再到UTF-8的历史原由

    编码 大小 支持语言 ASCII 1个字节 英文 Unicode 2个字节(生僻字4个) 所有语言 UTF-8 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 所有语言 具体解释: ...

  4. linux - mysql:启动 mysql

    启动mysql 第一种: /etc/rc.d/init.d/mysqld start /etc/rc.d/init.d/mysqld stop 第二种:使用service 启动.关闭MySQL服务 s ...

  5. webpack 之搭建本地服务器

    搭建本地服务器 webpack提供了一个可选的本地开发服务器,这个本地服务器基于node.js搭建,内部使用express框架,可以实现 我们想要的让浏览器自动刷新显示我们修改后的结果 不过它是一个单 ...

  6. 【数据结构】【C++】堆栈的实现与应用

    堆栈(Stack) 参考浙大版<数据结构(第2版)> 堆栈可以认为是具有一定约束的线性表,插入和删除的操作都在栈顶的位置,先进入的元素将在后进入的元素之后取出,与生活中的桶类似,故又称为后 ...

  7. AcWing 1010. 拦截导弹

    //贪心加dp #include<iostream> using namespace std ; ; int n; int q[N]; int f[N]; int g[N];//存每个序列 ...

  8. 题解 【洛谷P1115】最大子段和

    这是一道枚举经典题. 本题有三种做法,各位需要根据每个题的数据范围来决定自己用哪种方法. 本题解中统一设最大和为Max. 方法一. 枚举子序列,从起点到终点求和.时间复杂度:O(n^3) 我们可以枚举 ...

  9. 编码 - 坑 - win10 下采用 utf-8, 导致 gitbash 中文字体异常, 待解决

    blog01 概述 使用 git 中, 遇到一个坑 背景 最近遇到一个 编码转换 问题 本来也 一知半解 要是有人能给我讲讲就好了 环境 win10 1903 git 2.20.1 1. 问题 概述 ...

  10. [SDOI2012]任务安排 - 斜率优化dp

    虽然以前学过斜率优化dp但是忘得和没学过一样了.就当是重新学了. 题意很简单(反人类),利用费用提前的思想,考虑这一次决策对当前以及对未来的贡献,设 \(f_i\) 为做完前 \(i\) 个任务的贡献 ...