题意

  求二分图最小完备匹配。

SOL

  建个图那么方便的事情是吧。。。然后边权都是正的(好像根边权也没什么关系),既然要求最小那么把边权取个相反数跑个KM就好了。。

CODE:

/*==========================================================================
# Last modified: 2016-02-16 19:55
# Filename: hdu1533.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
CODE:
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define lowbit(x) (x)&(-x)
#define INF 1070000000
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define maxn 200
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
/*==================split line==================*/ int n,sumx,sumy;
int w[maxn][maxn],link[maxn],lx[maxn],ly[maxn],slack[maxn],x[maxn],y[maxn];
bool S[maxn],T[maxn];
int calc(int i,int j){
int y1=x[i]%1000,x1=x[i]/1000,y2=y[j]%1000,x2=y[j]/1000;
return -(abs(y1-y2)+abs(x1-x2));
}
void build_graph(){
FORP(i,1,n)
FORP(j,1,n)
w[i][j]=calc(i,j);
}
bool match(int i){
S[i]=true;
FORP(j,1,n){
if (T[j]) continue;
int tmp=lx[i]+ly[j]-w[i][j];
if (tmp==0){
T[j]=true;
if (!link[j] || match(link[j])){
link[j]=i;
return true;
}
}
else slack[j]=min(slack[j],tmp);
}
return false;
}
void updata(){
int a=INF;
FORP(i,1,n) if (!T[i]) a=min(a,slack[i]);
FORP(i,1,n) {
if (S[i]) lx[i]-=a;
if (T[i]) ly[i]+=a;
else slack[i]-=a;
}
}
int KM(){ memset(link,0,sizeof(link));
memset(ly,0,sizeof(ly));
FORP(i,1,n)
FORP(j,1,n) lx[i]=max(lx[i],w[i][j]); FORP(i,1,n){
memset(slack,0x7f,sizeof(slack));
while (1){
memset(S,false,sizeof(S));
memset(T,false,sizeof(T));
if (match(i)) break;
else updata();
}
}
int ans=0;
FORP(i,1,n) if (link[i])
ans+=w[link[i]][i];
return -ans;
}
int main(){
//freopen("a.in","r",stdin);
int r,c;
while (1){
sumx=0; sumy=0;
scanf("%d%d",&r,&c);
if (r==0 && c==0) return 0;
FORP(i,1,r){
char ch[1000];
scanf("%s",ch);
FORP(j,0,c-1)
if (ch[j]=='m') x[++sumx]=i*1000+j+1;
else if (ch[j]=='H') y[++sumy]=i*1000+j+1;
}
n=sumx;
build_graph();
printf("%d\n",KM());
}
}

HDU 1533 & KM模板的更多相关文章

  1. HDU 2255 & KM模板

    题意: 一张完备二分图求最优完备匹配. SOL: 这题就不讲什么sol了...毕竟是裸的KM,不会的话可以看老人家的大白鼠,一些问题看代码注释.讲讲经历(悲惨的经历) 刚打完,自信地交上去发现MLE. ...

  2. HDU 1533 KM算法(权值最小的最佳匹配)

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

  3. hdu 1533 KM或费用流

    以前用KM写过,现在再用费用流写. #include <iostream> #include <cstdio> #include <cstring> #includ ...

  4. 【HDU 1533】 Going Home (KM)

    Going Home Problem Description On a grid map there are n little men and n houses. In each unit time, ...

  5. POJ 2195 Going Home / HDU 1533(最小费用最大流模板)

    题目大意: 有一个最大是100 * 100 的网格图,上面有 s 个 房子和人,人每移动一个格子花费1的代价,求最小代价让所有的人都进入一个房子.每个房子只能进入一个人. 算法讨论: 注意是KM 和 ...

  6. HDU 1533 Going Home(KM完美匹配)

    HDU 1533 Going Home 题目链接 题意:就是一个H要相应一个m,使得总曼哈顿距离最小 思路:KM完美匹配,因为是要最小.所以边权建负数来处理就可以 代码: #include <c ...

  7. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  8. HDU 2138 Miller-Rabin 模板题

    求素数个数. /** @Date : 2017-09-18 23:05:15 * @FileName: HDU 2138 miller-rabin 模板.cpp * @Platform: Window ...

  9. HDU 1533 最小费用最大流(模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1533 这道题直接用了模板 题意:要构建一个二分图,家对应人,连线的权值就是最短距离,求最小费用 要注意void ...

随机推荐

  1. (转)WPF控件开源资源

    (转)WPF控件开源资源 Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in- ...

  2. SpringMVC请求处理流程

    从web.xml中 servlet的配置开始, 根据servlet拦截的url-parttern,来进行请求转发   Spring MVC工作流程图   图一   图二    Spring工作流程描述 ...

  3. global-local-static-object

    [本文链接] http://www.cnblogs.com/hellogiser/p/global-local-static-object.html [分析] 1.生命周期问题:static变量在固定 ...

  4. 【转】如何调试bash脚本

    本文转自:http://coolshell.cn/articles/1379.html Bash 是Linux操作系统的默认Shell脚本.Shell是用来处理操作系统和用户交互的一个程序.Shell ...

  5. 六间房 去掉水印的方法 绕过游客VIP限制

    firefox 40 + Adblock Plus 2.6.9.1 + Execute JS 0.2.4.1 Adblock Plus 过滤规则里添加 ------------------------ ...

  6. HDU 5514 Frogs (容斥原理+因子分解)

    题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...

  7. [Android Pro] RecyclerView实现瀑布流效果(二)

    referece to : http://blog.csdn.net/u010687392 在上篇中我们知道RecyclerView中默认给我们提供了三种布局管理器,分别是LinearLayoutMa ...

  8. 手机 无法转移到SD卡 Andriod 导出应用程序

    今天下载了一个应用Meridian,因为是直接从google商店里面装的,因此无法找到SDK,需要从新找到导出方式: 豌豆荚==> 软件和游戏管理==>输入Meridian搜素==> ...

  9. redis的单实例配置+web链接redis

    [root@cache01 src]# wget http://download.redis.io/redis-stable.tar.gz [root@cache01 src]# tar -xzvf ...

  10. 2.Abstract Factory 抽象工厂(创建型模式)之简单工厂

    简单工厂 1.只有一个工厂(具体的,没有抽象) 2.只生产一种产品(抽象的产品) 3.这种产品可以有多种具体产品类型(派生) 代码实现 class Program { static void Main ...