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)的更多相关文章

  1. UVa(1658),Admiral,海军上将,拆点,MCMF

    题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直 ...

  2. UVa(12821),MCMF

    题目链接:https://uva.onlinejudge.org/external/128/12821.pdf 比赛的时候,准备用最短路来做,存两张图,做两次最短路,本来还觉得第二张图的设计很好的,很 ...

  3. Poj(2135),MCMF,模板

    题目链接:http://poj.org/problem?id=2135 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  4. bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...

  5. bzoj 3171 [Tjoi2013]循环格(MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3171 [题意] 给定一个方向矩阵,要求改变最少的格子,使得任意一个点都在一个环中. [ ...

  6. bzoj 1834 [ZJOI2010]network 网络扩容(MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1834 [题意] 给定一个有向图,每条边有容量C,扩容费用W,问最大流和使容量增加K的最 ...

  7. 最小费用最大流MCMF zkw费用流

    稀疏图慢死了...但是稠密图效果还是很好的 struct MCMF{ struct tedge{int x,y,cap,w,next;}adj[maxm];int ms,fch[maxn]; int ...

  8. 最小费用最大流MCMF 最小增广

    没有写单纯性的...应该不会有卡最小增广的出题人吧...(雾) struct MCMF{ struct tedge{int x,y,cap,flow,w,next;}adj[maxm];int ms, ...

  9. Intervals POJ - 3680 (MCMF)

    给你一些区间,每个区间都有些价值.取一个区间就能获得对应的价值,并且一个点不能覆盖超过k次,问你最大的价值是多少. 我们可以把这些区间放到一维的轴上去,然后我们可以把它看成一个需要从左到右的过程,然后 ...

  10. Baker Vai LightOJ - 1071 (MCMF)

    在个给出的矩阵从,从左上角走到右下角,然后再从右下角走到左上角,两次不能经过想同的点,每个点都有一个价值,问最大的价值是多少. 可以把原来的问题化简成从左上角走两条路到右下角,然后把价值加起来,然是这 ...

随机推荐

  1. 用 Systemtap 统计 TCP 连接

    转自: https://mp.weixin.qq.com/s?__biz=MzIxMjAzMDA1MQ==&mid=2648946009&idx=1&sn=3a0be2fe4f ...

  2. type、object、class之间的关系

    class Foo: pass print(type(int)) # <class 'type'> print(type(str)) # <class 'type'> prin ...

  3. String HDU 5672(双指针)

    String HDU 5672(双指针) 传送门 题意:一个字符串中找到所有拥有不少于k个不同的字符的子串. import java.io.*; import java.util.*; public ...

  4. RabbitMQ整合spring----https://www.cnblogs.com/woms/p/7040902.html

    https://www.cnblogs.com/woms/p/7040902.html

  5. [luoguP2038] 无线网络发射器选址(模拟)

    传送门 又是个模拟水题,考虑边界就好,连long long都不用开. ——代码 #include <cstdio> #include <iostream> int n, d, ...

  6. SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例

    前言: Spring4推出了@Conditional注解,方便程序根据当前环境或者容器情况来动态注入bean,对@Conditional注解不熟悉的朋友可移步至 Spring @Conditional ...

  7. graylog 市场

    https://marketplace.graylog.org/addons/246dc332-7da7-4016-b2f9-b00f722a8e79

  8. 今天又学到了一个很重要的公式,(a+b)^n,组合数的求和,牛逼,为自己鼓掌👏

    另外还有: C(n, 0) + ... + C(n, n) = 2^n 其实从上面的二项式定理,也可以推导出来的.

  9. 友盟 个推 微信sdk spring boot

    友盟 个推 微信sdk spring boot ngix mongodb memory cache

  10. ubuntu下安装jre

    jre下载地址:http://www.java.com/en/download/manual.jsp 1.将下载好的jre-7u55-linux-x64.tar.gz文件解压缩,得到jre1.7.0_ ...