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. Python学习第二阶段Day2,模块time/datetime、random、os、sys、shutil

    1.Time.  Datetime(常用) UTC时间:为世界标准时间,时区为0的时间 北京时间,UTC+8东八区 import time print(time.time()) # timestamp ...

  2. php利用32进制实现对id加密解密

    前言 最近在项目中遇到一个问题,当前用户分享一个邀请码给好友,好友根据邀请码注册成为新用户之后,则成为当前用户的下级,特定条件下,可以得到下级用户的一系列返利.这里要实现的就是根据当前用户的id,生成 ...

  3. python json、 pickle 、shelve 模块

    json 模块 用于序列化的模块 json,用于字符串 和 python数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load #!/usr/bin/env pyt ...

  4. [bzoj1925][Sdoi2010][地精部落] (序列动态规划)

    Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi, ...

  5. ViewService

    ViewService 在分布式系统中,最常见的场景就是主备架构.但是如果主机不幸宕机,如何正确的通知客户端当前后端服务器的状况成为一个值得研究的问题.本文描述了一种简单的模型用于解决此问题. 背景 ...

  6. [luoguP1879] [USACO06NOV]玉米田Corn Fields(DP)

    传送门 说要统计方案,感觉就是个 Σ 而矩阵中只有 01 ,可以用二进制表示 这样,预处理出每一个每一行所有可能的状态 s 然后初始化第一行所有状态的方案数为 1 f[i][j] = Σf[i - 1 ...

  7. 【Google Chrome】Google Chrome快捷键大全

    相信很多朋友在使用过Google Chrome之后,就会不想回到原先使用的浏览器了,尤其是IE.没错Google Chrome的优点很多,已经获得了一大部分网友们的用户,软件志现在也是Firefox+ ...

  8. java 源码分析2 -List

    1.是一个接口,继承了Collection,提供了size(),isEmpty(),contanis(),iterator(),toArray(),clear()等方法 2.分析常用的ArrayLis ...

  9. nginx,tornado,websocket,supervisord配置成型

    因为要上生产环境,所以配置还是专业一些比较好. nginx.conf upstream websocket_host { server 127.0.0.1:9527; } location /ws_l ...

  10. $inject的用法

    controller后面的$inject是用来注入函数的变量名称的