HDU 1533 二分图最小权匹配 Going Home
带权二分图匹配,把距离当做权值,因为是最小匹配,所以把距离的相反数当做权值求最大匹配。
最后再把答案取一下反即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#define MP make_pair
using namespace std; typedef pair<int, int> PII; const int maxn = + ; int n;
PII house[maxn], men[maxn];
char grid[maxn][maxn]; int row, col; int dist(const PII& a, const PII& b)
{ return abs(a.first - b.first) + abs(a.second - b.second); } //KM algorithm
int W[maxn][maxn];
int Lx[maxn], Ly[maxn];
int lft[maxn];
bool S[maxn], T[maxn]; bool match(int u)
{
S[u] = true;
for(int v = ; v <= n; v++)
if(Lx[u] + Ly[v] == W[u][v] && !T[v])
{
T[v] = true;
if(!lft[v] || match(lft[v]))
{
lft[v] = u;
return true;
}
}
return false;
} void update()
{
int a = ;
for(int u = ; u <= n; u++) if(S[u])
for(int v = ; v <= n; v++) if(!T[v])
a = min(a, Lx[u] + Ly[v] - W[u][v]);
for(int u = ; u <= n; u++)
{
if(S[u]) Lx[u] -= a;
if(T[u]) Ly[u] += a;
}
} void KM()
{
for(int i = ; i <= n; i++)
{
Lx[i] = *max_element(W[i]+, W[i]++n);
Ly[i] = ;
lft[i] = ;
}
for(int u = ; u <= n; u++)
{
for(;;)
{
memset(S, false, sizeof(S));
memset(T, false, sizeof(T));
if(match(u)) break;
else update();
}
}
} int main()
{
while(scanf("%d%d", &row, &col) == && row)
{
n = ; for(int i = ; i < row; i++) scanf("%s", grid[i]);
int hcnt = , mcnt = ;
for(int i = ; i < row; i++)
for(int j = ; j < col; j++)
{
if(grid[i][j] == 'H')
house[++hcnt] = MP(i, j);
else if(grid[i][j] == 'm')
men[++mcnt] = MP(i, j);
} //build graph
n = hcnt;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
W[i][j] = -dist(men[i], house[j]); KM(); int ans = ;
for(int i = ; i <= n; i++) ans += W[lft[i]][i];
printf("%d\n", -ans);
} return ;
}
代码君
HDU 1533 二分图最小权匹配 Going Home的更多相关文章
- HDU(1853),最小权匹配,KM
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Other ...
- HDU 1533:Going Home(KM算法求二分图最小权匹配)
http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description On a grid map there ...
- [ACM] POJ 3686 The Windy's (二分图最小权匹配,KM算法,特殊建图)
The Windy's Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4158 Accepted: 1777 Descr ...
- [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)
Going Home Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi ...
- UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...
- 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)
二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...
- hdu 2255 二分图最大权匹配 *
题意:说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房 ...
- UVALIVE 4970 最小权匹配
首先贴一下这道题的BNU地址,UVA地址自己找吧. http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=11852 题意:这道题的意思就是,给你N个棋子的 ...
随机推荐
- c#ADSL拨号类
class ADSLHelper { /// <summary> ///拨号 /// </summary> /// <param name="connectio ...
- GreenDao的简单使用说明(五)多表n:m
在设计一些比较复杂的数据库结构的时候,我们会遇到表之间是n:m的关系,就是常说的多对多的关系,最常用的情况,就是用户权限这块,日常最常见的就是学生与老师的关系了,哪么我们来看一下GreenDao中如何 ...
- nmap -sS
SYN 扫描,半连接,受到syn/ack响应后意味着端口开放,收到rst包意味着端口关闭.
- 升级CentOS内核 - 2.6升级到3.10/最新内核
##记得切换到root用户执行升级操作. [root@localhost ~]# uname -a ##旧版 Linux localhost.localdomain 2.6.32-279.el6.i6 ...
- Python +selenium之集成测试报告与unittest单元测试
随着软件不断迭代,对应的功能也会越来越多,从而对应的测试用例也会呈指数增长.如果将全部的测试用例集成在一个文件中就会显得特别的臃肿而且维护成本也会很高. 一个很好的放大就是将这些测试yo你给里按照功能 ...
- Html style="visibility:hidden"与style="display:none"的区别
style="visibility:hidden": 使对象在网页上隐藏,但该对象在网页上所占的空间没有改变. style="display:none": 使对 ...
- BZOJ 4881: [Lydsy2017年5月月赛]线段游戏
4881: [Lydsy2017年5月月赛]线段游戏 Time Limit: 3 Sec Memory Limit: 256 MBSubmit: 164 Solved: 81[Submit][St ...
- Android(java)学习笔记111:Java异常分类
Java异常可分为3种: (1)编译时异常:Java.lang.Exception (2)运行期异常:Java.lang.RuntimeException (3)错误:Java.lang.Error
- Windows 漏洞利用开发
第一阶段:简单栈溢出 分析栈溢出原理 寻找溢出点,了解pattern_create和pattern_offset计算溢出点的原理 寻找JMP ESP跳板,分析利用JMP ESP跳板劫持程序流的原理 编 ...
- leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal,剑指offer 6 重建二叉树
不用迭代器的代码 class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<in ...