带权二分图匹配,把距离当做权值,因为是最小匹配,所以把距离的相反数当做权值求最大匹配。

最后再把答案取一下反即可。

 #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的更多相关文章

  1. HDU(1853),最小权匹配,KM

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Other ...

  2. HDU 1533:Going Home(KM算法求二分图最小权匹配)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 Going Home Problem Description   On a grid map there ...

  3. [ACM] POJ 3686 The Windy&#39;s (二分图最小权匹配,KM算法,特殊建图)

    The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4158   Accepted: 1777 Descr ...

  4. [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

  6. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

  7. 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)

    二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...

  8. hdu 2255 二分图最大权匹配 *

    题意:说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房 ...

  9. UVALIVE 4970 最小权匹配

    首先贴一下这道题的BNU地址,UVA地址自己找吧. http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=11852 题意:这道题的意思就是,给你N个棋子的 ...

随机推荐

  1. Java基础学习_01 概述及环境配置

    一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...

  2. java学习笔记(3)——对象与类(日期)

    变量.类型.赋值.运算符等等: https://blog.csdn.net/common77zwq/article/details/81988676 1.概念: 面向对象程序设计OOP.类class. ...

  3. 使用 xib 设置 button 等款等高

    很多时候需要使用平分的控件来布局,当然xib中可以之间使用 UIToolBar 使用 UIBarButtonItem 添加弹簧即可完成平均分布 但是,直接使用 button 也可以实现平均布局

  4. 【Linux】Ubuntu配置zshell&oh-my-zsh

    zshell:https://archive.codeplex.com/?p=shell oh-my-zsh: https://github.com/robbyrussell/oh-my-zsh 终极 ...

  5. Vue Scroller:Vue 下拉刷新及无限加载组件

    Vue Scroller Vue Scroller is a foundational component ofVonic UI. In purpose of smooth scrolling, pu ...

  6. 新建博客第一天,随意来一发Win8运行命令大全

    1.calc:启动计算器 2.appwiz.cpl:程序和功能   3.certmgr.msc:证书管理实用程序 4.charmap:启动字符映射表 5.chkdsk.exe:Chkdsk磁盘检查(管 ...

  7. jsp之数据提交与获取(传统方法)

    package com.java.model; public class Student { private String name; private int age; public String g ...

  8. BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 164[Submit][Sta ...

  9. 三维GIS-室内寻径功能实现

    期末,要交一个大作业,正巧之前跑国图借书的时候,晕头转向的,国图内居然没有导航!!!借这个机会做一个室内导航的demo,只是半成品,还需要加入室内定位,匹配一下坐标才能在实际中使用. demo:利用蜂 ...

  10. UVA 140 Brandwidth 带宽 (dfs回溯)

    看到next_permutation好像也能过╮(╯▽╰)╭ 这题学习点: 1.建图做映射 2.通过定序枚举保证字典序最小 3.strtok,sscanf,strchr等函数又复习了一遍,尽管程序中没 ...