思路:

把房子和人看成点,加上源点和汇点。

源点和每个人连容量为1,权值为0的边。

每个人和每个房子连容量为1,权值为距离的边。

每个房子和汇点连容量为1,权值为0的边。

#include<stdio.h>
#include<queue>
#define MAXN 500
#define MAXM 10002*4
#define INF 10000000
using namespace std;
//起点编号必须最小,终点编号必须最大
bool vis[MAXN]; //spfa中记录是否在队列里边
char pho[][];
struct point{
int x,y;
}man[],house[];
struct edge{
edge *next,*op; //op是指向反向边
int t,c,v; //t下一个点编号,c容量,v权值
}ES[MAXM],*V[MAXN]; //ES边静态邻接表,V点的编号
int N,M,S,T,EC=-; //S源点最小,T汇点最大,EC当前边数
int demond[MAXN],sp[MAXN],prev[MAXN]; //spSPFA中记录距离,prev记录上一个点路径
edge *path[MAXN]; //与prev同步记录,记录到上一条边
void addedge(int a,int b,int v,int c=INF){
//printf("%d %d %d %d\n",a,b,v,c);
edge e1={V[a],,b,c,v},e2={V[b],,a,,-v};
ES[++EC]=e1;V[a]=&ES[EC];
ES[++EC]=e2;V[b]=&ES[EC];
V[a]->op=V[b];V[b]->op=V[a];
}
int cal(point a,point b){
return max(a.x-b.x,b.x-a.x)+max(a.y-b.y,b.y-a.y);
}
bool init(){
int n,m;
EC=-;
for(int i=;i<=;i++){
V[i]=NULL;
}
scanf("%d%d",&n,&m);
if(n==&&m==)return ;
for(int i=;i<n;i++){
scanf("%s",pho[i]);
}
int num_m=,num_h=;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
if(pho[i][j]=='m'){
man[num_m++]={i,j};
}
else if(pho[i][j]=='H'){
house[num_h++]={i,j};
}
}
}
for(int i=;i<num_m;i++){
for(int j=;j<num_h;j++){
addedge(i+,num_m+j+,cal(man[i],house[j]));
}
}
for(int i=;i<num_m;i++){
addedge(,i+,,);
}
for(int i=;i<num_h;i++){
addedge(num_m+i+,num_m+num_h+,,);
}
S=;T=num_m+num_h+;
return ;
}
bool SPFA(){
int u,v;
for(u=S;u<=T;u++){
sp[u]=INF;
}
queue<int>q;
prev[S]=-;
q.push(S);
sp[S]=;
vis[S]=;
while(!q.empty()){
u=q.front();
vis[u]=;
q.pop();
for(edge *k=V[u];k;k=k->next){
v=k->t;
if(k->c>&&sp[u]+k->v<sp[v]){
sp[v]=sp[u]+k->v;
prev[v]=u;
path[v]=k;
if(vis[v]==){
vis[v]=;
q.push(v);
}
}
}
}
return sp[T]!=INF;
}
int argument(){
int i,cost=INF,flow=;
edge *e;
for(i=T;prev[i]!=-;i=prev[i]){
e=path[i];
if(e->c<cost)cost=e->c;
}
for(int i=T;prev[i]!=-;i=prev[i]){
e=path[i];
e->c-=cost;e->op->c+=cost;
flow+=e->v*cost;
}
return flow;
}
int maxcostflow(){
int Flow=;
while(SPFA()){
Flow+=argument();
}
return Flow;
}
int main(){
while(init())
printf("%d\n",maxcostflow());
return ;
}

ZOJ 2404 Going Home 【最小费用最大流】的更多相关文章

  1. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  2. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  3. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  4. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  5. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

  6. 【BZOJ-3876】支线剧情 有上下界的网络流(有下界有源有汇最小费用最大流)

    3876: [Ahoi2014]支线剧情 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 502[Submit][Status ...

  7. hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***

    题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙,          每个逮捕队伍在每个城市可以选 ...

  8. UVa11082 Matrix Decompressing(最小费用最大流)

    题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况. POJ2396的弱化版本吧..建图的关键在于: 把行.列看 ...

  9. UVa12092 Paint the Roads(最小费用最大流)

    题目大概说一个n个点m条带权有向边的图,要给边染色,染色的边形成若干个回路且每个点都恰好属于其中k个回路.问最少要染多少边权和的路. 一个回路里面各个点的入度=出度=1,那么可以猜想知道各个点如果都恰 ...

  10. POJ3686 The Windy's(最小费用最大流)

    题目大概说要用m个工厂生产n个玩具,第i个玩具在第j个工厂生产要Zij的时间,一个工厂同一时间只能生成一个玩具,问最少的用时. 这题建的图不是很直观.. 源点向玩具连容量1费用0的边 将每个工厂拆成n ...

随机推荐

  1. Appium查找元素

    记录一些需要记忆的查找元素的内容: 1. driver.findElement(By.name("DELETE");   //We can use the DELETE text ...

  2. C语言常用的小代码

    圆周率Pi tan(Pi/4)=1 => Pi=4*arctan(1) 反正切函数arctan()在C语言里表示为atan(),为保证精度取圆周率的代码如下: const double Pi = ...

  3. oracle 行转列的例子

    with test as(select '1' bit from dual union select '0' from dual )select replace(sys_connect_by_path ...

  4. Rsync企业实战之自动异地备份(转)

    认真的测试过网上的大多数文章和版本,真正能一次性测试通过的文章太少了,需要反复的推敲,反复的查阅资料,才能真正的测试成功,所以,在此背景下,总结了Rsync,加上自己的理解分享出来: 1. 原理篇 R ...

  5. Java compiler level does not match the version of the installed Java project facet.问题

    从同事那里拷贝过来的web项目,导入到eclipse中,出现Java compiler level does not match the version of the installed Java p ...

  6. phpcms日期时间

    PHPCMS V9调用时间标签 |日期时间格式化 转载 2016-06-17 14:58:54 标签:php PHPCMS V9 如何调用时间标签,下面分享常见的调用时间标签 |日期时间格式化 1.日 ...

  7. SSH_框架整合3-删除

    一.普通删除 1 完善src中 类: (1)EmployeeDao.java中: //2 删除 public void delete(Integer id){ String hql="DEL ...

  8. 剑指offer系列51---扑克牌顺子

    [题目]抽五张扑克牌,判断五张扑克牌是不是顺子,大小王可看做任何数,0代替. package com.exe10.offer; import java.util.Arrays; /** * [题目]抽 ...

  9. 【转】libvirt kvm 虚拟机上网 – Bridge桥接

    libvirt kvm 虚拟机上网 – Bridge桥接 2013 年 7 月 3 日 / 东东东 / 暂无评论 目录 [hide] 1 Bridge桥接原理 2 在host机器配置桥接网络 2.1  ...

  10. android学习笔记42——图形图像处理2——绘图

    绘图 android的绘图应该继承View组件,并重写onDraw(Canvas canvas)方法即可. 重写onDraw(Canvas canvas)方法时涉及一个绘图API:Canvas,Can ...