poj2195 - Going Home

来源:互联网 发布:数控机床入门编程技术 编辑:程序博客网 时间:2024/06/07 01:35

                                想看更多的解题报告: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 528KTime   47MS*/#include <iostream>#include <math.h>#include <queue>using namespace std;#define MAXV 210#define INF INT_MAXtypedef 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

 

原创粉丝点击