题目:http://poj.org/problem?id=2195

处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间建立容量为1费用为0的边,然后跑最小费用流即可。

 #include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef pair<int,int> P;
const int maxv = ;
const int inf = 0x3f3f3f3f;
struct edge{
int to,cap,cost,rev;
};
int V;
vector<edge> g[maxv];
int h[maxv];
int dist[maxv];
int prevv[maxv],preve[maxv];
void addedge(int from,int to,int cap,int cost){
edge t;
t.to = to;t.cap = cap;t.cost = cost;t.rev = g[to].size();
g[from].push_back(t);
t.to = from;t.cap = ;t.cost = -cost;t.rev = g[from].size()-;
g[to].push_back(t);
}
int solve(int s,int t,int f){
int res = ;
memset(h,,sizeof(h));
while(f > ){
priority_queue<P,vector<P>,greater<P> > que;
memset(dist,inf,sizeof(dist));
dist[s] = ;
que.push(P(,s));
while(!que.empty()){
P p = que.top();
que.pop();
int v = p.second;
if(dist[v] < p.first)
continue;
for(int i = ;i<g[v].size();i++){
edge &e = g[v][i];
if(e.cap> && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){
dist[e.to] = dist[v]+e.cost+h[v]-h[e.to];
prevv[e.to] = v;
preve[e.to] = i;
que.push(P(dist[e.to],e.to));
}
}
}
if(dist[t] == inf){
return -;
}
for(int i = ;i<=t;i++)
h[i] += dist[i];
int d = f;
for(int i = t;i!=s;i = prevv[i]){
d = min(d,g[prevv[i]][preve[i]].cap);
}
f -= d;
res += d*h[t];
for(int i = t;i!=s;i = prevv[i]){
edge &e = g[prevv[i]][preve[i]];
e.cap -= d;
g[i][e.rev].cap += d;
}
}
return res;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m) && n && m){
vector<P> mm,hh;
char ch;
for(int i = ;i<=n;i++){
for(int j = ;j<=m;j++){
scanf(" %c",&ch);
if(ch == 'm')
mm.push_back(P(i,j));
if(ch == 'H')
hh.push_back(P(i,j));
}
}
for(int i = ;i<=*mm.size()+;i++)
g[i].clear();
for(int i = ;i<mm.size();i++){
for(int j = ;j<hh.size();j++){
addedge(i+,mm.size()+j+,,abs(mm[i].first-hh[j].first)+abs(mm[i].second-hh[j].second));
}
}
int s = ,t = *mm.size()+;
for(int i = ;i<mm.size();i++)
addedge(s,i+,,);
for(int i = ;i<hh.size();i++)
addedge(mm.size()+i+,t,,);
cout << solve(s,t,mm.size()) << endl;
}
}

POJ2195 最小费用流的更多相关文章

  1. POJ2195 Going Home 【最小费用流】+【最佳匹配图二部】

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18169   Accepted: 9268 Descr ...

  2. poj2195&&hdu1533 最小费用流

    这题也可以用km做,我写的代码km比费用流快很多. 最小费用流: #include<stdio.h> #include<string.h> #include<math.h ...

  3. poj-2195(最小费用流)

    题意:给你一个n*m的地图,H代表这个点有一个房子,m代表这个点是一个人,每次h走一步就花费一,问最小花费使得每个人能进入一个房间 代码:建立一个源点和汇点,每个人和源点相连,每个房子和汇点相连,每个 ...

  4. POJ 2195Going Home(网络流之最小费用流)

    题目地址:id=2195">POJ2195 本人职业生涯费用流第一发!!快邀请赛了.决定还是多学点东西.起码碰到简单的网络流要A掉.以后最大流费用流最小割就一块刷. 曾经费用流在我心目 ...

  5. POJ 2195 Going Home 最小费用流

    POJ2195 裸的最小费用流,当然也可以用KM算法解决,但是比较难写. 注意反向边的距离为正向边的相反数(因此要用SPFA) #include<iostream> #include< ...

  6. POJ-2195(最小费用最大流+MCMF算法)

    Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...

  7. HDU 4067 hdoj 4067 Random Maze 最小费用流

    给出n个点,m条边,入口s和出口t,对于每条边有两个值a,b,如果保留这条边需要花费:否则,移除这条边需要花费b. 题目要求用最小费用构造一个有向图满足以下条件: 1.只有一个入口和出口 2.所有路都 ...

  8. POJ 2516:Minimum Cost(最小费用流)

    https://vjudge.net/problem/11079/origin 题意:有N个商店和M个供应商和K种物品,每个商店每种物品有一个需求数,每个供应商每种物品有一个供应量,供应商到商店之间的 ...

  9. POJ-2175 Evacuation Plan 最小费用流、负环判定

    题意:给定一个最小费用流的模型,根据给定的数据判定是否为最优解,如果不为最优解则给出一个比给定更优的解即可.不需要得出最优解. 解法:由给定的数据能够得出一个残图,且这个图满足了最大流的性质,判定一个 ...

随机推荐

  1. koa简介

    资料来源:http://javascript.ruanyifeng.com/nodejs/koa.htmlhttp://koa.bootcss.com/ 以下内容为摘抄,纯属做笔记加深印象.勿喷. 使 ...

  2. Freemarker常用技巧

    1,截取字符串 有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的例子就可以自定义显示的长度 < lt. <= lte. > gt. >= gte < ...

  3. [LeetCode] Implement Trie (Prefix Tree)

    Implement a trie with insert, search, and startsWith methods. Note:You may assume that all inputs ar ...

  4. 86 ipmitools-查看硬件信息工具

    1.简介 IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理具备"智能化"的新一代通用接口标准.用户可以利 ...

  5. 【转】C++之父:C++ 的五个普遍误解

    文章三部分如下: 1.http://blog.jobbole.com/82460/ 2.http://blog.jobbole.com/82461/ 3.http://blog.jobbole.com ...

  6. android 自定义Style初探---ProgressBar

    系统自带的ProgressBar太丑了,所以我决定自定义一个Style. 原来的Style <?xml version="1.0" encoding="utf-8& ...

  7. ubuntu14.04 python3.*连接mysql

    先下载pymysql文件,http://webscripts.softpedia.com/script/Database-Tools/PyMySQL-71606.html 我下载的是:PyMySQL- ...

  8. ES6新特性:使用新方法定义javascript的Class

    ES6中定义类的方式, 就是ES3和ES5中定义类的语法糖,虽然也有些区别,但是整体定义类的方式更加简洁,类的继承更加方便, 如果想对ES6中的继承更加熟悉, 最好了解ES5中原型继承的方式, 博客园 ...

  9. delphi 默认值

    只有全局变量才可以赋初值 i:integer=0;

  10. HttpResponse的使用方法

    HttpResponse的使用方法: HttpRequest类是一个封闭HTTP提交信息的类型,而封闭HTTP输出信息的类型就是HttpResponse类,使用HttpResponse类可以实现三种类 ...