题目传送门

 /*
最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法
*/
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std; const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
int x[MAXN], y[MAXN];
int w[MAXN][MAXN];
int visx[MAXN], visy[MAXN];
int ly[MAXN];
int mx[MAXN], my[MAXN];
int hx[MAXN], hy[MAXN];
char maze[MAXN][MAXN];
int n, m, un, vn, d; bool DFS(int u) {
visx[u] = true;
for (int i=; i<=un; ++i) {
if (!visy[i] && x[u] + y[i] == w[u][i]) {
visy[i] = true;
if (ly[i] == - || DFS (ly[i])) {
ly[i] = u; return true;
}
}
else if (x[u] + y[i] > w[u][i]) d = min (d, x[u] + y[i] - w[u][i]);
}
return false;
} int KM(void) {
for (int i=; i<=un; ++i) {
x[i] = -INF;
for (int j=; j<=vn; ++j) {
x[i] = max (x[i], w[i][j]);
}
} memset (ly, -, sizeof (ly));
memset (y, , sizeof (y));
for (int i=; i<=un; ++i) {
while (true) {
memset (visx, false, sizeof (visx));
memset (visy, false, sizeof (visy));
d = INF;
if (DFS (i)) break;
for (int i=; i<=un; ++i) {
if (visx[i]) x[i] -= d;
}
for (int j=; j<=vn; ++j) {
if (visy[j]) y[j] += d;
}
}
} int res = ;
for (int i=; i<=un; ++i) {
res += x[i] + y[i];
} return res;
} int main(void) { //HDOJ 1533 Going Home
//freopen ("HDOJ_1533.in", "r", stdin); while (scanf ("%d%d", &n, &m) == ) {
if (!n && !m) break;
for (int i=; i<=n; ++i) {
scanf ("%s", maze[i] + );
}
un = vn = ;
for (int i=; i<=n; ++i) {
for (int j=; j<=m; ++j) {
if (maze[i][j] == 'm') mx[++un] = i, my[un] = j;
else if (maze[i][j] == 'H') hx[++vn] = i, hy[vn] = j;
}
}
for (int i=; i<=un; ++i) {
for (int j=; j<=vn; ++j) {
w[i][j] = -(abs (mx[i] - hx[j]) + abs (my[i] - hy[j]));
}
}
printf ("%d\n", -KM ());
} return ;
}

最大流增广路(KM算法) HDOJ 1533 Going Home的更多相关文章

  1. 最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱

    题目传送门 /* KM:裸题第一道,好像就是hungary的升级版,不好理解,写点注释 KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接Xi,Yj有权w(i ...

  2. 最大流增广路(KM算法) HDOJ 1853 Cyclic Tour

    题目传送门 /* KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法 */ #include <cstdio> #include <cmath> #incl ...

  3. hdu 3549 Flow Problem【最大流增广路入门模板题】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...

  4. Power Network (最大流增广路算法模板题)

    Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 20754   Accepted: 10872 Description A p ...

  5. 网络最大流最短增广路Dinic算法模板

    #include<cstdio> #include<cstring> #include<string> #include<cmath> #include ...

  6. 网络最大流增广路模板(EK &amp; Dinic)

    EK算法: int fir[maxn]; int u[maxm],v[maxm],cap[maxm],flow[maxm],nex[maxm]; int e_max; int p[maxn],q[ma ...

  7. 一般增广路方法求网络最大流(Ford-Fulkerson算法)

    /* Time:2015-6-18 接触网络流好几天了 写的第一个模版————Ford-Fulkerson算法 作用:求解网络最大流 注意:源点是0 汇点是1 如果题目输入的是1到n 请预处理减1 * ...

  8. 网络流初步:<最大流>——核心(增广路算法)(模板)

    增广路的核心就是引入了反向边,使在进行道路探索选择的时候增加了类似于退路的东西[有一点dp的味道??] 具体操作就是:1.首先使用结构体以及数组链表next[ MAXN ]进行边信息的存储 2.[核心 ...

  9. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

随机推荐

  1. msp430入门编程05

    msp430中C语言的运算符和表达式 msp430中C语言的程序结构06 msp430中C语言的函数及实现07 msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 m ...

  2. POJ 3041_Asteroids

    题意: N*N网格中有小行星,光束能将一整行或者一整列的行星消灭,问消灭所有行星至少需要多少光束? 分析: 最小顶点覆盖问题,将每个小行星看成边,左右顶点为横纵坐标,可以转化为二分图,利用二分图中最小 ...

  3. POJ 1064_Cable master

    题意: 给定一系列长度的电缆,将他们切成K条相等长度的电缆,问每条最长有多长? 分析: 对长度进行二分,判断能否满足K条. 二分搜索: 在求解最大化或最小化问题中,能够比较简单的判断条件是否满足,那么 ...

  4. hdu3756(三分)

    题意:三维坐标轴,有以原点为圆心,底面在xoy平面上,顶点在z轴上的圆锥,问圆锥的最小体积为多少才能完全覆盖空间里的所有点(n<=10000) 分析: 很容易想到转成二维问题,将其投影到xoz平 ...

  5. MySQL使用教程收集(语法教程/命令教程)

    说明:现在市面上的教程除了基本语法外,都基本是五花八门的,最权威且最全面的解释应该上官网去查看. https://www.tutorialspoint.com/mysql/index.htm http ...

  6. 获取select 选中的option中自定义的名称的之

    <select style="width: 220px;height: 20px;margin: 0 0 0 20px;" id="invest_ticket&qu ...

  7. 如何使用TFTP客户端工具修复路由器固件

    如何使用TFTP客户端工具修复路由器固件 编号:12083       来自:NetGear       更新日期:2013-10-14       访问数量:24650 NETGEAR无线路由器中, ...

  8. iOS自己定义返回button(不影响返回手势)

    此方法能够自己定义返回button,且不影响返回手势. 新方法: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] in ...

  9. 使用带粒子效果的 CAEmitterLayer

    1.用CAEmitterLayer产生粒子效果 2.封装CAEmitterLayer 3.封装下雪.下雨的粒子效果控件 一.用CAEmitterLayer产生粒子效果 - (void)emitterL ...

  10. TQ2440 学习笔记—— 1、Windows平台下开发工具安装与环境建立

    板子:广州天嵌公司的TQ2440,处理器为三星的S3C2440 1.开发工具的安装与环境建立 系统:win7  64位 SecureCRT软件:该软件能够取代Windows中的超级终端,是个非常好的串 ...