题目链接:https://cn.vjudge.net/contest/242366#problem/L

大体意思就是:h代表旅馆,m代表人,人每走动一个需要一个金币,行动只有两个方向,水平或者竖直。问你最终让所有人都能到达旅馆并且花的总费用最少。

具体思路:一开始我是按照km的初级使用进行敲的,结果发现第二组样例过不了,然后km也打的没问题,看了网上的代码,才发现自己的思路错了。这个题的目的是让你花费最小,而km的初级使用是让总费用最低,如果按照一开始的打的话,就南辕北辙了。

但是,花费最小的话,只需要存值的时候把原来的任意两个人和旅馆之间距离赋为负值就可以了。

具体原因:本来km求的是最大值,如果给他加上一个负号,求的也是最大值,相应的变为原来的最小值了(很巧妙)

AC代码:

#include<bits/stdc++.h>
using namespace std;
# define maxn 100+10
# define inf 0x3f3f3f3f
int n,m;
char a[maxn][maxn];
int dis[maxn][maxn];
int nx[maxn*maxn],ny[maxn*maxn];
int visx[maxn*maxn],visy[maxn*maxn];
int slack[maxn*maxn];
int net[maxn*maxn];
int t1,t2;
struct node
{
int x,y;
node() {}
node (int xx,int yy)
{
x=xx;
y=yy;
}
} Pro[maxn*maxn],Hou[maxn*maxn];
void init1()
{
for(int i=1; i<=t1; i++)
{
nx[i]=-inf;
}
memset(ny,0,sizeof(ny));
memset(dis,0,sizeof(dis));
memset(net,0,sizeof(net));
}
void init2()
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
}
bool Find(int t)
{
visx[t]=1;
for(int i=1; i<=t1; i++)
{
int temp=nx[t]+ny[i]-dis[t][i];
if(temp==0)
{
if(visy[i]==0)
{
visy[i]=1;
if(net[i]==0||Find(net[i]))
{
net[i]=t;
return true;
}
}
}
else slack[i]=min(temp,slack[i]);
}
return false;
}
int km()
{
for(int i=1; i<=t1; i++)
{
memset(slack,inf,sizeof(slack));
while(1)
{
init2();
if(Find(i))break;
int minn=inf;
for(int i=1; i<=t1; i++)
{
if(!visy[i])
{
minn=min(minn,slack[i]);
}
}
for(int i=1; i<=t1; i++)
{
if(visx[i])
{
nx[i]-=minn;
}
}
for(int i=1; i<=t2; i++)
{
if(visy[i])
{
ny[i]+=minn;
}
}
}
}
int sum=0;
for(int i=1; i<=t1; i++)
{
if(net[i])
{
sum+=dis[net[i]][i];
}
}
return sum;
} int main()
{
while(cin>>n>>m&&(n+m))
{
init1();
t1=0,t2=0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>a[i][j];
if(a[i][j]=='m')
{
Pro[++t1].x=i;
Pro[t1].y=j;
}
else if(a[i][j]=='H')
{
Hou[++t2].x=i;
Hou[t2].y=j;
}
}
}
for(int i=1; i<=t1; i++)
{
for(int j=1; j<=t2; j++)
{
dis[i][j]=-(abs(Pro[i].x-Hou[j].x)+abs(Pro[i].y-Hou[j].y));
nx[i]=max(nx[i],dis[i][j]);
}
}
int t=km();
cout<<-t<<endl;
}
return 0;
}

最小费用流(km的另一种使用思路)的更多相关文章

  1. 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路

    前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...

  2. SAP MM 无价值物料管理的一种实现思路

    SAP MM 无价值物料管理的一种实现思路 笔者所在的项目,客户工厂处于先期试生产阶段,尚未开始大规模的商业化生产,但是这并不影响客户集团总部的SAP项目实施.笔者于7月初加入该工厂的第2期SAP项目 ...

  3. Java源码阅读的真实体会(一种学习思路)

    Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...

  4. ios - UINavigationBar添加背景图片的几种简单思路

    UITabBarController下面常常需要为多个ViewController设置导航栏样式,总结了一下遇到过的为UINavigationBar添加背景图片的几种简单思路 以设置背景图片为例: 第 ...

  5. Java源码阅读的真实体会(一种学习思路)【转】

    Java源码阅读的真实体会(一种学习思路)   刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+ ...

  6. neo4j - 查询效率的几种优化思路

    最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...

  7. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  8. Java-生成指定长度验证码的一种简单思路

     前言:以前做过的一个项目,刚开的时候始验证码是在前端生成前端验证的,后来觉得不靠谱,另外就是找回密码的功能也需要发送邮件和短信的验证码,所以,验证码就必须在后端生成并且保存到应用会话中才行了!所以, ...

  9. Top K问题的两种解决思路

    Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小1 ...

随机推荐

  1. BZOJ2002[Hnoi2010]弹飞绵羊——LCT

    题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系 ...

  2. Saddle Point ZOJ - 3955(求每个值得贡献)

    题意: 给出一个矩阵,删掉一些行和列之后 求剩下矩阵的鞍点的总个数 解析: 对于每个点 我们可以求出来 它所在的行和列  有多少比它大的 设为a 有多少比它小的 设为b 然后对于那些行和列 都有两种操 ...

  3. 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)

    题面戳我 Solution 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还 ...

  4. SVM学习笔记-线性支撑向量机

    对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的 Eout(w)≤Ein0+Ω(H)dvc= ...

  5. 洛谷 P2746 [USACO5.3]校园网Network of Schools 解题报告

    P2746 [USACO5.3]校园网Network of Schools 题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校&q ...

  6. Android:更好的自定义字体方案

    http://ryanhoo.github.io/blog/2014/05/05/android-better-way-to-apply-custom-font/ 情景 解决方案 1)Android默 ...

  7. Linux中禁用命令历史记录

    关闭history记录功能 set +o history 打开history记录功能 set -o history 清空记录 history -c 记录被清空,重新登录后恢复. rm -f $HOME ...

  8. 洛谷P2446 大陆争霸

    这是一道dijkstra拓展......不知道为什么被评成了紫题. 有一个很朴素的想法就是每次松弛的时候判断一下那个点是否被保护.如果被保护就不入队. 然后发现写起来要改的地方巨多无比...... 改 ...

  9. Flash10 使用剪贴板得改变程序的写法了

    昨天一个客户告诉我,在她的电脑上无法复制图片的链接地址. 一开始,我以为是她操作有误,因为在我们的系统里使用的是一种“双保险”的复制方法. javascript + flash 两种方法来进行复制. ...

  10. 'RegAsm.exe' 不是内部或外部命令

    我想从cmd运行regasm.exe.它在c:\windows \Microsoft.net\framework\2.057 中可用 我喜欢这个c:\ regasm.exe 它给予 regasm无法识 ...