这题也可以用km做,我写的代码km比费用流快很多。

最小费用流:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<stdlib.h>
#define INF 1000000000
using namespace std;
const int maxn = ;
struct Set
{
int x,y;
}mnum[*],hnum[*];
struct node
{
int to;
int v;
int flag;
int cost;
int next;
}edge[maxn*maxn/];
char map[][];
int n,m,cou1,cou2,index,head[maxn],s,t,pre[maxn],fpre[maxn],N,dis[maxn];
int Get(int i,int j)
{
return abs(mnum[i].x-hnum[j].x)+abs(mnum[i].y-hnum[j].y);
}
void add(int x,int y,int v,int cost)
{
edge[index].to=y;
edge[index].v=v;
edge[index].cost=cost;
edge[index].flag=index+;
edge[index].next=head[x];
head[x]=index++;
edge[index].to=x;
edge[index].v=;
edge[index].cost=-cost;
edge[index].flag=index-;
edge[index].next=head[y];
head[y]=index++;
}
void makemap()
{
int i,j;
cou1=cou2=;
for(i=;i<n;i++)
{
for(j=;j<m;j++)
{
if(map[i][j]=='m')
{
mnum[++cou1].x=i;
mnum[cou1].y=j;
}
else if(map[i][j]=='H')
{
hnum[++cou2].x=i;
hnum[cou2].y=j;
}
}
}
index=;
memset(head,-,sizeof(head));
N=cou1+cou2+;
s=;
t=cou1+cou2+;
for(i=;i<=cou1;i++)
add(s,i,,);
for(i=;i<=cou2;i++)
add(i+cou1,t,,);
for(i=;i<=cou1;i++)
{
for(j=;j<=cou2;j++)
{
add(i,j+cou1,,Get(i,j));
}
}
}
bool spfa(int s,int t)
{
int vis[maxn];
queue<int>q;
memset(pre,-,sizeof(pre));
memset(vis,,sizeof(vis));
int i;
for(i=;i<=N;i++)
dis[i]=INF;
vis[s]=;
dis[s]=;
pre[s]=;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=;
for(i=head[u];i!=-;i=edge[i].next)
{
if(edge[i].v&&dis[edge[i].to]>dis[u]+edge[i].cost)
{
dis[edge[i].to]=dis[u]+edge[i].cost;
if(!vis[edge[i].to])
{
vis[edge[i].to]=;
q.push(edge[i].to);
}
pre[edge[i].to]=u;
fpre[edge[i].to]=i;
}
}
}
if(dis[t]>=INF)return false;
return true;
}
int main()
{
int i,j;
while(~scanf("%d%d",&n,&m))
{
if(!n&&!m)break;
for(i=;i<n;i++)
scanf("%s",map[i]);
makemap();
int ans=;
while(spfa(s,t))
{
int minflow=INF;
for(i=t;i!=;i=pre[i])
{
if(minflow>edge[fpre[i]].v)
minflow=edge[fpre[i]].v;
}
ans+=minflow*dis[t];
for(i=t;i!=;i=pre[i])
{
edge[fpre[i]].v-=minflow;
edge[edge[fpre[i]].flag].v+=minflow;
}
}
printf("%d\n",ans);
}
}

km:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define INF 99999999
#define maxn 105
using namespace std;
struct node
{
int x;
int y;
}h[maxn],m[maxn];
char g[maxn][maxn];
int map[maxn][maxn],pr[maxn],pl[maxn],visr[maxn],visl[maxn],match[maxn],slack[maxn];
int col,row;
void init(int x)
{
int i,j;
for(i=;i<=x;i++)
for(j=;j<=x;j++)
if(i==j)map[i][j]=;
else map[i][j]=INF;
}
int dfs(int u,int n)
{
int i,j;
visl[u]=;
for(i=;i<n;i++)
{
if(!visr[i])
{
int val=pl[u]+pr[i]-map[u][i];
if(val==)
{
visr[i]=;
if(match[i]==-||dfs(match[i],n))
{
match[i]=u;
return ;
}
}
if(val>&&val<slack[i])
slack[i]=val;
}
}
return ;
}
int km(int n)
{
int i,j;
memset(pr,,sizeof(pr));
memset(match,-,sizeof(match));
for(i=;i<n;i++)
pl[i]=INF;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
slack[j]=INF;
while()
{
memset(visr,,sizeof(visr));
memset(visl,,sizeof(visl));
if(dfs(i,n))break;
int k=INF;
for(j=;j<n;j++)
{
if(!visr[j]&&slack[j]<k)
k=slack[j];
}
for(j=;j<n;j++)
{
if(visl[j])
pl[j]-=k;
if(visr[j])
pr[j]+=k;
}
}
}
int res=;
for(i=;i<n;i++)
{
res+=map[match[i]][i];
}
return res;
}
int main()
{
int i,j;
while(scanf("%d%d",&row,&col)!=EOF)
{
if(row==&&col==)
break;
int count1=,count2=;
for(i=;i<row;i++)
scanf("%s",g[i]);
for(i=;i<row;i++)
for(j=;j<col;j++)
{
if(g[i][j]=='H')
{
h[count1].x=i;h[count1++].y=j;
}
else if(g[i][j]=='m')
{
m[count2].x=i;m[count2++].y=j;
}
}
init(count1);
for(i=;i<count1;i++)
for(j=;j<count2;j++)
{
map[i][j]=-(abs(h[i].x-m[j].x)+abs(h[i].y-m[j].y));
}
printf("%d\n",-km(count1));
}
}

poj2195&&hdu1533 最小费用流的更多相关文章

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

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

  2. POJ2195&&HDU1533(KB11-D 最小费用最大流)

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23515   Accepted: 11853 Desc ...

  3. POJ2195 最小费用流

    题目:http://poj.org/problem?id=2195 处理出每个人到每个门的曼哈顿距离,分别建立容量为1费用为曼哈顿距离的边,在源点和每个人人之间建立容量为1费用为0的边,在门和汇点之间 ...

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

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

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

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

  6. POJ 2195 Going Home 最小费用流

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

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

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

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

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

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

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

随机推荐

  1. 【转】 解释下浏览器是如何判断元素是否匹配某个 CSS 选择器?

    先产生一个元素集合,然后从后往前判断: 浏览器先产生一个元素集合,这个集合往往由最后一个部分的索引产生(如果没有索引就是所有元素的集合).然后向上匹配,如果不符合上一个部分,就把元素从集合中删除,直到 ...

  2. 机器学习中的隐马尔科夫模型(HMM)详解

    机器学习中的隐马尔科夫模型(HMM)详解 在之前介绍贝叶斯网络的博文中,我们已经讨论过概率图模型(PGM)的概念了.Russell等在文献[1]中指出:"在统计学中,图模型这个术语指包含贝叶 ...

  3. CentOS7.4 安装JDK 步骤

    1.先在官网下载jdk1.8的压缩文件 2.用putty将压缩文件拷到home目录下 3.新建一个/home/jdk1.8目录 :  mkdir  /home/jdk1.8 4.将压缩文件解压到hom ...

  4. eclipse环境问题-java版本不兼容

    有时候虽然我们给项目配置的jdk版本.项目编译版本都一直,但是还是会报如下的错误: Description Resource Path Location Type Java compiler leve ...

  5. 通过Angular-cli创建新项目

    前提:已经安装Git 方法一:(推荐) 1.在需要创建项目的文件夹中右键打开 Git Bush Here ,在此输入  ng new ‘项目名’  --skip-install   (如下my-app ...

  6. PAT甲级——A1016 Phone Bills

    A long-distance telephone company charges its customers by the following rules: Making a long-distan ...

  7. Shell脚本编程中截取字符串方法

    例如: 假设变量var=http://www.baidu.com/111.png 1.#号截取(删左留右) echo ${var#*//} # 号是运算符,*// 表示从左边开始删除第一个 // 号及 ...

  8. Django项目:CRM(客户关系管理系统)--35--27PerfectCRM实现King_admin编辑复选框

    #admin.py # ————————01PerfectCRM基本配置ADMIN———————— from django.contrib import admin # Register your m ...

  9. 移动端H5适配流程

    (一) 由于手机生产商越来越多,不同手机的硬件尺寸又不尽相同,这就给我们的设计适配造成很大困扰.但我们可以围绕从基准分辨率设计,上下进行兼容适配的原则来进行快捷操作.以IOS阵营为例: 图注:移动适配 ...

  10. 惊!VUE居然数据不能驱动视图?$set详细教程

    众所周知.VUE最大的优点就是数据驱动视图.当数据发生改变时,会监听到变化,后渲染到页面上.那么为什么当我们在修改data中声明的数组或对象时.VUE并没有监听到变化呢?这个我也不知道.我们可以后续再 ...