最小费用流(km的另一种使用思路)
题目链接: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的另一种使用思路)的更多相关文章
- 数据权限设计——基于EntityFramework的数据权限设计方案:一种设计思路
前言:“我们有一个订单列表,希望能够根据当前登陆的不同用户看到不同类型的订单数据”.“我们希望不同的用户能看到不同时间段的扫描报表数据”.“我们系统需要不同用户查看不同的生产报表列”.诸如此类,最近经 ...
- SAP MM 无价值物料管理的一种实现思路
SAP MM 无价值物料管理的一种实现思路 笔者所在的项目,客户工厂处于先期试生产阶段,尚未开始大规模的商业化生产,但是这并不影响客户集团总部的SAP项目实施.笔者于7月初加入该工厂的第2期SAP项目 ...
- Java源码阅读的真实体会(一种学习思路)
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈 ...
- ios - UINavigationBar添加背景图片的几种简单思路
UITabBarController下面常常需要为多个ViewController设置导航栏样式,总结了一下遇到过的为UINavigationBar添加背景图片的几种简单思路 以设置背景图片为例: 第 ...
- Java源码阅读的真实体会(一种学习思路)【转】
Java源码阅读的真实体会(一种学习思路) 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+ ...
- neo4j - 查询效率的几种优化思路
最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...
- WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...
- Java-生成指定长度验证码的一种简单思路
前言:以前做过的一个项目,刚开的时候始验证码是在前端生成前端验证的,后来觉得不靠谱,另外就是找回密码的功能也需要发送邮件和短信的验证码,所以,验证码就必须在后端生成并且保存到应用会话中才行了!所以, ...
- Top K问题的两种解决思路
Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小1 ...
随机推荐
- 函数 for 循环有return 返回是0的原因
- BZOJ1070[SCOI2007]修车——最小费用最大流
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- Codeforces ECR47F Dominant Indices(线段树合并)
一个比较显然的做法:对每棵子树用线段树维护其中的深度,线段树合并即可. 本来想用这个题学一下dsu on tree,结果还是弃疗了. #include<iostream> #include ...
- C# TreeView 连续点击 不触发AfterCheck事件
创建一个类 TreeView2 namespace System.Windows.Forms { public class TreeView2 : TreeView { protected overr ...
- HNOI2017影魔
影魔 这么简单的方法尽然想不到,我是真的菜 对每个点,用单调栈的方式处理出他左右第一个比他大的数的位置,你可以把\(0\)和\(n+1\)设成\(inf\). 显然对于每对\(lef[i]\)和\(r ...
- LCT总结——应用篇(附题单)(LCT)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--概念篇戳这里 题单 灰常感谢XZY巨佬提供的强力资磁!(可参考XZY巨佬的博客总结) 题单对于系 ...
- Hdoj 1008.Elevator 题解
Problem Description The highest building in our city has only one elevator. A request list is made u ...
- 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表、Media表、 Events表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表.Medi ...
- 自学Python2.9-循环(while、for)
自学Python之路 自学Python2.9-循环(while.for) 1. while循环 Python中while语句的一般形式: while 判断条件: 语句 作用:提高开发效率,提高代码重用 ...
- Internet Explorer 10 administration IE10管理
http://4sysops.com/archives/internet-explorer-10-administration-part-1-overview/ http://4sysops.com/ ...