Going Home(MCMF)
http://poj.org/problem?id=2195
题意:在一个n*m的图中,'m'代表人,'H'代表房子,人每移动一次的费用为1,求所有人移动到房子里的最小花费。
思路:最小费用最大流问题。关键是建图,建好图后就是MCMF的模板题了。。
关于建图:增加一个原点S,一个汇点T, S与所有人相连,容量为1,花费为0;每个人与所有房子相连,容量为1,花费为|人与房子的水平距离|+|人与房子的垂直距离|;最后所有的房子 与汇点相连,容量为1,花费为0。
关于算法:多次spfa找增广路,然后求最大流。最小花费+=原点到汇点的最小距离*每次增光后的最大流量
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std; const int N=;
const int INF=<<;
struct node
{
int x,y;
} m[N],h[N];
int cap[N][N],cost[N][N];
int pre[N],vis[N],dis[N];
int cntm,cnth,t; int spfa()
{
queue<int>q;
for (int i = ; i <= t; i++)
{
dis[i] = INF;
vis[i] = ;
pre[i] = -;
}
dis[]=;
q.push();
vis[] = ;
while(!q.empty())
{
int u = q.front();
vis[u] = ;
q.pop();
for (int i = ; i <= t; i++)
{
if (cap[u][i]&&dis[i]>dis[u]+cost[u][i])
{
pre[i] = u;
dis[i] = dis[u]+cost[u][i];
if (!vis[i])
{
q.push(i);
vis[i] = ;
}
}
}
}
if (dis[t]==INF)
return ;
return ;
}
int MCMF()
{
int Maxflow = INF;
int Mincost = ;
while(spfa())
{
int u = t;
while(pre[u]!=-)
{
Maxflow = min(Maxflow,cap[pre[u]][u]);
u = pre[u];
}
Mincost += dis[t]*Maxflow;
u = t;
while(pre[u]!=-)
{
cap[pre[u]][u]-=Maxflow;
cap[u][pre[u]]+=Maxflow;
u = pre[u];
}
}
return Mincost;
}
void build()
{
for (int i = ; i <= cntm; i++)
{
for (int j = ; j <= cnth; j++)
{
cap[i][j+cntm] = ;
cost[i][j+cntm] = abs(m[i].x-h[j].x)+abs(m[i].y-h[j].y);
cost[j+cntm][i] = -cost[i][j+cntm];
}
}
for (int i = ; i <= cntm; i ++)
{
cap[][i] = ;
cost[][i] = ;
cap[i+cntm][t] = ;
cost[i+cntm][t] = ;
}
}
int main()
{
int row,col;
while(~scanf("%d%d",&row,&col))
{
if (row==&&col==)
break;
char ch;
cntm = ,cnth = ;
memset(cap,,sizeof(cap));
memset(cost,,sizeof(cost));
for (int i = ; i <= row; i++)
{
for (int j = ; j <= col; j++)
{
cin>>ch;
if (ch=='m')
{
m[++cntm].x = i;
m[cntm].y = j;
}
if (ch=='H')
{
h[++cnth].x = i;
h[cnth].y = j;
}
}
}
t = cnth+cntm+;
build();
int Mincost = MCMF();
printf("%d\n",Mincost);
}
return ;
}
Going Home(MCMF)的更多相关文章
- UVa(1658),Admiral,海军上将,拆点,MCMF
题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直 ...
- UVa(12821),MCMF
题目链接:https://uva.onlinejudge.org/external/128/12821.pdf 比赛的时候,准备用最短路来做,存两张图,做两次最短路,本来还觉得第二张图的设计很好的,很 ...
- Poj(2135),MCMF,模板
题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...
- bzoj 3171 [Tjoi2013]循环格(MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3171 [题意] 给定一个方向矩阵,要求改变最少的格子,使得任意一个点都在一个环中. [ ...
- bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最 ...
- 最小费用最大流MCMF zkw费用流
稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...
- 最小费用最大流MCMF 最小增广
没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...
- Intervals POJ - 3680 (MCMF)
给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...
- Baker Vai LightOJ - 1071 (MCMF)
在个给出的矩阵从,从左上角走到右下角,然后再从右下角走到左上角,两次不能经过想同的点,每个点都有一个价值,问最大的价值是多少. 可以把原来的问题化简成从左上角走两条路到右下角,然后把价值加起来,然是这 ...
随机推荐
- UVA-227 Puzzle(模拟)
题目: 题目浏览传送门 题意: 给出一个5*5的方格,里边有一个格子是空的,现在给出一串指令,A->空格向上移动,B->空格向下移动,R->空格向右移动,L->空格向左移动. ...
- Re0:DP学习之路 饭卡 HDU - 2546
解法 01背包变式,首先贪心的想一下如果要保证余额最小那么就需要用相减后最小的钱减去之前最大的价格,且得保证这个钱在5元以上 对于寻找如何减最多能包含在5元以上,这里用01背包 我们把价钱看做体积装进 ...
- git添加user及repository
- 修改虚拟机中Linux的IP
联网:ifup eth0 查看ip:ifconfig 点击编辑,选择NAT,子网ip修改第三字段为25,确定,重启linux后,会自动分配字段为25的ip 或者,也可以修改为自己想要的ip,如图:进入 ...
- PhantomJS & headless browser & pdf
PhantomJS http://phantomjs.org/ https://github.com/Medium/phantomjs https://github.com/Medium/phanto ...
- 【6572】关于mtk平台display模块的学习探讨
现在在学习mtk的display subsystem,有遇到流程上不太清楚地地方想要询问: 1.cmd模式和video模式framebuffer如何更新, 以及两种模式的差异? cmd和video m ...
- 【Teamviewer】Teamviewer远程访问工具使用方法
首先电脑必须能访问外网,即使是在局域网内也无所谓. 1.这里以非自动登录.自动受控的方式为例.首先,让对方也安装一个Teamviewer,或运行一个绿色的Teamviewer,并保证网络可通.然后我们 ...
- BZOJ1452 count (树状数组)
一道比较水的二维树状数组,开100个即可,只有100种颜色还是比较EZ的. Program BZOJ1452; ; maxc=; ..maxn,..maxn,..maxc] of longint; f ...
- 混合图(dizzy.pas/cpp/c)
混合图(dizzy.pas/cpp/c) [题目描述] Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家.他一 ...
- Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解
Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...