题目链接

http://poj.org/problem?id=2195

题意

在一张N * M 的地图上 有 K 个人 和 K 个房子

地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求他们的总的最小步数

思路

因为每个点都是可行走的 我们可以直接根据坐标 算出 每个人都不同房子的路径 然后用 KM 算法跑一下就可以了

KM算法 参考

https://blog.csdn.net/thundermrbird/article/details/52231639

https://blog.csdn.net/pi9nc/article/details/12250247

AC代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<string>
#include<list>
#include<stack>
#include <queue> #define CLR(a, b) memset(a, (b), sizeof(a)) using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 1e2 + 5;
const int MOD = 1e9; int nx, ny;
int linker[maxn], lx[maxn], ly[maxn];
int g[maxn][maxn];
int slack[maxn];
bool visx[maxn], visy[maxn]; bool DFS(int x)
{
visx[x] = true;
for (int y = 0; y < ny; y++)
{
if (visy[y])
continue;
int tmp = lx[x] + ly[y] - g[x][y];
if (tmp == 0)
{
visy[y] = true;
if (linker[y] == -1 || DFS(linker[y]))
{
linker[y] = x;
return true;
}
}
else if (slack[y] > tmp)
slack[y] = tmp;
}
return false;
} int KM()
{
CLR(linker, -1);
CLR(ly, 0);
for (int i = 0; i < nx; i++)
{
lx[i] = -INF;
for (int j = 0; j < ny; j++)
{
if (g[i][j] > lx[i])
lx[i] = g[i][j];
}
}
for (int x = 0; x < nx; x++)
{
for (int i = 0; i < ny; i++)
{
slack[i] = INF;
}
while (true)
{
CLR(visx, false);
CLR(visy, false);
if (DFS(x))
break;
int d = INF;
for (int i = 0; i < ny; i++)
{
if (!visy[i] && d > slack[i])
d = slack[i];
}
for (int i = 0; i < nx; i++)
{
if (visx[i])
lx[i] -= d;
}
for (int i = 0; i < ny; i++)
{
if (visy[i])
ly[i] += d;
else
slack[i] -= d;
}
}
}
int res = 0;
for (int i = 0; i < ny; i++)
if (linker[i] != -1)
res += g[linker[i]][i];
return res;
} int dis(int x1, int y1, int x2, int y2)
{
int x = abs(x1 - x2);
int y = abs(y1 - y2);
return x + y;
} int main()
{
int n, m;
while (scanf("%d%d", &n, &m) && (n || m))
{
vector <pii> p, h;
p.clear();
h.clear();
char c;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf(" %c", &c);
if (c == 'm')
p.push_back (pii(i, j));
if (c == 'H')
h.push_back (pii(i, j));
}
}
int len = p.size();
for (int i = 0; i < len; i++)
{
for (int j = 0; j < len; j++)
{
g[i][j] = -dis(p[i].first, p[i].second, h[j].first, h[j].second);
//printf("%d\n", g[i][j]);
}
}
nx = ny = len;
printf("%d\n", -KM());
}
}

POJ - 2195 Going Home 【KM】的更多相关文章

  1. 图论常用算法之一 POJ图论题集【转载】

    POJ图论分类[转] 一个很不错的图论分类,非常感谢原版的作者!!!在这里分享给大家,爱好图论的ACMer不寂寞了... (很抱歉没有找到此题集整理的原创作者,感谢知情的朋友给个原创链接) POJ:h ...

  2. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

  3. 【KM】POJ2195/HDU1533-Going home

    //最近没什么时间quq据说长得帅的人都在切八中,然而长得丑的人只能水水裸题 [题目大意] 给出一张地图及人和房屋的位置,求出每个人回到不同房屋所具有的最小代价和. [思路] 最小权匹配,先O(n^2 ...

  4. POJ 3280 Cheapest Palindrome【DP】

    题意:对一个字符串进行插入删除等操作使其变成一个回文串,但是对于每个字符的操作消耗是不同的.求最小消耗. 思路: 我们定义dp [ i ] [ j ] 为区间 i 到 j 变成回文的最小代价.那么对于 ...

  5. POJ 2195 Going Home 【二分图最小权值匹配】

    传送门:http://poj.org/problem?id=2195 Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  6. POJ 2195 Going Home 【最小费用最大流】

    题目链接:http://poj.org/problem?id=2195 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:2715 ...

  7. POJ 2195 Going Home【最小费用流 二分图最优匹配】

    题目大意:一个n*m的地图,上面有一些人man(m)和数量相等的house(H) 图上的距离为曼哈顿距离 问所有人住进一所房子(当然一个人住一间咯)距离之和最短是多少? 思路:一个人一间房,明显是二分 ...

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

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

  9. POJ 3669 Meteor Shower【BFS】

    POJ 3669 去看流星雨,不料流星掉下来会砸毁上下左右中五个点.每个流星掉下的位置和时间都不同,求能否活命,如果能活命,最短的逃跑时间是多少? 思路:对流星雨排序,然后将地图的每个点的值设为该点最 ...

随机推荐

  1. Nginx 简单的负载均衡配置演示样例

    近期在做开放查询应用的时候,因为数据两天特别多,两千多万条呢,用户訪问需求也比較大,所以就用nginx做了 负载均衡,以下是改动之后的相关内容. http://www.cnblogs.com/xiao ...

  2. 【Mysql】 你会用 information_schema吗?

    示例 select * from information_schema.views 其中的views可以替换成以下的字段,以下未列举的一般的数据库操作工具,在information_schema后输入 ...

  3. zabbix监控端口

    使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key. ...

  4. My sql 实用教程

    http://wenku.baidu.com/link?url=uwWWeGTZU61MQSSArf2pYRd4jPd7k7gNsx75KxEUKO1MlMLAAFiIF-fus3CY4RLyyzbZ ...

  5. cadence allegro pcb模块设计复用

    cadence allegro pcb模块设计复用 转载▼ 标签: 复用 模块 原理图 元件 文件 杂谈 分类: PCB技术 在你遇到如上图所示的dsp阵列PCB时,如果你的layout软件支持模块复 ...

  6. Hibernate二次学习一----------Hibernate简单搭建

    因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...

  7. Html中嵌套其他HTML文件的几种方法(转)

    给大家整理了3个方法,一个是HTML的iframe标签,别两个是JS引用.比如要在arr.html文件里引用index.html文件,方法如下. HTML引用方法: <iframe name=& ...

  8. distcc加速内核编译

    Linux内核编译实在是费时间的事,搞内核移植的时候总要编译,生命有一部分就浪费在等内核编译完成上,有心想买个HP的工作站,看了下Z840的价格,想想还是算了.distcc早就听说过,一直没有去试试, ...

  9. ubuntu安装源

    1.编辑sources.list文件 sudo vi /etc/apt/sources.list 添加以下安装源 #台湾源 deb http://tw.archive.ubuntu.com/ubunt ...

  10. 速记const 指针与指向const的指针

    指向const的指针.它的意思是指针指向的内容是不能被改动的.它有两种写法. ` const int* p; (推荐) int const* p;` 再说const指针.它的意思是指针本身的值是不能被 ...