题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用

题解:单源点汇点最小费用最大流,每个人和房子对于建边

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1 using namespace std;
using namespace __gnu_cxx; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f; struct edge{
int to,Next,c;
int cost;
}e[maxn<<];
int cnt,head[N];
int s,t,ans[N][N];
int dis[N],path[N],pre[N];
void add(int u,int v,int c,int cost)
{
// cout<<u<<" "<<v<<" "<<c<<" "<<cost<<endl;
e[cnt].to=v;
e[cnt].c=c;
e[cnt].cost=cost;
e[cnt].Next=head[u];
head[u]=cnt++;
e[cnt].to=u;
e[cnt].c=;
e[cnt].cost=-cost;
e[cnt].Next=head[v];
head[v]=cnt++;
}
bool spfa()
{
memset(pre,-,sizeof pre);
memset(dis,inf,sizeof dis);
dis[s]=;
queue<int>q;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];~i;i=e[i].Next)
{
int te=e[i].to;
if(e[i].c>&&dis[x]+e[i].cost<dis[te])
{
dis[te]=dis[x]+e[i].cost;
pre[te]=x;
path[te]=i;
q.push(te);
}
}
}
return pre[t]!=-;
}
int mincostmaxflow()
{
int cost=,flow=;
while(spfa())
{
int f=inf;
for(int i=t;i!=s;i=pre[i])
if(f>e[path[i]].c)
f=e[path[i]].c;
flow+=f;
cost+=dis[t]*f;
for(int i=t;i!=s;i=pre[i])
{
e[path[i]].c-=f;
e[path[i]^].c+=f;
}
}
return cost;
}
void init()
{
cnt=;
memset(head,-,sizeof head);
}
int main()
{
/* ios::sync_with_stdio(false);
cin.tie(0);*/
int n,m;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m)break;
init();
int house=,man=;
pii ho[N],ma[N];
for(int i=;i<=n;++i)
{
char a[N];
scanf("%s",a+);
for(int j=;j<=m;j++)
{
if(a[j]=='H')ho[++house]=mp(i,j);
else if(a[j]=='m')ma[++man]=mp(i,j);
}
}
for(int i=;i<=house;i++)
{
for(int j=;j<=man;j++)
{
int cost=abs(ho[i].fi-ma[j].fi)+abs(ho[i].se-ma[j].se);
// cout<<i<<" "<<j<<" "<<cost<<endl;
add(i,house+j,inf,cost);
// add(house+j,i,inf,cost);
}
}
s=house+man+,t=house+man+;
for(int i=;i<=house;i++)add(s,i,,);
for(int i=;i<=man;i++)add(i+house,t,,);
printf("%d\n",mincostmaxflow());
}
return ;
}
/******************* ********************/

POJ - 2195 最小费用最大流的更多相关文章

  1. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  2. poj 3422(最小费用最大流)

    题目链接:http://poj.org/problem?id=3422 思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点 ...

  3. POJ 2516 最小费用最大流

    每一种货物都是独立的,分成k次最小费用最大流即可! 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E[pe[v]^ ...

  4. POJ 2135 最小费用最大流 入门题

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7441 Descri ...

  5. poj 2135最小费用最大流

    最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...

  6. poj 3680(最小费用最大流)

    题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...

  7. POJ 2315 最小费用最大流

    从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E ...

  8. POJ 2135 最小费用最大流

    题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 D ...

  9. POJ 2195:Going Home(最小费用最大流)

    http://poj.org/problem?id=2195 题意:有一个地图里面有N个人和N个家,每走一格的花费是1,问让这N个人分别到这N个家的最小花费是多少. 思路:通过这个题目学了最小费用最大 ...

随机推荐

  1. .Net自带ChartControl报错:Auto interval does not have proper value

    出现这个错误的原因是我们给ChartControl同时设置了Minimum和Maxmum的值,而这两个值又恰好相等. chart.ChartAreas[0].AxisY.Minimum=min; ch ...

  2. Python3.6全栈开发实例[010]

    10.有字符串 "k:1|k1:2|k2:3|k3:4" 处理成字典 {'k':1,'k1':2....} s = "k:1|k1:2|k2:3|k3:4" d ...

  3. Python实现下载进度

    # encoding:utf-8 import urllib import os def Schedule(a,b,c): ''''' a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 '' ...

  4. 004-JVM指令集(指令码、助记符、功能描述)

    一.JVM指令助记符 1)操作数栈 变量到操作数栈:iload,iload_,lload,lload_,fload,fload_,dload,dload_,aload,aload_ 操作数栈到变量:i ...

  5. TLS and SSL

    SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用加密确保私密性,以实现客户 ...

  6. 剑指offer 面试63题

    面试63题 题目:股票的最大利润 题:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16, ...

  7. Django基础(二)_Ajax、csrf伪站请求

    什么是json? 定义: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子 ...

  8. tar软件安装

    安装tar   ./configure   make   sudo make install

  9. C++中引用编译过的C代码为什么要用“extern c”

    函数经过编译系统的翻译成汇编,函数名对应着汇编标号.  因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main  但是C++中函数名与得到的汇编代号 ...

  10. asp.net 下载图片

    public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...