hdu1533Going Home KM算法
//给一个n*m的图,
//m表示人,h表示房子
//问全部人走回家的最小步数
//每一个人仅仅能进一间房
//非常明显的最大带权匹配
//每一个人到每每间房的距离即为权值
//因为是求最小,仅仅要改为负权即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std ;
const int maxn = 110 ;
const int inf = 0x3f3f3f3f ;
int map[maxn][maxn] ;
int lx[maxn] ,ly[maxn] ;
int slack[maxn] , match[maxn] ;
int visx[maxn] , visy[maxn] ;
char str[maxn][maxn] ;
int mx[maxn] , my[maxn] ;
int hx[maxn] , hy[maxn] ;
int n , m ;
bool find(int x)
{
visx[x] = 1 ;
for(int i = 1;i <= n;i++)
{
if(visy[i])continue ;
int tmp = lx[x] + ly[i] - map[x][i] ;
if(tmp == 0)
{
visy[i] = 1 ;
if(match[i] == -1 || find(match[i]))
{
match[i] = x ;
return true ;
}
}
else slack[i] = min(slack[i] , tmp) ;
}
return false ;
}
int KM()
{
memset(match , -1 , sizeof(match)) ;
memset(ly , 0 , sizeof(ly)) ;
for(int i = 1;i <= n;i++)
{
lx[i] = -inf ;
for(int j = 1;j <= n;j++)
lx[i] = max(lx[i] , map[i][j]) ;
}
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
slack[j] = inf ;
while(1)
{
memset(visx , 0 ,sizeof(visx)) ;
memset(visy , 0 , sizeof(visy)) ;
if(find(i))break ;
int d = inf ;
for(int j = 1;j <= n;j++)
if(!visy[j])
d = min(slack[j] , d) ;
for(int j = 1;j <= n;j++)
if(visx[j])
lx[j] -= d ;
for(int j = 1;j <= n;j++)
if(visy[j])
ly[j] += d ;
else
slack[j] -= d ;
}
}
int ans = 0 ;
for(int j = 1;j <= n;j++)
ans += map[match[j]][j];
return ans ;
}
int main()
{
// freopen("in.txt" , "r" , stdin) ;
while(scanf("%d%d" , &n , &m) && (n+m))
{
int len_m = 0 , len_h = 0 ;
for(int i = 1;i <= n;i++)
{
scanf("%s" , &str[i][1]) ;
for(int j = 1;j <= m;j++)
if(str[i][j] == 'm')
{
mx[++len_m] = i ;
my[len_m] = j ;
}
else if(str[i][j] == 'H')
{
hx[++len_h] = i ;
hy[len_h] = j ;
}
}
memset(map , 0 ,sizeof(map)) ;
for(int i = 1;i <= len_m;i++)
for(int j = 1;j <= len_h;j++)
map[i][j] = (int)(-abs((double)(mx[i]-hx[j])) - abs((double)(my[i]-hy[j]))) ;
n = len_m ;
int ans = KM() ;
cout<<-ans<<endl;
}
}
hdu1533Going Home KM算法的更多相关文章
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 【HDU2255】奔小康赚大钱-KM算法
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼
感谢 http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...
- poj 2195 KM算法
题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- HDU(2255),KM算法,最大权匹配
题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- hdu 2255 奔小康赚大钱 KM算法
看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...
随机推荐
- 页面出现AXURE RP EXTENSION,怎么办?
(可参考百度经验,地址:https://jingyan.baidu.com/article/54b6b9c0c1cb762d583b4706.html) 本文以强大如斯的谷歌浏览器来说明,怎么查看Ax ...
- PullToRefreshListView的刷新和加载的控制
pullToRefresh.setMode(Mode.BOTH); Mode.BOTH:同时支持上拉下拉 Mode.PULL_FROM_START:只支持下拉Pulling Down M ...
- python 字符串匹配问题
想匹配html = <div class="back fl"><a href="javascript:void(0);" onclick=&q ...
- python中修改函数内部的变量会发生什么
最近写python遇到个函数内部变量使用外部变量的问题,现在总结下吧 #!/usr/bin/env python a = 100def su(): a = a + 1 print(a) s = su( ...
- [笔记-图论]Bellman-Ford
用于求可带负权的单源有向图 优化后复杂度O(nm) 如果图中存在负环,就不存在最小路 这种情况下,就一定会有一个顶点被松弛多于n-1次,Bellman-Ford可直接判断出来 我在网上看到SPFA,发 ...
- PHP安全性防范方式
SQL注入 SQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行. 防范方式 使用mysql_real_escape_string(),或者addslashes()过 ...
- docker常用命令,学习笔记
- 常用命令 https://docs.docker.com images > docker images # 查看本地镜像 > docker images -a # 查看所(含中间镜像层 ...
- CMSIS-RTOS 时间管理之时间延迟Time Delay
时间管理 Time Management 此RTOS除了可以把你的应用代码作为线程运行,它还可以提供一些时间服务功能,使用这些功能你就可以访问RTOS的一些系统调用. 时间延迟Time Delay 在 ...
- 洛谷 P1302 可见矩形
P1302 可见矩形 题目描述 给定平面上n个互不相交(指公共面积为零)的正方形,它们的顶点坐标均为整数.设坐标原点为O(0, 0).对于任一正方形R,如果可以找到R的边上2个不同的点A和B,使三角形 ...
- 用react native 做的一个推酷client
用react native 做的一个推酷client 仅供大家參考.仅仅为抛砖引玉.希望大家能以此来了解react.并编写出很多其它的优质的开源库,为程序猿做出贡献. 用的的组件: Navigator ...