【KM】POJ2195/HDU1533-Going home
//最近没什么时间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的更多相关文章
- 【KM】BZOJ1937 [Shoi2004]Mst 最小生成树
这道题拖了好久因为懒,结果1A了,惊讶∑( 口 || [题目大意] 给定一张n个顶点m条边的有权无向图.现要修改各边边权,使得给出n-1条边是这张图的最小生成树,代价为变化量的绝对值.求最小代价之和. ...
- ZOJ-3933-Team Formation【二分图最佳匹配】【KM】
http://blog.csdn.net/loy_184548/article/details/51154195 一开始对不同组合得不同分数(mm1,mg2,gg3),想用sap来写,但是保证了 ...
- HDU 2426 Interesting Housing Problem (最大权完美匹配)【KM】
<题目链接> 题目大意: 学校里有n个学生和m个公寓房间,每个学生对一些房间有一些打分,如果分数为正,说明学生喜欢这个房间,若为0,对这个房间保持中立,若为负,则不喜欢这个房间.学生不会住 ...
- POJ - 2195 Going Home 【KM】
题目链接 http://poj.org/problem?id=2195 题意 在一张N * M 的地图上 有 K 个人 和 K 个房子 地图上每个点都是认为可行走的 求 将每个人都分配到不同的房子 求 ...
- 【转】KM匹配题集
转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...
- 【BZOJ4883】[Lydsy2017年5月月赛]棋盘上的守卫 KM算法
[BZOJ4883][Lydsy2017年5月月赛]棋盘上的守卫 Description 在一个n*m的棋盘上要放置若干个守卫.对于n行来说,每行必须恰好放置一个横向守卫:同理对于m列来说,每列 必须 ...
- 【POJ3565】ANTS KM算法
[POJ3565]ANTS 题意:平面上有2*n个点,N白N黑.为每个白点找一个黑点与之连边,最后所有边不交叉.求一种方案. 题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~ 本 ...
- 【BZOJ1937】[Shoi2004]Mst 最小生成树 KM算法(线性规划)
[BZOJ1937][Shoi2004]Mst 最小生成树 Description Input 第一行为N.M,其中 表示顶点的数目, 表示边的数目.顶点的编号为1.2.3.…….N-1.N.接下来的 ...
- 【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 ...
随机推荐
- transition(动画属性)
CSS 过渡(transition)是通过定义元素从起点的状态和结束点的状态,在一定的时间区间内实现元素平滑地过渡或变化的一种补间动画机制.你可以让属性的改变过程持续一段时间,而不是立即生效. 通过t ...
- 在eclipse中使用JUnit4,以及使用JUnit4进行单元测试的技巧
一 在eclipse中使用JUnit4 首先在工程上右键,选择属性,找到Java Builder Path,添加JUnit4的lib,如下图: 在要测试的类上右键新建 Junit test cas ...
- IntelliJ 创建main函数快捷
今天偶然发现了IntelliJ中 创建main函数的快捷键,依次还有for循环,System.out.println(); 在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一 ...
- 通过jQuery实现轮播效果
HTML <div class="wrap"> <div id="slide"> <ul class="list&quo ...
- ZOJ1003 Crashing Balloon
Crashing Balloon Time Limit: 2 Seconds Memory Limit: 65536 KB On every June 1st, the Children's ...
- appium===Appium的前世今生
一.什么是Appium Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持IOS.Android及FirefoxOS平台.Appium使用WebDriv ...
- ARM 处理器架构【转】
ARM 处理器架构 转自:http://www.arm.com/zh/products/processors/instruction-set-architectures/index.php ARM 架 ...
- 【POI2017||bzoj4726】Flappy Birds
外国人很良心的啊,这题比NOIP那题还简单…… 不用管他最后的位置,因为移动的次数肯定是恒定的,所以维护在每一个柱子的位置能飞到的范围,递推下去即可. #include<bits/stdc++. ...
- [ 手记 ] Oracle 11g安装过程
安装环境: 操作系统:Centos6.4 Desktop 主机名:oracle 内存:2G 安装前准备: 修改主机名: [root@oracle ~]# vim /etc ...
- P2654 原核生物培养
P2654 原核生物培养 题目描述 W教授最近正在研究一种原核生物,这种生物的生长方式很奇特,只能通过吃掉同类而生长.两个该种生物相遇,较大质量的会把较小的吃掉(相同的话就看RP了),吃掉后较大的生物 ...