想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410
转载请注明出处:http://blog.csdn.net/wangjian8006
题目大意:图中有n个man和n个home,并且一个人只能住在一个房子里面,房子和人的个数是相等的。并且每个人移动一步的代价是1,怎么使
所有人住在房子里,并且使所有人的代价和最小。
给出一个n×m的图,m表示人,H表示房子,.表示空地,当然房子不算障碍物,可以穿过
解题思路:这是一个费用流的应用,构图如下:
建一个源点指向所有人,容量为1,代价为0
使每个人指向所有的房子,容量为1,代价为人与房子的曼哈顿距离
建一个汇点使所有房子指向它,容量为1,代价为0
然后从源点到汇点求费用流即可。
题目要注意的是,在n×m的这张图上说人的总数不超过100,那么图中节点总数为人+房子+源点+汇点=202
/*
Memory 528K
Time 47MS
*/
#include <iostream>
#include <math.h>
#include <queue>
using namespace std;
#define MAXV 210
#define INF INT_MAX
typedef struct{
int x,y;
}Point;
Point man[MAXV],home[MAXV];
int man_sum,home_sum,mincost;
int cost[MAXV][MAXV],res[MAXV][MAXV],source,sink;
int d[MAXV],parent[MAXV];
void spfa(){
queue <int>q;
int v,i;
bool vis[MAXV];
memset(vis,false,sizeof(vis));
memset(parent,-1,sizeof(parent));
for(i=source;i<=sink;i++) d[i]=INF;
q.push(source);
d[source]=0;
vis[source]=true;
while(!q.empty()){
v=q.front();q.pop();
vis[v]=false;
for(i=source;i<=sink;i++){
if(res[v][i] && d[v]+cost[v][i]<d[i]){
d[i]=d[v]+cost[v][i];
parent[i]=v;
if(!vis[i]){
q.push(i);
vis[i]=true;
}
}
}
}
}
void MCMF(){
int v;
mincost=0;
while(1){
spfa();
if(parent[sink]==-1) break;
v=sink;
while(parent[v]!=-1){
res[parent[v]][v]-=1;
res[v][parent[v]]+=1;
v=parent[v];
}
mincost+=d[sink];
}
}
int main(){
int n,m,i,j;
char s[MAXV];
while(~scanf("%d%d",&n,&m) && n || m){
getchar();
man_sum=home_sum=0;
for(i=1;i<=n;i++){ //记录下人与房子的坐标
gets(s);
for(j=0;j<m;j++){
if(s[j]=='m'){
man[man_sum].x=i;
man[man_sum++].y=j+1;
}
if(s[j]=='H'){
home[home_sum].x=i;
home[home_sum++].y=j+1;
}
}
}
memset(cost,0,sizeof(cost));
memset(res,0,sizeof(res));
source=0;sink=home_sum+man_sum+1;
for(i=0;i<man_sum;i++) res[source][i+1]=1; //源点指向人
for(i=0;i<man_sum;i++){ //人指向房子
for(j=0;j<home_sum;j++){
res[i+1][man_sum+j+1]=1;
cost[i+1][man_sum+j+1]=abs(man[i].x-home[j].x)+abs(man[i].y-home[j].y);
cost[man_sum+j+1][i+1]=-cost[i+1][man_sum+j+1];
}
}
for(i=0;i<home_sum;i++) res[man_sum+i+1][sink]=1; //房子指向汇点
MCMF();
printf("%d\n",mincost);
}
return 0;
}
网上找的一些测试数据:
Input
2 2
.m
H.
5 5
HH..m
.....
.....
.....
mm..H
7 8
...H....
...H....
...H....
mmmHmmmm
...H....
...H....
...H....
20 20
..mm..H..H.H...HHH.m
m.H...H.....H......m
..H...mm.........m..
Hm.m..H.H...H..m....
mH.Hm....mH........H
m............m......
.m..H...........H..m
H.m.H.....H.......m.
...m..Hm.....m.H...H
..H...H....H......mH
..m.m.....m....mm...
..........H.......H.
...mm......m...H....
.....m..H.H......m.m
.H......mm.H.m.m.m.m
HH..........HH..HH..
...m..H........Hm...
....H.....H...mHm...
H...........m......m
....m...H.m.....m...
20 20
...Hm.m.HHH...Hmm...
.H........m.......H.
.......H...H.H......
....HmH.m....Hm..m..
....m..m............
H..H.........m....H.
.m.H...m...mH.m..H..
.mH..H.H......m...m.
...mH...H.......m...
..Hm..H..H......m.m.
..mH...H.m..m.H..HH.
m.m......m........m.
...mH..m.....mH.....
....m.H.H..........H
....H.......H....m.H
H.mH.......m.......H
..............m.HH.H
..H.........m.m.m...
.........mH.....mmm.
...mH.m.m.....H..m..
20 20
H.H.......H....m....
.....m..H......H..H.
...H..............m.
mH..mm..m...H.......
......H....mm.H.....
.mH..mm.....mH.H...H
.........HHH........
......H.H...mm......
.m..m.H...mHmm...HH.
mm..Hmm.H..m...m.H.m
H.Hm.m.m.....m......
...........m.......H
......m......H...m..
....H..........Hm...
.H..H.m....m........
...H....Hm..........
m.H.mHm.m.m...H...H.
.m..........m.......
H......H...HmHHm..H.
..H..m.m...m.H..H...
20 20
.m..m..Hm...........
.m..H.H...m.m.m...H.
........m..mH....H..
..H...........Hm.H.m
H..H.m........mm..m.
H.......m...........
..m..Hmmmm...m..mH..
..H.Hm...H..........
H....m.......mm.....
....m..m.....m.....m
.H.m.H...H.....H....
.m........mm..H...H.
..m.......H.mH..mm.H
.......Hm...HH....H.
...mm....HHH........
..H.m..H........m...
H.........H.........
HH.H.....m.H..Hm....
...H.m...H.Hm.....m.
.H..mH..H..H........
20 20
m.........m.......m.
..m.H....m....m...m.
m...H.m.....H.H.....
.....H.Hm.m...m.....
..mH...H.H.m.H...H..
H....H......m.....m.
..................H.
.m..m.Hm......m..H..
....H..H.m.....H...H
....m.H......m.H...m
....HH...H...H......
..H.....m......H.H..
mmH...mmm.....m.....
..m.......m...mmH...
......H.H..m...Hm..H
HHHm.H.m........H...
...mHm.......m....m.
.....mmH.H..H.....m.
......m..H.....m...H
..HH..m...mH......H.
20 20
m.HHm..HH..m.mHm....
mm..H...............
m...HH.......m.H....
..mH.m.m.......mmH..
H.m........m.......H
m.H....m....m..m...H
....m......mm.......
.m.H....m..H..m..H..
H....m......H.......
...H...........m.m.H
......H...m...H..m..
.mH..H.H.....m......
...m.....m.H...HmH.H
m.......H..H.H..mm.H
...H.........Hm.HH..
.m....H.....m.HHm...
...HHH...........m..
m............H......
.....m..mm.....m....
.....m..H..H..H....H
20 20
....H.............m.
.....HH..mH..Hm..H..
m...........mH....mm
..m..m.H......m....m
.H..........mHH....m
...........m..H.m...
..H...H.........mHm.
......H...........H.
H.....H.....H..m....
H.H..H..m...m..mH.m.
....H...m.H.mHmm.mHm
..mmm...H....m....H.
.........m..m.......
.m.H....Hm....m.....
.....H.......HH...mH
..H..H....m.m.....HH
.Hm.............H...
H...Hm.......H.m.m..
.....m..HH...H.....m
........mHmmH..m....
20 20
.....H.......H...m.m
.m..H.m.m....m......
m.H.HHH..mm.........
H...mH.mH...........
..mHm..m.m......m..m
H.HH.....m...m......
H.mH....H......H....
...mH.m.mHmH...H....
........H.....m.....
..H.......HmH...H...
......m...HH.m......
.H..m.H...H.........
...H...m..m..m...m..
.mH..HH......m...H..
...m....H.H.H.m.....
.........H.m........
..m..H...H......H...
mmH..mH.....m.H..H..
H....mm...H.m...m.mm
......m.............
20 20
....mH..m...m.....m.
..m......mHm...H....
.H.....mHm....H..H..
...HH..........m.m..
..m..mm........m....
...m.....H..........
..mH..H...m.........
...H.H.....m..mH..m.
..H.........Hm.Hm..H
...........H......m.
.............H...mm.
H.m.....Hm.H.m......
....Hm..m..mm.H...m.
...H.H.H......H.Hm..
H.m............m....
..mH.m.m...m..H.m..H
HH.H....m.H..H...m..
.....H.....H...H...H
........mH.HHm.....m
.H.H.....mmH......m.
20 20
.mH........m.mmH..H.
m....H........H..H..
.........Hm.m.m.....
....H.H...m.........
.H....m.............
HH.....H.....H.HH...
mmmmmm.H..m..m......
.Hm.H...H.H..m.H....
.........m..m.mHmHH.
...m.m....m..H.Hm..H
...Hm....H..m....m..
...mH.....m.......m.
.H...HmmH..H.....H..
m.H...m.....mmH....H
.m.H......m...H.....
H........m..Hm......
.......m...........m
...m........m...H...
.........m...H......
HH..H..m...H......H.
0 0
Output
2
10
28
159
149
144
205
135
158
182
150
196
142