//最近没什么时间quq据说长得帅的人都在切八中,然而长得丑的人只能水水裸题

【题目大意】

给出一张地图及人和房屋的位置,求出每个人回到不同房屋所具有的最小代价和。

【思路】

最小权匹配,先O(n^2)求出每个人到任意房屋的距离后取反,就变成了裸的KM。数据范围很小,O(n^4)可以0ms过。

【错误点】

1.slack在每次循环中药重新设置为无穷大。2.内循环和外循环的循环变量重名了。3.变量名取太乱了用错了一次。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF=0x7fffffff;
const int MAXN=;
int n,m;
int mx[MAXN],my[MAXN],hx[MAXN],hy[MAXN],numm,numh;
int g[MAXN][MAXN];
int visx[MAXN],visy[MAXN],fx[MAXN],fy[MAXN],slack[MAXN],lk[MAXN]; int Hungary_dfs(int u)
{
visx[u]=;
for (int i=;i<=numm;i++)
{
int wt=fx[u]+fy[i]-g[u][i];
if (!visy[i] && wt==)
{
visy[i]=;
if (lk[i]==- || Hungary_dfs(lk[i]))
{
lk[i]=u;
return ;
}
}
else if (wt<slack[i]) slack[i]=wt;
}
return ;
} int KM()
{
memset(lk,-,sizeof(lk));
for (int i=;i<=numm;i++)
{
fx[i]=-INF;
fy[i]=;
for (int j=;j<=numm;j++) fx[i]=max(fx[i],g[i][j]);
} for (int i=;i<=numm;i++)
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
memset(slack,,sizeof(slack));//slack每次都要初始化为无穷大
while (!Hungary_dfs(i))
{
int delta=INF;
for (int j=;j<=numm;j++) if (!visy[j]) delta=min(delta,slack[j]);
for (int j=;j<=numm;j++)//这里忘掉了外面还套了一重循环,重复用了i!
{
if (visx[j])
{
visx[j]=;
fx[j]-=delta;
}
if (visy[j])
{
visy[j]=;
fy[j]+=delta;
}
}
}
} int ret=;
for (int i=;i<=numm;i++) ret+=fx[i]+fy[i];//这里numm写成了n
return ret;
} void init()
{
numm=numh=;
for (int i=;i<n;i++)
{
char c;
getchar();
for (int j=;j<m;j++)
{
scanf("%c",&c);
if (c=='m')
{
mx[++numm]=i;
my[numm]=j;
}
else if (c=='H')
{
hx[++numh]=i;
hy[numh]=j;
}
}
}
for (int i=;i<=numm;i++)
for (int j=;j<=numh;j++)
{
g[i][j]=-*(abs(mx[i]-hx[j])+abs(my[i]-hy[j]));
}
} int main()
{
while (scanf("%d%d",&n,&m))
{
if (n==m && m==) break;
init();
cout<<KM()*(-)<<endl;
}
return ;
}

【KM】POJ2195/HDU1533-Going home的更多相关文章

  1. 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树

    这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...

  2. ZOJ-3933-Team Formation【二分图最佳匹配】【KM】

    http://blog.csdn.net/loy_184548/article/details/51154195    一开始对不同组合得不同分数(mm1,mg2,gg3),想用sap来写,但是保证了 ...

  3. HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】

    <题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...

  4. POJ - 2195 Going Home 【KM】

    题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...

  5. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

  6. 【BZOJ4883】[Lydsy2017年5月月赛]棋盘上的守卫 KM算法

    [BZOJ4883][Lydsy2017年5月月赛]棋盘上的守卫 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须 ...

  7. 【POJ3565】ANTS KM算法

    [POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...

  8. 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)

    [BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...

  9. 【BZOJ3197】[Sdoi2013]assassin 树同构+动态规划+KM

    [BZOJ3197][Sdoi2013]assassin Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sam ...

随机推荐

  1. [poj 2104]主席树+静态区间第k大

    题目链接:http://poj.org/problem?id=2104 主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即 ...

  2. 有关spring的各种下载资料的网站

    spring的文件和jar包下载的网站: https://repo.spring.io/release/org/springframework/spring/ spring 各个版本源码下载的资料: ...

  3. windows主机控制

    一.开关机控制 using System.Runtime.InteropServices; //注销.关机.重启 class shutdown { [StructLayout(LayoutKind.S ...

  4. HASHMAP 深入解析

    http://blog.csdn.net/ghsau/article/details/16843543/

  5. K-D树问题 HDU 4347

    K-D树可以看看这个博客写的真心不错!这里存个版 http://blog.csdn.net/zhjchengfeng5/article/details/7855241 HDU 4349 #includ ...

  6. PL/SQL 06 函数 function

    --函数 create or replace function  函数名称(参数1 类型1,参数2 类型2,...)  return 数据类型as  变量.常量声明;begin  代码;end; cr ...

  7. mysql约束与索引的区别

    一:约束 作用:是为了保证数据的完整性而实现的一套机制,它具体的根据各个不同的数据库的实现而有不同的工具(约束): 这里主要讲解mysql的约束: 1.非空约束:not null; 指示某列不能存储 ...

  8. Selenium2+python自动化61-Chrome浏览器(chromedriver)【转载】

    前言 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrome浏览器版本号,对应的驱动文件版本号又不一样,如果版本号不匹配,是没法启动起来的. 一.Chrome遇到问题 1. ...

  9. docker从零开始(二)容器初体验

    使用定义容器 Dockerfile Dockerfile定义容器内所需要的环境.对网络接口和磁盘驱动器等资源的访问在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将端口映射到外部世界,并具 ...

  10. [图解算法] 归并排序MergeSort——<递归与分治策略>

    #include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...