题目链接: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. codeforces510B

    Fox And Two Dots CodeForces - 510B Fox Ciel 正在玩一个手机拼图游戏,被称之为 "Two Dots".基础关卡是在一个大小为 n × m的 ...

  2. Uva10474-STL水题-白书

    白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...

  3. ef group 封装

    表达式树,传递 group public class Test<T> where T : class { MoviesEntities db = new MoviesEntities(); ...

  4. HDU - 1260 (Tickets)

    题意:  买票    一个人要么自己买  要么和前面的人一起买   这两种情况分别有一个买票所花费的时间  求总的花费时间最小 解析: dp[i] 表示前i个人买票总的花费时间 v[i]表示第i个人买 ...

  5. Deep Learning(深度学习)学习笔记整理系列 一

    声明: 1)该Deep Learning的学习系列是整理自网上很大牛和机器学习专家所无私奉献的资料的.具体引用的资料请看参考文献.具体的版本声明也参考原文献. 2)本文仅供学术交流,非商用.所以每一部 ...

  6. android studio+grade配置构建

    Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试.部署.签署和分发的 APK.android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同 ...

  7. CodeForces - 669D

    题目链接:http://codeforces.com/problemset/problem/669/D Little Artem is fond of dancing. Most of all dan ...

  8. Logstash 解析Json字符串,删除json嵌套字段

    一.场景:此文以一个简单的json字符串文件为例,描述如何用logstash解析嵌套的json,并删除其中的某些字段 我们在linux中test.json的内容如下: {"timestamp ...

  9. Android手势监听类GestureDetector的使用

    在使用自定义视图的时候,对触屏事件的处理是比不可少的,有能力的可以自己写代码处理,这样更加的灵活.如果不想这么麻烦,Android提供了一个手势监听类GestureDetector,可以供我们使用.G ...

  10. Java + 腾讯邮箱 SSL加密问题 重要通知

    原来的jdk8版本如果不替换jce就会在发邮件的过程中报错,而此次使用的jdk1.8.0_131,并没有出现问题,也就是说,如果你使用的版本是 就不用考虑发邮件因为加密算法而导致的错误了